Skip to content

Commit c0debf2

Browse files
committed
ci(rules): require jdk21 and enforce java version check
1 parent 61add88 commit c0debf2

2 files changed

Lines changed: 52 additions & 7 deletions

File tree

.github/workflows/ci.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ jobs:
2626
node-version: 20
2727
cache: npm
2828

29+
- name: Setup Java
30+
uses: actions/setup-java@v4
31+
with:
32+
distribution: temurin
33+
java-version: "21"
34+
2935
- name: Install dependencies
3036
run: npm ci
3137

test/rules/check-java.mjs

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,56 @@
11
import { spawnSync } from 'node:child_process';
22

3-
const result = spawnSync('java', ['-version'], { encoding: 'utf-8' });
4-
if (result.status === 0) {
5-
process.exit(0);
3+
const MIN_JAVA_MAJOR = 21;
4+
5+
function extractMajorVersion(output) {
6+
const match = output.match(/version\s+"([^"]+)"/i);
7+
if (!match) {
8+
return null;
9+
}
10+
11+
const versionString = match[1];
12+
const firstSegment = versionString.split('.')[0];
13+
if (firstSegment === '1') {
14+
const legacySegment = versionString.split('.')[1];
15+
if (!legacySegment) {
16+
return null;
17+
}
18+
const parsedLegacy = Number.parseInt(legacySegment, 10);
19+
return Number.isNaN(parsedLegacy) ? null : parsedLegacy;
20+
}
21+
22+
const parsed = Number.parseInt(firstSegment, 10);
23+
return Number.isNaN(parsed) ? null : parsed;
624
}
725

26+
const result = spawnSync('java', ['-version'], { encoding: 'utf-8' });
827
const stderr = result.stderr ? result.stderr.trim() : '';
928
const stdout = result.stdout ? result.stdout.trim() : '';
1029
const details = stderr.length > 0 ? stderr : stdout;
1130

12-
console.error('Java runtime is required for Firestore Emulator tests.');
13-
if (details.length > 0) {
31+
if (result.status !== 0) {
32+
console.error('Java runtime is required for Firestore Emulator tests.');
33+
if (details.length > 0) {
34+
console.error(details);
35+
}
36+
console.error(`Install Java ${MIN_JAVA_MAJOR}+ and ensure \`java\` is available in PATH, then rerun \`npm run rules:test\`.`);
37+
process.exit(1);
38+
}
39+
40+
const majorVersion = extractMajorVersion(details);
41+
if (majorVersion === null) {
42+
console.error('Unable to detect Java major version from `java -version` output.');
1443
console.error(details);
44+
console.error(`Install Java ${MIN_JAVA_MAJOR}+ and ensure \`java\` is available in PATH, then rerun \`npm run rules:test\`.`);
45+
process.exit(1);
1546
}
16-
console.error('Install Java 17+ and ensure `java` is available in PATH, then rerun `npm run rules:test`.');
17-
process.exit(1);
47+
48+
if (majorVersion < MIN_JAVA_MAJOR) {
49+
console.error(`Java ${MIN_JAVA_MAJOR}+ is required for Firestore Emulator tests.`);
50+
console.error(`Detected Java major version: ${majorVersion}`);
51+
console.error(details);
52+
console.error(`Install Java ${MIN_JAVA_MAJOR}+ and ensure \`java\` is available in PATH, then rerun \`npm run rules:test\`.`);
53+
process.exit(1);
54+
}
55+
56+
process.exit(0);

0 commit comments

Comments
 (0)