1+ name : Release PR Validation
2+ run-name : ' [Release PR] Validate ${{ github.head_ref }}'
3+
4+ on :
5+ pull_request :
6+ branches :
7+ - main
8+
9+ jobs :
10+ validate-release-version :
11+ name : Validate release package version
12+ if : startsWith(github.head_ref, 'release/')
13+ runs-on : ubuntu-latest
14+
15+ steps :
16+ - name : Check out Git repository
17+ uses : actions/checkout@v4
18+
19+ - name : Set up Node.js
20+ uses : actions/setup-node@v4
21+ with :
22+ node-version : 18
23+
24+ - name : Derive release version from PR branch
25+ id : release-version
26+ shell : bash
27+ run : |
28+ release_version="${GITHUB_HEAD_REF#release/}"
29+ release_version="${release_version#v}"
30+
31+ if [[ -z "$release_version" ]]; then
32+ echo "Unable to derive a release version from branch '$GITHUB_HEAD_REF'." >&2
33+ exit 1
34+ fi
35+
36+ echo "release_version=$release_version" >> "$GITHUB_OUTPUT"
37+
38+ - name : Validate package versions
39+ env :
40+ RELEASE_VERSION : ${{ steps.release-version.outputs.release_version }}
41+ run : |
42+ node <<'NODE'
43+ const fs = require( 'fs' );
44+
45+ const releaseVersion = process.env.RELEASE_VERSION;
46+ const packageJson = JSON.parse( fs.readFileSync( 'package.json', 'utf8' ) );
47+ const packageLock = JSON.parse( fs.readFileSync( 'package-lock.json', 'utf8' ) );
48+
49+ const checks = [
50+ {
51+ label: 'package.json',
52+ actual: packageJson.version,
53+ },
54+ {
55+ label: 'package-lock.json',
56+ actual: packageLock.version,
57+ },
58+ ];
59+
60+ const mismatches = checks.filter( ( check ) => check.actual !== releaseVersion );
61+
62+ if ( mismatches.length > 0 ) {
63+ const mismatchLines = mismatches.map(
64+ ( mismatch ) =>
65+ `- ${ mismatch.label }: ${ mismatch.actual ?? 'missing' }`
66+ );
67+
68+ console.error(
69+ '::error title=Release PR version mismatch::' +
70+ `Release branch ${ process.env.GITHUB_HEAD_REF } expects version ${ releaseVersion }.`
71+ );
72+ console.error( 'Release version validation failed.' );
73+ console.error( `Expected from branch: ${ releaseVersion }` );
74+ console.error( 'Found:' );
75+ console.error( mismatchLines.join( '\n' ) );
76+ console.error(
77+ 'Update package.json and regenerate package-lock.json before merging this release PR.'
78+ );
79+
80+ process.exit( 1 );
81+ }
82+
83+ console.log( `Validated release version ${ releaseVersion } in package.json and package-lock.json.` );
84+ NODE
0 commit comments