Skip to content

Commit 2b0449c

Browse files
committed
Generate test matrix dynamically
1 parent 06e5474 commit 2b0449c

File tree

2 files changed

+114
-7
lines changed

2 files changed

+114
-7
lines changed

.github/workflows/test.yaml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ on:
99
jobs:
1010
build:
1111
runs-on: ubuntu-latest
12+
outputs:
13+
matrix: ${{ steps.generate-test-matrix.outputs.matrix }}
1214
steps:
1315
- name: Check out repository
1416
uses: actions/checkout@v3
@@ -38,18 +40,20 @@ jobs:
3840
path: out
3941
key: pack-${{ github.run_id }}
4042

43+
- name: Generate test matrix
44+
id: generate-test-matrix
45+
env:
46+
TEST_CONSTRAINTS: |
47+
["~6.4.0", "~6.3.0"]
48+
run: |
49+
echo "matrix=$(node tools/generate_test_matrix.js)" >> $GITHUB_OUTPUT
50+
4151
integration:
4252
needs: build
4353
runs-on: ubuntu-latest
4454
strategy:
4555
matrix:
46-
include:
47-
- lens-ref: HEAD
48-
node-version: 16
49-
- lens-ref: v6.4.7
50-
node-version: 16
51-
- lens-ref: v6.3.0
52-
node-version: 16
56+
include: ${{ fromJSON(needs.build.outputs.matrix) }}
5357
steps:
5458
- name: Check out repository
5559
uses: actions/checkout@v3

tools/generate_test_matrix.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/* eslint-env es6 */
2+
3+
const https = require('https');
4+
const semver = require('semver');
5+
6+
async function nodeVersionFromPackageJson(url) {
7+
return new Promise((resolve) => {
8+
https.get(url, (resp) => {
9+
let data = '';
10+
resp.on('data', (chunk) => {
11+
data += chunk;
12+
});
13+
14+
resp.on('end', () => {
15+
if (resp.statusCode >= 400) {
16+
resolve(undefined);
17+
} else {
18+
let packagejson = JSON.parse(data);
19+
resolve(packagejson.engines?.node);
20+
}
21+
});
22+
}).on('error', (e) => {
23+
console.error(e);
24+
});
25+
});
26+
}
27+
28+
async function nodeVersionFromOldTag(tag) {
29+
let url = 'https://raw.githubusercontent.com/lensapp/lens/refs/tags/' + tag + '/package.json';
30+
return nodeVersionFromPackageJson(url);
31+
}
32+
33+
async function nodeVersionFromNewTag(tag) {
34+
let url = 'https://raw.githubusercontent.com/lensapp/lens/refs/tags/' + tag + '/packages/open-lens/package.json'
35+
return nodeVersionFromPackageJson(url);
36+
}
37+
38+
async function nodeVersionFromHead() {
39+
let url = 'https://raw.githubusercontent.com/lensapp/lens/HEAD/packages/open-lens/package.json'
40+
return nodeVersionFromPackageJson(url);
41+
}
42+
43+
async function nodeVersionFromRef(tag) {
44+
return new Promise((resolve) => {
45+
if (tag === 'HEAD') {
46+
resolve(nodeVersionFromHead());
47+
} else {
48+
nodeVersionFromNewTag(tag).then((newValue) => {
49+
if (newValue == undefined) {
50+
resolve(nodeVersionFromOldTag(tag));
51+
} else {
52+
resolve(newValue);
53+
}
54+
});
55+
}
56+
});
57+
}
58+
59+
async function getTags() {
60+
const options = {
61+
hostname: 'api.github.com',
62+
path: '/repos/lensapp/lens/git/refs/tags',
63+
headers: {
64+
'User-Agent': 'GenerateTestMatrixFromTags/1.0',
65+
'Accept': 'application/vnd.github+json'
66+
}
67+
};
68+
69+
return new Promise((resolve) => {
70+
https.get(options, (resp) => {
71+
let data = '';
72+
73+
resp.on('data', (chunk) => {
74+
data += chunk;
75+
});
76+
77+
resp.on('end', () => {
78+
let tags = JSON.parse(data).map((tag) => tag.ref).map((ref) => ref.replace('refs/tags/', ''));
79+
resolve(tags);
80+
});
81+
}).on('error', (e) => {
82+
console.error(e);
83+
});
84+
});
85+
}
86+
87+
(async function() {
88+
let testConstraints = JSON.parse(process.env.TEST_CONSTRAINTS);
89+
testConstraints.unshift('HEAD');
90+
let tags = await getTags();
91+
92+
let matrix = await Promise.all(testConstraints.map((constraint) => {
93+
return new Promise((resolve) => {
94+
let tag = constraint === 'HEAD' ? 'HEAD' : semver.maxSatisfying(tags, constraint);
95+
let entry = { 'lens-ref': tag };
96+
nodeVersionFromRef(tag).then((nodeEngineVersion) => {
97+
entry['node-version'] = nodeEngineVersion;
98+
resolve(entry);
99+
});
100+
});
101+
}));
102+
process.stdout.write(JSON.stringify(matrix));
103+
})();

0 commit comments

Comments
 (0)