Prefer Zulu 4-segment hotfix builds when resolving version ranges (#1… · lonecalvary78/actions-setup-java@74920aa · GitHub
Skip to content

Commit 74920aa

Browse files
brunoborgesCopilot
andauthored
Prefer Zulu 4-segment hotfix builds when resolving version ranges (actions#1278)
Azul reports hotfix releases like 25.0.4.1 as java_version=[25,0,4,1] with openjdk_build_number=1 (SDKMAN '25.0.4+1.1'). Sorting candidates via semver.compareBuild ranked 25.0.4+7 above 25.0.4+1.1, so ranges such as '25' resolved to the older build. Compare java_version, build number and distro_version numerically instead. Fixes: actions#1275 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent a78ec39 commit 74920aa

4 files changed

Lines changed: 117 additions & 26 deletions

File tree

‎__tests__/distributors/zulu-installer.test.ts‎

Lines changed: 63 additions & 0 deletions

‎__tests__/util.test.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ describe('getVersionFromFileContent', () => {
277277
['java=17.0.9-graalce', '17.0.9', 'graalvm'],
278278
['java=11.0.25-librca', '11.0.25', 'liberica'],
279279
['java=25.0.4+1.1-librca', '25.0.4+1.1', 'liberica'],
280+
['java=25.0.4+1.1-zulu', '25.0.4+1.1', 'zulu'],
280281
['java=11.0.25-ms', '11.0.25', 'microsoft'],
281282
['java=21.0.5-oracle', '21.0.5', 'oracle'],
282283
['java=11.0.25-sapmchn', '11.0.25', 'sapmachine'],

‎dist/setup/978.index.js‎

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,26 @@ export const modules = {
1313
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
1414
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9896);
1515
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_2__);
16-
/* harmony import */ var semver__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2088);
17-
/* harmony import */ var semver__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(semver__WEBPACK_IMPORTED_MODULE_3__);
18-
/* harmony import */ var _base_installer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6242);
19-
/* harmony import */ var _platform_types_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7444);
20-
/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4527);
16+
/* harmony import */ var _base_installer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6242);
17+
/* harmony import */ var _platform_types_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7444);
18+
/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4527);
2119

2220

2321

2422

2523

2624

27-
28-
class ZuluDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_4__/* .JavaBase */ .O {
25+
function compareNumberArrays(a, b) {
26+
const length = Math.max(a.length, b.length);
27+
for (let i = 0; i < length; i++) {
28+
const diff = (a[i] ?? 0) - (b[i] ?? 0);
29+
if (diff !== 0) {
30+
return diff;
31+
}
32+
}
33+
return 0;
34+
}
35+
class ZuluDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_3__/* .JavaBase */ .O {
2936
constructor(installerOptions) {
3037
super('Zulu', installerOptions);
3138
}
@@ -39,19 +46,24 @@ class ZuluDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_4__/*
3946
? [...item.java_version, item.openjdk_build_number]
4047
: item.java_version;
4148
return {
42-
version: (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .convertVersionToSemver */ .ZY)(javaVersion),
49+
version: (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .convertVersionToSemver */ .ZY)(javaVersion),
4350
url: item.download_url,
44-
zuluVersion: (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .convertVersionToSemver */ .ZY)(item.distro_version),
51+
javaVersion: item.java_version,
52+
buildNumber: item.openjdk_build_number ?? 0,
53+
distroVersion: item.distro_version,
4554
packageUuid: item.package_uuid
4655
};
4756
});
4857
const satisfiedVersions = availableVersions
49-
.filter(item => (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .isVersionSatisfies */ .y)(version, item.version))
58+
.filter(item => (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .isVersionSatisfies */ .y)(version, item.version))
5059
.sort((a, b) => {
51-
// Azul provides two versions: java_version and distro_version
52-
// we should sort by both fields by descending
53-
return (-semver__WEBPACK_IMPORTED_MODULE_3___default().compareBuild(a.version, b.version) ||
54-
-semver__WEBPACK_IMPORTED_MODULE_3___default().compareBuild(a.zuluVersion, b.zuluVersion));
60+
// Compare numerically rather than via semver build metadata: Azul
61+
// hotfix releases carry a 4th java_version segment (e.g. 25.0.4.1+1,
62+
// rendered as '25.0.4+1.1') that must rank above 25.0.4+7, whereas
63+
// semver.compareBuild would order the build identifiers '7' > '1'.
64+
return (-compareNumberArrays(a.javaVersion, b.javaVersion) ||
65+
b.buildNumber - a.buildNumber ||
66+
-compareNumberArrays(a.distroVersion, b.distroVersion));
5567
})
5668
.map((item) => ({
5769
version: item.version,
@@ -85,21 +97,21 @@ class ZuluDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_4__/*
8597
_actions_core__WEBPACK_IMPORTED_MODULE_0__/* .info */ .pq(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
8698
let javaArchivePath = await this.downloadAndVerify(javaRelease);
8799
_actions_core__WEBPACK_IMPORTED_MODULE_0__/* .info */ .pq(`Extracting Java archive...`);
88-
const extension = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .getDownloadArchiveExtension */ .ag)();
100+
const extension = (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .getDownloadArchiveExtension */ .ag)();
89101
if (process.platform === 'win32') {
90-
javaArchivePath = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .renameWinArchive */ .n2)(javaArchivePath);
102+
javaArchivePath = (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .renameWinArchive */ .n2)(javaArchivePath);
91103
}
92-
const extractedJavaPath = await (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .extractJdkFile */ .PE)(javaArchivePath, extension);
104+
const extractedJavaPath = await (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .extractJdkFile */ .PE)(javaArchivePath, extension);
93105
const archiveName = fs__WEBPACK_IMPORTED_MODULE_2___default().readdirSync(extractedJavaPath)[0];
94106
const archivePath = path__WEBPACK_IMPORTED_MODULE_1___default().join(extractedJavaPath, archiveName);
95-
const javaPath = await (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .cacheJdkDir */ .Vj)(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
107+
const javaPath = await (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .cacheJdkDir */ .Vj)(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
96108
return { version: javaRelease.version, path: javaPath };
97109
}
98110
async getAvailableVersions() {
99111
const arch = this.getArchitectureOptions();
100112
const [bundleType, features] = this.packageType.split('+');
101113
const platform = this.getPlatformOption();
102-
const extension = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .getDownloadArchiveExtension */ .ag)();
114+
const extension = (0,_util_js__WEBPACK_IMPORTED_MODULE_5__/* .getDownloadArchiveExtension */ .ag)();
103115
const javafx = features?.includes('fx') ?? false;
104116
const crac = features?.includes('crac') ?? false;
105117
const releaseStatus = this.stable ? 'ga' : 'ea';
@@ -185,7 +197,7 @@ class ZuluDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_4__/*
185197
// The new Metadata API's "linux" value returns both glibc and musl
186198
// packages, so target the libc the runner actually has. A glibc JDK
187199
// cannot run on Alpine.
188-
return (0,_platform_types_js__WEBPACK_IMPORTED_MODULE_5__/* .isAlpineLinux */ .G6)() ? 'linux_musl' : 'linux_glibc';
200+
return (0,_platform_types_js__WEBPACK_IMPORTED_MODULE_4__/* .isAlpineLinux */ .G6)() ? 'linux_musl' : 'linux_glibc';
189201
default:
190202
return process.platform;
191203
}

‎src/distributions/zulu/installer.ts‎

Lines changed: 21 additions & 6 deletions

0 commit comments

Comments
 (0)