fix: select musl JDK artifacts on Alpine for five distributions (#1220)

On Alpine, `getPlatformOption()` returned the glibc platform key for
Dragonwell, Corretto, Zulu, Liberica and Liberica NIK, so the action
resolved and installed a glibc JDK that cannot run under musl.

Add a shared `isAlpineLinux()` helper and use it to select each vendor's
musl artifacts:

| distribution | glibc         | musl           |
| ------------ | ------------- | -------------- |
| Dragonwell   | `linux`       | `alpine-linux` |
| Corretto     | `linux`       | `alpine`       |
| Zulu         | `linux_glibc` | `linux_musl`   |
| Liberica     | `linux`       | `linux-musl`   |
| Liberica NIK | `linux`       | `linux-musl`   |

Each key was verified against the vendor's live metadata API or manifest.

There is deliberately no silent fallback to glibc when a vendor has no
musl build for the requested version or architecture: the existing "could
not find a version that satisfies" error fires instead. This matches the
behaviour Temurin and SapMachine already have, and a glibc JDK would not
run on musl anyway.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 74248bb0-72af-41d8-b85d-b0f5836e68db
This commit is contained in:
Bruno Borges
2026-08-05 12:54:41 -04:00
committed by GitHub
parent d0e61fe743
commit 4fbd0bd19d
15 changed files with 286 additions and 31 deletions
@@ -8,6 +8,7 @@ import {
beforeAll,
afterAll
} from '@jest/globals';
import fs from 'fs';
import type {IZuluVersions} from '../../src/distributions/zulu/models.js';
import {HttpClient} from '@actions/http-client';
import os from 'os';
@@ -346,3 +347,50 @@ describe('findPackageForDownload', () => {
).rejects.toThrow(/No matching version found for SemVer/);
});
});
describe('Zulu getPlatformOption libc selection', () => {
const originalPlatform = Object.getOwnPropertyDescriptor(
process,
'platform'
) as PropertyDescriptor;
const setPlatform = (platform: NodeJS.Platform) =>
Object.defineProperty(process, 'platform', {
...originalPlatform,
value: platform
});
const distribution = new ZuluDistribution({
version: '21',
architecture: 'x64',
packageType: 'jdk',
checkLatest: false
});
afterEach(() => {
Object.defineProperty(process, 'platform', originalPlatform);
jest.restoreAllMocks();
});
it('selects the musl artifacts on Alpine', () => {
setPlatform('linux');
jest.spyOn(fs, 'existsSync').mockReturnValue(true);
expect(distribution['getPlatformOption']()).toBe('linux_musl');
});
it('selects the glibc artifacts on other Linux runners', () => {
setPlatform('linux');
jest.spyOn(fs, 'existsSync').mockReturnValue(false);
expect(distribution['getPlatformOption']()).toBe('linux_glibc');
});
it('does not probe for Alpine off Linux', () => {
setPlatform('win32');
const existsSync = jest.spyOn(fs, 'existsSync');
expect(distribution['getPlatformOption']()).toBe('windows');
expect(existsSync).not.toHaveBeenCalled();
});
});