Skip to content

Commit 60a92c7

Browse files
authored
chore: implement CI job to validate Release Please's config and manifest (open-telemetry#1207)
1 parent a00f390 commit 60a92c7

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Validate Release Please Config
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
9+
jobs:
10+
rp-validate:
11+
runs-on: ubuntu-latest
12+
container:
13+
image: node:14
14+
steps:
15+
- name: Checkout
16+
uses: actions/checkout@v3
17+
18+
- name: Install lerna
19+
run: npm install -g lerna
20+
21+
- name: Ensure Release Please Config and Manifest are in sync with the repository
22+
run: node scripts/check-release-please.mjs

scripts/check-release-please.mjs

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { strict as assert } from 'assert';
2+
import * as childProcess from 'child_process';
3+
import path from 'path';
4+
import { readFileSync } from 'fs';
5+
6+
/*
7+
Enumerates through
8+
9+
- lerna packages,
10+
- release please's manifest, and
11+
- release please's config, and
12+
13+
makes sure all those lists are in sync. If not, guides you to do the correct thing
14+
*/
15+
16+
const errors = [];
17+
const logErrorIf = (condition, errorMessage) => {
18+
if (condition) {
19+
errors.push(errorMessage);
20+
}
21+
};
22+
const PROJECT_ROOT = process.cwd();
23+
const readJson = (filePath) => {
24+
return JSON.parse(readFileSync(filePath));
25+
};
26+
const getProcessOutput = (cmd, args) => {
27+
const result = childProcess.spawnSync(cmd, args);
28+
assert(!result.error, result.error);
29+
return result.stdout.toString('utf8');
30+
}
31+
32+
const lernaList = JSON.parse(
33+
getProcessOutput('lerna', ['list', '--json'])
34+
);
35+
const manifest = readJson('.release-please-manifest.json');
36+
const config = readJson('release-please-config.json');
37+
38+
const lernaPackages = new Set(
39+
lernaList.map((pkg) => {
40+
return path.relative(PROJECT_ROOT, pkg.location);
41+
})
42+
);
43+
const manifestPackages = new Set(Object.keys(manifest));
44+
const configPackages = new Set(Object.keys(config.packages));
45+
46+
console.log('lerna packages', lernaPackages);
47+
console.log('manifest packages', manifestPackages);
48+
console.log('config packages', configPackages);
49+
50+
lernaPackages.forEach((relativeLocation) => {
51+
logErrorIf(
52+
!manifestPackages.has(relativeLocation),
53+
`Could not find ${relativeLocation} in .release-please-manifest.json. If you are adding a new package. Add following
54+
"${relativeLocation}": "0.0.1",`);
55+
56+
logErrorIf(
57+
!configPackages.has(relativeLocation),
58+
`Could not find ${relativeLocation} in release-please-config.json. If you are adding a new package. Add following to "packages" object
59+
"${relativeLocation}": {},`);
60+
61+
});
62+
63+
manifestPackages.forEach((relativeLocation) => {
64+
logErrorIf(
65+
!lernaPackages.has(relativeLocation),
66+
`Extraneous path ${relativeLocation} in .release-please-manifest.json`
67+
);
68+
});
69+
70+
configPackages.forEach((relativeLocation) => {
71+
logErrorIf(
72+
!lernaPackages.has(relativeLocation),
73+
`Extraneous path ${relativeLocation} in release-please-config.json`
74+
);
75+
});
76+
77+
if (errors.length) {
78+
console.error('Errors occured:\n');
79+
console.error(errors.join('\n\n'));
80+
process.exit(1);
81+
} else {
82+
console.error('OK');
83+
}

0 commit comments

Comments
 (0)