From 7f1cc05ecfb0a7169a61a09e9a98345432412f6a Mon Sep 17 00:00:00 2001 From: John Oliver <1615532+johnoliver@users.noreply.github.com> Date: Tue, 8 Aug 2023 13:02:14 +0100 Subject: [PATCH] Make the Adoptopenjdk package type look at the Temurin repo first for latest assets --- .../distributors/adopt-installer.test.ts | 86 +++++++++++++++++-- src/distributions/adopt/installer.ts | 39 ++++++++- src/distributions/temurin/installer.ts | 2 +- 3 files changed, 119 insertions(+), 8 deletions(-) diff --git a/__tests__/distributors/adopt-installer.test.ts b/__tests__/distributors/adopt-installer.test.ts index 8a11224..02b74d4 100644 --- a/__tests__/distributors/adopt-installer.test.ts +++ b/__tests__/distributors/adopt-installer.test.ts @@ -1,14 +1,11 @@ import {HttpClient} from '@actions/http-client'; -import {IAdoptAvailableVersions} from '../../src/distributions/adopt/models'; -import { - AdoptDistribution, - AdoptImplementation -} from '../../src/distributions/adopt/installer'; +import {AdoptDistribution, AdoptImplementation} from '../../src/distributions/adopt/installer'; import {JavaInstallerOptions} from '../../src/distributions/base-models'; import os from 'os'; import manifestData from '../data/adopt.json'; +import {TemurinDistribution, TemurinImplementation} from "../../src/distributions/temurin/installer"; describe('getAvailableVersions', () => { let spyHttpClient: jest.SpyInstance; @@ -247,6 +244,85 @@ describe('findPackageForDownload', () => { expect(resolvedVersion.version).toBe(expected); }); + describe('delegates to Temurin', () => { + it.each([ + ['9', '9.0.7+10'], + ['15', '15.0.2+7'], + ['15.0', '15.0.2+7'], + ['15.0.2', '15.0.2+7'], + ['15.0.1', '15.0.1+9.1'], + ['11.x', '11.0.10+9'], + ['x', '15.0.2+7'], + ['12', '12.0.2+10.3'], // make sure that '12.0.2+10.1', '12.0.2+10.3', '12.0.2+10.2' are sorted correctly + ['12.0.2+10.1', '12.0.2+10.1'], + ['15.0.1+9', '15.0.1+9'], + ['15.0.1+9.1', '15.0.1+9.1'] + ])('version is resolved correctly %s -> %s', async (input, expected) => { + + const temurinDistribution = new TemurinDistribution( + { + version: '11', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }, + TemurinImplementation.Hotspot + ); + + const distribution = new AdoptDistribution( + { + version: '11', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }, + AdoptImplementation.Hotspot, + temurinDistribution + ); + + temurinDistribution['getAvailableVersions'] = async () => manifestData as any; + const resolvedVersion = await distribution['findPackageForDownload'](input); + expect(resolvedVersion.version).toBe(expected); + }); + }); + + + describe('Falls back if Temurin fails', () => { + it.each([ + ['9', '9.0.7+10'] + ])('version is resolved correctly %s -> %s', async (input, expected) => { + + const temurinDistribution = new TemurinDistribution( + { + version: '11', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }, + TemurinImplementation.Hotspot + ); + + const distribution = new AdoptDistribution( + { + version: '11', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }, + AdoptImplementation.Hotspot, + temurinDistribution + ); + + temurinDistribution['findPackageForDownload'] = async () => new Promise(function () { + throw new Error("Could not find satisfied version for SemVer") + }); + distribution['getAvailableVersions'] = async () => manifestData as any; + + const resolvedVersion = await distribution['findPackageForDownload'](input); + expect(resolvedVersion.version).toBe(expected); + }); + }); + it('version is found but binaries list is empty', async () => { const distribution = new AdoptDistribution( { diff --git a/src/distributions/adopt/installer.ts b/src/distributions/adopt/installer.ts index 9887b78..9104b96 100644 --- a/src/distributions/adopt/installer.ts +++ b/src/distributions/adopt/installer.ts @@ -17,6 +17,7 @@ import { getDownloadArchiveExtension, isVersionSatisfies } from '../../util'; +import {TemurinDistribution, TemurinImplementation} from "../temurin/installer"; export enum AdoptImplementation { Hotspot = 'Hotspot', @@ -26,13 +27,47 @@ export enum AdoptImplementation { export class AdoptDistribution extends JavaBase { constructor( installerOptions: JavaInstallerOptions, - private readonly jvmImpl: AdoptImplementation + private readonly jvmImpl: AdoptImplementation, + private readonly temurinDistribution: TemurinDistribution | null = null ) { super(`Adopt-${jvmImpl}`, installerOptions); + + if (temurinDistribution != null && jvmImpl != AdoptImplementation.Hotspot) { + throw new Error("Only Hotspot JVM is supported by Temurin.") + } + + // Only use the temurin repo for Hotspot JVMs + if (temurinDistribution == null && jvmImpl == AdoptImplementation.Hotspot) { + this.temurinDistribution = new TemurinDistribution( + installerOptions, + TemurinImplementation.Hotspot); + } } protected async findPackageForDownload( - version: string + version: string + ): Promise { + if (this.jvmImpl == AdoptImplementation.Hotspot && this.temurinDistribution != null) { + try { + let result = await this.temurinDistribution.findPackageForDownload(version) + + if (result != undefined) { + return result + } + } catch (error) { + if (error.message.includes('Could not find satisfied version')) { + console.warn("The JVM you are looking for could not be found in the Temurin repository, this likely indicates " + + "that you are using an out of date version of Java, consider updating and moving to using the Temurin distribution type in setup-java.") + } + } + } + + // failed to find a Temurin version, so fall back to AdoptOpenJDK + return this.findPackageForDownloadOldAdoptOpenJdk(version); + } + + private async findPackageForDownloadOldAdoptOpenJdk( + version: string ): Promise { const availableVersionsRaw = await this.getAvailableVersions(); const availableVersionsWithBinaries = availableVersionsRaw diff --git a/src/distributions/temurin/installer.ts b/src/distributions/temurin/installer.ts index 4a1989b..870ff73 100644 --- a/src/distributions/temurin/installer.ts +++ b/src/distributions/temurin/installer.ts @@ -30,7 +30,7 @@ export class TemurinDistribution extends JavaBase { super(`Temurin-${jvmImpl}`, installerOptions); } - protected async findPackageForDownload( + public async findPackageForDownload( version: string ): Promise { const availableVersionsRaw = await this.getAvailableVersions();