From b78fb210e54252079362cb0ae132314d81e12fec Mon Sep 17 00:00:00 2001 From: John Downey Date: Mon, 1 Jun 2026 11:39:24 -0500 Subject: [PATCH] Fix arm64 Linux runner OS detection --- dist/index.js | 10 ++++++++-- src/setup-beam.js | 10 ++++++++-- test/setup-beam.test.js | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/dist/index.js b/dist/index.js index cd1fe4a5..f1b10b11 100644 --- a/dist/index.js +++ b/dist/index.js @@ -55370,10 +55370,15 @@ function getRunnerOSVersion() { ubuntu18: 'ubuntu-18.04', ubuntu20: 'ubuntu-20.04', } - const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS] + // actions/runner-images PR #14113 gave arm64 images distinct ImageOS values + // (e.g. ImageOS=ubuntu24-arm64 instead of ubuntu24). The CPU architecture is + // resolved separately via RUNNER_ARCH, so the arm64 variants map to the same + // OS container as their x86 counterparts. + const imageOS = (process.env.ImageOS || '').replace(/-arm64$/, '') + const containerFromEnvImageOS = ImageOSToContainer[imageOS] if (!containerFromEnvImageOS) { const deprecatedContainerFromEnvImageOS = - deprecatedImageOSToContainer[process.env.ImageOS] + deprecatedImageOSToContainer[imageOS] if (deprecatedContainerFromEnvImageOS) { warning( `You are using deprecated ImageOS ${deprecatedContainerFromEnvImageOS}. ` + @@ -55993,6 +55998,7 @@ function debugLoggingEnabled() { getGleamVersion, getOTPVersion, getRebar3Version, + getRunnerOSVersion, getVersionFromSpec, githubAMDRunnerArchs, githubARMRunnerArchs, diff --git a/src/setup-beam.js b/src/setup-beam.js index 966a4b46..c7eaf0f7 100644 --- a/src/setup-beam.js +++ b/src/setup-beam.js @@ -676,10 +676,15 @@ function getRunnerOSVersion() { ubuntu18: 'ubuntu-18.04', ubuntu20: 'ubuntu-20.04', } - const containerFromEnvImageOS = ImageOSToContainer[process.env.ImageOS] + // actions/runner-images PR #14113 gave arm64 images distinct ImageOS values + // (e.g. ImageOS=ubuntu24-arm64 instead of ubuntu24). The CPU architecture is + // resolved separately via RUNNER_ARCH, so the arm64 variants map to the same + // OS container as their x86 counterparts. + const imageOS = (process.env.ImageOS || '').replace(/-arm64$/, '') + const containerFromEnvImageOS = ImageOSToContainer[imageOS] if (!containerFromEnvImageOS) { const deprecatedContainerFromEnvImageOS = - deprecatedImageOSToContainer[process.env.ImageOS] + deprecatedImageOSToContainer[imageOS] if (deprecatedContainerFromEnvImageOS) { core.warning( `You are using deprecated ImageOS ${deprecatedContainerFromEnvImageOS}. ` + @@ -1299,6 +1304,7 @@ export default { getGleamVersion, getOTPVersion, getRebar3Version, + getRunnerOSVersion, getVersionFromSpec, githubAMDRunnerArchs, githubARMRunnerArchs, diff --git a/test/setup-beam.test.js b/test/setup-beam.test.js index 35d8a690..161a6ff2 100644 --- a/test/setup-beam.test.js +++ b/test/setup-beam.test.js @@ -587,6 +587,44 @@ describe('OTP arch-specific install', () => { }) }) +describe('.getRunnerOSVersion(_)', () => { + it('maps x86 ImageOS values to their container', async () => { + const previousImageOS = process.env.ImageOS + + process.env.ImageOS = 'ubuntu22' + assert.strictEqual(setupBeam.getRunnerOSVersion(), 'ubuntu-22.04') + + process.env.ImageOS = 'ubuntu24' + assert.strictEqual(setupBeam.getRunnerOSVersion(), 'ubuntu-24.04') + + process.env.ImageOS = previousImageOS + }) + + it('maps arm64 ImageOS variants to the same container as x86', async () => { + const previousImageOS = process.env.ImageOS + + process.env.ImageOS = 'ubuntu22-arm64' + assert.strictEqual(setupBeam.getRunnerOSVersion(), 'ubuntu-22.04') + + process.env.ImageOS = 'ubuntu24-arm64' + assert.strictEqual(setupBeam.getRunnerOSVersion(), 'ubuntu-24.04') + + process.env.ImageOS = previousImageOS + }) + + it('throws for genuinely unknown ImageOS values', async () => { + const previousImageOS = process.env.ImageOS + + process.env.ImageOS = 'plan9' + assert.throws( + () => setupBeam.getRunnerOSVersion(), + /Tried to map a target OS/, + ) + + process.env.ImageOS = previousImageOS + }) +}) + describe('.getOTPVersion(_) - Elixir', () => { let got let expected