From 3c7a629527941a8a1e09ca6db4f95a5d9cad6c64 Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Sat, 14 Nov 2026 00:10:04 -0500 Subject: [PATCH] Fix Oracle JDK 21 e2e and warn on archived GA fallback (#1327) Oracle no longer serves JDK 21 under /java/21/latest/, so a major-only request falls back to the archived 21 GA build and reports version 21. The e2e check required a concrete version for floating Oracle requests, so the oracle 21 jobs failed. Move floating Oracle e2e coverage to JDK 25 and keep a single oracle 21 job that exercises the archive fallback without the concrete-version requirement. Warn when a major-only request falls back from /latest/ to the archived GA release, since that build may lack security updates. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/workflows/e2e-versions.yml | 10 +++++++--- __tests__/distributors/oracle-installer.test.ts | 13 +++++++++++++ dist/setup/182.index.js | 7 +++++++ src/distributions/oracle/installer.ts | 10 ++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index dc2ebbc8..7e7f339d 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -80,10 +80,14 @@ jobs: version: 25 - distribution: oracle os: macos-15-intel - version: 21 + version: 25 - distribution: oracle os: windows-latest - version: 21 + version: 25 + - distribution: oracle + os: ubuntu-latest + version: 25 + # Oracle no longer publishes JDK 21 under /latest, so a major-only request resolves to the archived GA build. - distribution: oracle os: ubuntu-latest version: 21 @@ -127,7 +131,7 @@ jobs: JAVA_VERSION: ${{ matrix.version }} JAVA_PATH: ${{ steps.setup-java.outputs.path }} SETUP_JAVA_VERSION: ${{ steps.setup-java.outputs.version }} - REQUIRE_CONCRETE_VERSION: ${{ (matrix.distribution == 'oracle' || matrix.distribution == 'graalvm') && !contains(matrix.version, '.') && !contains(matrix.version, '-ea') }} + REQUIRE_CONCRETE_VERSION: ${{ ((matrix.distribution == 'oracle' && matrix.version != 21) || matrix.distribution == 'graalvm') && !contains(matrix.version, '.') && !contains(matrix.version, '-ea') }} run: bash __tests__/verify-java.sh "$JAVA_VERSION" "$JAVA_PATH" "$SETUP_JAVA_VERSION" "$REQUIRE_CONCRETE_VERSION" shell: bash diff --git a/__tests__/distributors/oracle-installer.test.ts b/__tests__/distributors/oracle-installer.test.ts index 429b4f2e..36d4e979 100644 --- a/__tests__/distributors/oracle-installer.test.ts +++ b/__tests__/distributors/oracle-installer.test.ts @@ -185,6 +185,19 @@ describe('findPackageForDownload', () => { expect(spyHttpClientGet).toHaveBeenCalledTimes(1); }); + it('warns when a major-only request falls back to the archived GA release', async () => { + spyHttpClient = jest.spyOn(HttpClient.prototype, 'head'); + spyHttpClient + .mockResolvedValueOnce({message: {statusCode: 404}}) + .mockResolvedValueOnce({message: {statusCode: 200}}); + + await distribution['findPackageForDownload']('21'); + + expect(core.warning).toHaveBeenCalledWith( + 'Oracle JDK 21 is no longer available from the latest endpoint. Falling back to its archived GA release, which may not include security updates.' + ); + }); + it('always resolves major-only requests remotely', () => { expect(distribution['requiresRemoteResolution']()).toBe(true); const exactDistribution = new OracleDistribution({ diff --git a/dist/setup/182.index.js b/dist/setup/182.index.js index cfb75b88..c1991c70 100644 --- a/dist/setup/182.index.js +++ b/dist/setup/182.index.js @@ -82,6 +82,7 @@ class OracleDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_3__ possibleUrls.push(`${ORACLE_DL_BASE}/${major}/latest/jdk-${major}_${platform}-${arch}_bin.${extension}`); } const floatingUrl = isOnlyMajorProvided ? possibleUrls[0] : undefined; + let latestUrlNotFound = false; possibleUrls.push(`${ORACLE_DL_BASE}/${major}/archive/jdk-${range}_${platform}-${arch}_bin.${extension}`); if (parseInt(major) < 17) { throw new Error('Oracle JDK is only supported for JDK 17 and later'); @@ -90,6 +91,9 @@ class OracleDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_3__ const response = await this.http.head(url); if (response.message.statusCode === _actions_http_client__WEBPACK_IMPORTED_MODULE_5__/* .HttpCodes */ .Hv.OK) { const floating = url === floatingUrl; + if (latestUrlNotFound) { + _actions_core__WEBPACK_IMPORTED_MODULE_0__/* .warning */ .$e(`Oracle JDK ${major} is no longer available from the latest endpoint. Falling back to its archived GA release, which may not include security updates.`); + } return { url, version: range, @@ -100,6 +104,9 @@ class OracleDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_3__ : undefined }; } + if (url === floatingUrl) { + latestUrlNotFound = true; + } if (response.message.statusCode !== _actions_http_client__WEBPACK_IMPORTED_MODULE_5__/* .HttpCodes */ .Hv.NotFound) { throw new Error(`Http request for Oracle JDK failed with status code: ${response.message.statusCode}`); } diff --git a/src/distributions/oracle/installer.ts b/src/distributions/oracle/installer.ts index ca4b2902..9635a83f 100644 --- a/src/distributions/oracle/installer.ts +++ b/src/distributions/oracle/installer.ts @@ -109,6 +109,7 @@ export class OracleDistribution extends JavaBase { ); } const floatingUrl = isOnlyMajorProvided ? possibleUrls[0] : undefined; + let latestUrlNotFound = false; possibleUrls.push( `${ORACLE_DL_BASE}/${major}/archive/jdk-${range}_${platform}-${arch}_bin.${extension}` @@ -123,6 +124,11 @@ export class OracleDistribution extends JavaBase { if (response.message.statusCode === HttpCodes.OK) { const floating = url === floatingUrl; + if (latestUrlNotFound) { + core.warning( + `Oracle JDK ${major} is no longer available from the latest endpoint. Falling back to its archived GA release, which may not include security updates.` + ); + } return { url, version: range, @@ -134,6 +140,10 @@ export class OracleDistribution extends JavaBase { }; } + if (url === floatingUrl) { + latestUrlNotFound = true; + } + if (response.message.statusCode !== HttpCodes.NotFound) { throw new Error( `Http request for Oracle JDK failed with status code: ${response.message.statusCode}`