Add support for Eclipse Temurin (#201)
* Add support for Adoptium OpenJDK Refs https://github.com/actions/setup-java/issues/191 * Rename distribution to Eclipse Temurin * Update end-to-end tests in GitHub workflows * Exclude e2e tests for Temurin JREs for now * fix version * Update e2e-versions.yml * Handle Eclipse Temurin version suffixes ("beta") * Add test for new version suffix "beta" * Add updated `index.js` * fix an issue Co-authored-by: Maxim Lobanov <maxim-lobanov@github.com>
This commit is contained in:
		
							
								
								
									
										39
									
								
								.github/workflows/e2e-local-file.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								.github/workflows/e2e-local-file.yml
									
									
									
									
										vendored
									
									
								
							| @ -83,4 +83,41 @@ jobs: | ||||
|           architecture: x64 | ||||
|       - name: Verify Java version | ||||
|         run: bash __tests__/verify-java.sh "11.0" "${{ steps.setup-java.outputs.path }}" | ||||
|         shell: bash | ||||
|         shell: bash | ||||
|  | ||||
|   setup-java-local-file-temurin: | ||||
|     name: Validate installation from local file Eclipse Temurin | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - name: Download Eclipse Temurin file | ||||
|         run: | | ||||
|           if ($IsLinux) { | ||||
|             $downloadUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.12%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz" | ||||
|             $localFilename = "java_package.tar.gz" | ||||
|           } elseif ($IsMacOS) { | ||||
|             $downloadUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.12%2B7/OpenJDK11U-jdk_x64_mac_hotspot_11.0.12_7.tar.gz" | ||||
|             $localFilename = "java_package.tar.gz" | ||||
|           } elseif ($IsWindows) { | ||||
|             $downloadUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.12%2B7/OpenJDK11U-jdk_x64_windows_hotspot_11.0.12_7.zip" | ||||
|             $localFilename = "java_package.zip" | ||||
|           } | ||||
|           echo "LocalFilename=$localFilename" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | ||||
|           (New-Object System.Net.WebClient).DownloadFile($downloadUrl, "$env:RUNNER_TEMP/$localFilename") | ||||
|         shell: pwsh | ||||
|       - name: setup-java | ||||
|         uses: ./ | ||||
|         id: setup-java | ||||
|         with: | ||||
|           distribution: 'jdkfile' | ||||
|           jdkFile: ${{ runner.temp }}/${{ env.LocalFilename }} | ||||
|           java-version: '11.0.0-ea' | ||||
|           architecture: x64 | ||||
|       - name: Verify Java version | ||||
|         run: bash __tests__/verify-java.sh "11.0.12" "${{ steps.setup-java.outputs.path }}" | ||||
|         shell: bash | ||||
|  | ||||
							
								
								
									
										46
									
								
								.github/workflows/e2e-versions.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								.github/workflows/e2e-versions.yml
									
									
									
									
										vendored
									
									
								
							| @ -11,6 +11,7 @@ on: | ||||
|       - '**.md' | ||||
|   schedule: | ||||
|     - cron:  '0 */12 * * *' | ||||
|   workflow_dispatch: | ||||
| jobs: | ||||
|   setup-java-major-versions: | ||||
|     name: ${{ matrix.distribution }} ${{ matrix.version }} (jdk-x64) - ${{ matrix.os }} | ||||
| @ -19,8 +20,8 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-latest] | ||||
|         distribution: ['adopt', 'adopt-openj9', 'zulu'] # internally 'adopt-hotspot' is the same as 'adopt' | ||||
|         version: ['8', '11', '15'] | ||||
|         distribution: ['adopt', 'adopt-openj9', 'temurin', 'zulu'] # internally 'adopt-hotspot' is the same as 'adopt' | ||||
|         version: ['8', '11', '16'] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -57,6 +58,15 @@ jobs: | ||||
|           - distribution: 'adopt' | ||||
|             version: '12.0.2+10.1' | ||||
|             os: ubuntu-latest | ||||
|           - distribution: 'temurin' | ||||
|             version: '16.0.2+7' | ||||
|             os: macos-latest | ||||
|           - distribution: 'temurin' | ||||
|             version: '16.0.2+7' | ||||
|             os: windows-latest | ||||
|           - distribution: 'temurin' | ||||
|             version: '16.0.2+7' | ||||
|             os: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -78,7 +88,7 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-latest] | ||||
|         distribution: ['adopt', 'zulu'] | ||||
|         distribution: ['adopt', 'temurin', 'zulu'] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -137,6 +147,28 @@ jobs: | ||||
|         run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}" | ||||
|         shell: bash | ||||
|  | ||||
|   setup-java-ea-versions-temurin: | ||||
|     name: temurin ${{ matrix.version }} (jdk-x64) - ${{ matrix.os }} | ||||
|     needs: setup-java-major-minor-versions | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-latest] | ||||
|         version: ['17-ea'] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - name: setup-java | ||||
|         uses: ./ | ||||
|         id: setup-java | ||||
|         with: | ||||
|           java-version: ${{ matrix.version }} | ||||
|           distribution: temurin | ||||
|       - name: Verify Java | ||||
|         run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}" | ||||
|         shell: bash | ||||
|  | ||||
|   setup-java-custom-package-type: | ||||
|     name: ${{ matrix.distribution }} ${{ matrix.version }} (${{ matrix.java-package }}-x64) - ${{ matrix.os }} | ||||
|     needs: setup-java-major-minor-versions | ||||
| @ -145,10 +177,10 @@ jobs: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         os: [macos-latest, windows-latest, ubuntu-latest] | ||||
|         distribution: ['adopt', 'zulu'] | ||||
|         distribution: ['adopt', 'temurin', 'zulu'] | ||||
|         java-package: ['jre'] | ||||
|         version: | ||||
|         - '15.0' | ||||
|         - '16.0' | ||||
|         include: | ||||
|           - distribution: 'zulu' | ||||
|             java-package: jre+fx | ||||
| @ -158,6 +190,10 @@ jobs: | ||||
|             java-package: jdk+fx | ||||
|             version: '8.0.242' | ||||
|             os: ubuntu-latest | ||||
|         exclude: | ||||
|           # Eclipse Temurin currently doesn't publish JREs, only JDKs | ||||
|           - distribution: 'temurin' | ||||
|             java-package: 'jre' | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|  | ||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @ -13,7 +13,7 @@ This action provides the following functionality for GitHub Actions runners: | ||||
| - Registering problem matchers for error output | ||||
|  | ||||
| ## V2 vs V1 | ||||
| - V2 supports custom distributions and provides support for Zulu OpenJDK and Adopt OpenJDK out of the box. V1 supports only Zulu OpenJDK | ||||
| - V2 supports custom distributions and provides support for Zulu OpenJDK, Adopt OpenJDK and Eclipse Temurin out of the box. V1 supports only Zulu OpenJDK | ||||
| - V2 requires you to specify distribution along with the version. V1 defaults to Zulu OpenJDK, only version input is required. Follow [the migration guide](docs/switching-to-v2.md) to switch from V1 to V2 | ||||
|  | ||||
| ## Usage | ||||
| @ -31,6 +31,17 @@ steps: | ||||
| - run: java -cp java HelloWorldApp | ||||
| ``` | ||||
|  | ||||
| **Eclipse Temurin** | ||||
| ```yaml | ||||
| steps: | ||||
| - uses: actions/checkout@v2 | ||||
| - uses: actions/setup-java@v2 | ||||
|   with: | ||||
|     distribution: 'temurin' # See 'Supported distributions' for available options | ||||
|     java-version: '8' | ||||
| - run: java -cp java HelloWorldApp | ||||
| ``` | ||||
|  | ||||
| **Zulu OpenJDK** | ||||
| ```yaml | ||||
| steps: | ||||
| @ -55,6 +66,7 @@ Currently, the following distributions are supported: | ||||
| | `zulu` | Zulu OpenJDK | [Link](https://www.azul.com/downloads/zulu-community/?package=jdk) | [Link](https://www.azul.com/products/zulu-and-zulu-enterprise/zulu-terms-of-use/) | | ||||
| | `adopt` or `adopt-hotspot` | Adopt OpenJDK Hotspot | [Link](https://adoptopenjdk.net/) | [Link](https://adoptopenjdk.net/about.html) | ||||
| | `adopt-openj9` | Adopt OpenJDK OpenJ9 | [Link](https://adoptopenjdk.net/) | [Link](https://adoptopenjdk.net/about.html) | ||||
| | `temurin` | Eclipse Temurin | [Link](https://adoptium.net/) | [Link](https://adoptium.net/about.html) | ||||
|  | ||||
| **NOTE:** The different distributors can provide discrepant list of available versions / supported configurations. Please refer to the official documentation to see the list of supported versions. | ||||
|  | ||||
|  | ||||
							
								
								
									
										2566
									
								
								__tests__/data/temurin.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2566
									
								
								__tests__/data/temurin.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										164
									
								
								__tests__/distributors/temurin-installer.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								__tests__/distributors/temurin-installer.test.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,164 @@ | ||||
| import { HttpClient } from '@actions/http-client'; | ||||
|  | ||||
| import { | ||||
|   TemurinDistribution, | ||||
|   TemurinImplementation | ||||
| } from '../../src/distributions/temurin/installer'; | ||||
| import { JavaInstallerOptions } from '../../src/distributions/base-models'; | ||||
|  | ||||
| let manifestData = require('../data/temurin.json') as []; | ||||
|  | ||||
| describe('getAvailableVersions', () => { | ||||
|   let spyHttpClient: jest.SpyInstance; | ||||
|  | ||||
|   beforeEach(() => { | ||||
|     spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson'); | ||||
|     spyHttpClient.mockReturnValue({ | ||||
|       statusCode: 200, | ||||
|       headers: {}, | ||||
|       result: [] | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   afterEach(() => { | ||||
|     jest.resetAllMocks(); | ||||
|     jest.clearAllMocks(); | ||||
|     jest.restoreAllMocks(); | ||||
|   }); | ||||
|  | ||||
|   it.each([ | ||||
|     [ | ||||
|       { version: '16', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot, | ||||
|       'os=mac&architecture=x64&image_type=jdk&release_type=ga&jvm_impl=hotspot&page_size=20&page=0' | ||||
|     ], | ||||
|     [ | ||||
|       { version: '16', architecture: 'x86', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot, | ||||
|       'os=mac&architecture=x86&image_type=jdk&release_type=ga&jvm_impl=hotspot&page_size=20&page=0' | ||||
|     ], | ||||
|     [ | ||||
|       { version: '16', architecture: 'x64', packageType: 'jre', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot, | ||||
|       'os=mac&architecture=x64&image_type=jre&release_type=ga&jvm_impl=hotspot&page_size=20&page=0' | ||||
|     ], | ||||
|     [ | ||||
|       { version: '16-ea', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot, | ||||
|       'os=mac&architecture=x64&image_type=jdk&release_type=ea&jvm_impl=hotspot&page_size=20&page=0' | ||||
|     ] | ||||
|   ])( | ||||
|     'build correct url for %s', | ||||
|     async ( | ||||
|       installerOptions: JavaInstallerOptions, | ||||
|       impl: TemurinImplementation, | ||||
|       expectedParameters | ||||
|     ) => { | ||||
|       const distribution = new TemurinDistribution(installerOptions, impl); | ||||
|       const baseUrl = 'https://api.adoptium.net/v3/assets/version/%5B1.0,100.0%5D'; | ||||
|       const expectedUrl = `${baseUrl}?project=jdk&vendor=adoptium&heap_size=normal&sort_method=DEFAULT&sort_order=DESC&${expectedParameters}`; | ||||
|       distribution['getPlatformOption'] = () => 'mac'; | ||||
|  | ||||
|       await distribution['getAvailableVersions'](); | ||||
|  | ||||
|       expect(spyHttpClient.mock.calls).toHaveLength(1); | ||||
|       expect(spyHttpClient.mock.calls[0][0]).toBe(expectedUrl); | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   it('load available versions', async () => { | ||||
|     spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson'); | ||||
|     spyHttpClient | ||||
|       .mockReturnValueOnce({ | ||||
|         statusCode: 200, | ||||
|         headers: {}, | ||||
|         result: manifestData | ||||
|       }) | ||||
|       .mockReturnValueOnce({ | ||||
|         statusCode: 200, | ||||
|         headers: {}, | ||||
|         result: manifestData | ||||
|       }) | ||||
|       .mockReturnValueOnce({ | ||||
|         statusCode: 200, | ||||
|         headers: {}, | ||||
|         result: [] | ||||
|       }); | ||||
|  | ||||
|     const distribution = new TemurinDistribution( | ||||
|       { version: '8', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot | ||||
|     ); | ||||
|     const availableVersions = await distribution['getAvailableVersions'](); | ||||
|     expect(availableVersions).not.toBeNull(); | ||||
|     expect(availableVersions.length).toBe(manifestData.length * 2); | ||||
|   }); | ||||
|  | ||||
|   it.each([ | ||||
|     [TemurinImplementation.Hotspot, 'jdk', 'Java_Temurin-Hotspot_jdk'], | ||||
|     [TemurinImplementation.Hotspot, 'jre', 'Java_Temurin-Hotspot_jre'] | ||||
|   ])( | ||||
|     'find right toolchain folder', | ||||
|     (impl: TemurinImplementation, packageType: string, expected: string) => { | ||||
|       const distribution = new TemurinDistribution( | ||||
|         { version: '8', architecture: 'x64', packageType: packageType, checkLatest: false }, | ||||
|         impl | ||||
|       ); | ||||
|  | ||||
|       // @ts-ignore - because it is protected | ||||
|       expect(distribution.toolcacheFolderName).toBe(expected); | ||||
|     } | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| describe('findPackageForDownload', () => { | ||||
|   it.each([ | ||||
|     ['8', '8.0.302+8'], | ||||
|     ['16', '16.0.2+7'], | ||||
|     ['16.0', '16.0.2+7'], | ||||
|     ['16.0.2', '16.0.2+7'], | ||||
|     ['8.x', '8.0.302+8'], | ||||
|     ['x', '16.0.2+7'] | ||||
|   ])('version is resolved correctly %s -> %s', async (input, expected) => { | ||||
|     const distribution = new TemurinDistribution( | ||||
|       { version: '8', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot | ||||
|     ); | ||||
|     distribution['getAvailableVersions'] = async () => manifestData; | ||||
|     const resolvedVersion = await distribution['findPackageForDownload'](input); | ||||
|     expect(resolvedVersion.version).toBe(expected); | ||||
|   }); | ||||
|  | ||||
|   it('version is found but binaries list is empty', async () => { | ||||
|     const distribution = new TemurinDistribution( | ||||
|       { version: '9.0.8', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot | ||||
|     ); | ||||
|     distribution['getAvailableVersions'] = async () => manifestData; | ||||
|     await expect(distribution['findPackageForDownload']('9.0.8')).rejects.toThrowError( | ||||
|       /Could not find satisfied version for SemVer */ | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('version is not found', async () => { | ||||
|     const distribution = new TemurinDistribution( | ||||
|       { version: '7.x', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot | ||||
|     ); | ||||
|     distribution['getAvailableVersions'] = async () => manifestData; | ||||
|     await expect(distribution['findPackageForDownload']('7.x')).rejects.toThrowError( | ||||
|       /Could not find satisfied version for SemVer */ | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('version list is empty', async () => { | ||||
|     const distribution = new TemurinDistribution( | ||||
|       { version: '8', architecture: 'x64', packageType: 'jdk', checkLatest: false }, | ||||
|       TemurinImplementation.Hotspot | ||||
|     ); | ||||
|     distribution['getAvailableVersions'] = async () => []; | ||||
|     await expect(distribution['findPackageForDownload']('8')).rejects.toThrowError( | ||||
|       /Could not find satisfied version for SemVer */ | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										174
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										174
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -1479,11 +1479,13 @@ exports.getJavaDistribution = void 0; | ||||
| const installer_1 = __webpack_require__(144); | ||||
| const installer_2 = __webpack_require__(393); | ||||
| const installer_3 = __webpack_require__(584); | ||||
| const installer_4 = __webpack_require__(852); | ||||
| var JavaDistribution; | ||||
| (function (JavaDistribution) { | ||||
|     JavaDistribution["Adopt"] = "adopt"; | ||||
|     JavaDistribution["AdoptHotspot"] = "adopt-hotspot"; | ||||
|     JavaDistribution["AdoptOpenJ9"] = "adopt-openj9"; | ||||
|     JavaDistribution["Temurin"] = "temurin"; | ||||
|     JavaDistribution["Zulu"] = "zulu"; | ||||
|     JavaDistribution["JdkFile"] = "jdkfile"; | ||||
| })(JavaDistribution || (JavaDistribution = {})); | ||||
| @ -1496,6 +1498,8 @@ function getJavaDistribution(distributionName, installerOptions, jdkFile) { | ||||
|             return new installer_3.AdoptDistribution(installerOptions, installer_3.AdoptImplementation.Hotspot); | ||||
|         case JavaDistribution.AdoptOpenJ9: | ||||
|             return new installer_3.AdoptDistribution(installerOptions, installer_3.AdoptImplementation.OpenJ9); | ||||
|         case JavaDistribution.Temurin: | ||||
|             return new installer_4.TemurinDistribution(installerOptions, installer_4.TemurinImplementation.Hotspot); | ||||
|         case JavaDistribution.Zulu: | ||||
|             return new installer_2.ZuluDistribution(installerOptions); | ||||
|         default: | ||||
| @ -39873,7 +39877,175 @@ module.exports = new Type('tag:yaml.org,2002:omap', { | ||||
| /* 849 */, | ||||
| /* 850 */, | ||||
| /* 851 */, | ||||
| /* 852 */, | ||||
| /* 852 */ | ||||
| /***/ (function(__unusedmodule, exports, __webpack_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||||
|     return (mod && mod.__esModule) ? mod : { "default": mod }; | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||||
| exports.TemurinDistribution = exports.TemurinImplementation = void 0; | ||||
| const core = __importStar(__webpack_require__(470)); | ||||
| const tc = __importStar(__webpack_require__(139)); | ||||
| const fs_1 = __importDefault(__webpack_require__(747)); | ||||
| const path_1 = __importDefault(__webpack_require__(622)); | ||||
| const semver_1 = __importDefault(__webpack_require__(876)); | ||||
| const base_installer_1 = __webpack_require__(83); | ||||
| const util_1 = __webpack_require__(322); | ||||
| var TemurinImplementation; | ||||
| (function (TemurinImplementation) { | ||||
|     TemurinImplementation["Hotspot"] = "Hotspot"; | ||||
| })(TemurinImplementation = exports.TemurinImplementation || (exports.TemurinImplementation = {})); | ||||
| class TemurinDistribution extends base_installer_1.JavaBase { | ||||
|     constructor(installerOptions, jvmImpl) { | ||||
|         super(`Temurin-${jvmImpl}`, installerOptions); | ||||
|         this.jvmImpl = jvmImpl; | ||||
|     } | ||||
|     findPackageForDownload(version) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const availableVersionsRaw = yield this.getAvailableVersions(); | ||||
|             const availableVersionsWithBinaries = availableVersionsRaw | ||||
|                 .filter(item => item.binaries.length > 0) | ||||
|                 .map(item => { | ||||
|                 // normalize 17.0.0-beta+33.0.202107301459 to 17.0.0+33.0.202107301459 for earlier access versions
 | ||||
|                 const formattedVersion = this.stable | ||||
|                     ? item.version_data.semver | ||||
|                     : item.version_data.semver.replace('-beta+', '+'); | ||||
|                 return { | ||||
|                     version: formattedVersion, | ||||
|                     url: item.binaries[0].package.link | ||||
|                 }; | ||||
|             }); | ||||
|             const satisfiedVersions = availableVersionsWithBinaries | ||||
|                 .filter(item => util_1.isVersionSatisfies(version, item.version)) | ||||
|                 .sort((a, b) => { | ||||
|                 return -semver_1.default.compareBuild(a.version, b.version); | ||||
|             }); | ||||
|             const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null; | ||||
|             if (!resolvedFullVersion) { | ||||
|                 const availableOptions = availableVersionsWithBinaries.map(item => item.version).join(', '); | ||||
|                 const availableOptionsMessage = availableOptions | ||||
|                     ? `\nAvailable versions: ${availableOptions}` | ||||
|                     : ''; | ||||
|                 throw new Error(`Could not find satisfied version for SemVer '${version}'. ${availableOptionsMessage}`); | ||||
|             } | ||||
|             return resolvedFullVersion; | ||||
|         }); | ||||
|     } | ||||
|     downloadTool(javaRelease) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             let javaPath; | ||||
|             let extractedJavaPath; | ||||
|             core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`); | ||||
|             const javaArchivePath = yield tc.downloadTool(javaRelease.url); | ||||
|             core.info(`Extracting Java archive...`); | ||||
|             let extension = util_1.getDownloadArchiveExtension(); | ||||
|             extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension); | ||||
|             const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0]; | ||||
|             const archivePath = path_1.default.join(extractedJavaPath, archiveName); | ||||
|             const version = this.getToolcacheVersionName(javaRelease.version); | ||||
|             javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture); | ||||
|             return { version: javaRelease.version, path: javaPath }; | ||||
|         }); | ||||
|     } | ||||
|     get toolcacheFolderName() { | ||||
|         return super.toolcacheFolderName; | ||||
|     } | ||||
|     getAvailableVersions() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const platform = this.getPlatformOption(); | ||||
|             const arch = this.architecture; | ||||
|             const imageType = this.packageType; | ||||
|             const versionRange = encodeURI('[1.0,100.0]'); // retrieve all available versions
 | ||||
|             const releaseType = this.stable ? 'ga' : 'ea'; | ||||
|             console.time('temurin-retrieve-available-versions'); | ||||
|             const baseRequestArguments = [ | ||||
|                 `project=jdk`, | ||||
|                 'vendor=adoptium', | ||||
|                 `heap_size=normal`, | ||||
|                 'sort_method=DEFAULT', | ||||
|                 'sort_order=DESC', | ||||
|                 `os=${platform}`, | ||||
|                 `architecture=${arch}`, | ||||
|                 `image_type=${imageType}`, | ||||
|                 `release_type=${releaseType}`, | ||||
|                 `jvm_impl=${this.jvmImpl.toLowerCase()}` | ||||
|             ].join('&'); | ||||
|             // need to iterate through all pages to retrieve the list of all versions
 | ||||
|             // Adoptium API doesn't provide way to retrieve the count of pages to iterate so infinity loop
 | ||||
|             let page_index = 0; | ||||
|             const availableVersions = []; | ||||
|             while (true) { | ||||
|                 const requestArguments = `${baseRequestArguments}&page_size=20&page=${page_index}`; | ||||
|                 const availableVersionsUrl = `https://api.adoptium.net/v3/assets/version/${versionRange}?${requestArguments}`; | ||||
|                 if (core.isDebug() && page_index === 0) { | ||||
|                     // url is identical except page_index so print it once for debug
 | ||||
|                     core.debug(`Gathering available versions from '${availableVersionsUrl}'`); | ||||
|                 } | ||||
|                 const paginationPage = (yield this.http.getJson(availableVersionsUrl)).result; | ||||
|                 if (paginationPage === null || paginationPage.length === 0) { | ||||
|                     // break infinity loop because we have reached end of pagination
 | ||||
|                     break; | ||||
|                 } | ||||
|                 availableVersions.push(...paginationPage); | ||||
|                 page_index++; | ||||
|             } | ||||
|             if (core.isDebug()) { | ||||
|                 core.startGroup('Print information about available versions'); | ||||
|                 console.timeEnd('temurin-retrieve-available-versions'); | ||||
|                 console.log(`Available versions: [${availableVersions.length}]`); | ||||
|                 console.log(availableVersions.map(item => item.version_data.semver).join(', ')); | ||||
|                 core.endGroup(); | ||||
|             } | ||||
|             return availableVersions; | ||||
|         }); | ||||
|     } | ||||
|     getPlatformOption() { | ||||
|         // Adoptium has own platform names so need to map them
 | ||||
|         switch (process.platform) { | ||||
|             case 'darwin': | ||||
|                 return 'mac'; | ||||
|             case 'win32': | ||||
|                 return 'windows'; | ||||
|             default: | ||||
|                 return process.platform; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| exports.TemurinDistribution = TemurinDistribution; | ||||
| 
 | ||||
| 
 | ||||
| /***/ }), | ||||
| /* 853 */, | ||||
| /* 854 */, | ||||
| /* 855 */, | ||||
|  | ||||
							
								
								
									
										6295
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6295
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -3,11 +3,13 @@ import { JavaInstallerOptions } from './base-models'; | ||||
| import { LocalDistribution } from './local/installer'; | ||||
| import { ZuluDistribution } from './zulu/installer'; | ||||
| import { AdoptDistribution, AdoptImplementation } from './adopt/installer'; | ||||
| import { TemurinDistribution, TemurinImplementation } from './temurin/installer'; | ||||
|  | ||||
| enum JavaDistribution { | ||||
|   Adopt = 'adopt', | ||||
|   AdoptHotspot = 'adopt-hotspot', | ||||
|   AdoptOpenJ9 = 'adopt-openj9', | ||||
|   Temurin = 'temurin', | ||||
|   Zulu = 'zulu', | ||||
|   JdkFile = 'jdkfile' | ||||
| } | ||||
| @ -25,6 +27,8 @@ export function getJavaDistribution( | ||||
|       return new AdoptDistribution(installerOptions, AdoptImplementation.Hotspot); | ||||
|     case JavaDistribution.AdoptOpenJ9: | ||||
|       return new AdoptDistribution(installerOptions, AdoptImplementation.OpenJ9); | ||||
|     case JavaDistribution.Temurin: | ||||
|       return new TemurinDistribution(installerOptions, TemurinImplementation.Hotspot); | ||||
|     case JavaDistribution.Zulu: | ||||
|       return new ZuluDistribution(installerOptions); | ||||
|     default: | ||||
|  | ||||
							
								
								
									
										155
									
								
								src/distributions/temurin/installer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								src/distributions/temurin/installer.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,155 @@ | ||||
| import * as core from '@actions/core'; | ||||
| import * as tc from '@actions/tool-cache'; | ||||
|  | ||||
| import fs from 'fs'; | ||||
| import path from 'path'; | ||||
| import semver from 'semver'; | ||||
|  | ||||
| import { JavaBase } from '../base-installer'; | ||||
| import { ITemurinAvailableVersions } from './models'; | ||||
| import { JavaDownloadRelease, JavaInstallerOptions, JavaInstallerResults } from '../base-models'; | ||||
| import { extractJdkFile, getDownloadArchiveExtension, isVersionSatisfies } from '../../util'; | ||||
|  | ||||
| export enum TemurinImplementation { | ||||
|   Hotspot = 'Hotspot' | ||||
| } | ||||
|  | ||||
| export class TemurinDistribution extends JavaBase { | ||||
|   constructor( | ||||
|     installerOptions: JavaInstallerOptions, | ||||
|     private readonly jvmImpl: TemurinImplementation | ||||
|   ) { | ||||
|     super(`Temurin-${jvmImpl}`, installerOptions); | ||||
|   } | ||||
|  | ||||
|   protected async findPackageForDownload(version: string): Promise<JavaDownloadRelease> { | ||||
|     const availableVersionsRaw = await this.getAvailableVersions(); | ||||
|     const availableVersionsWithBinaries = availableVersionsRaw | ||||
|       .filter(item => item.binaries.length > 0) | ||||
|       .map(item => { | ||||
|         // normalize 17.0.0-beta+33.0.202107301459 to 17.0.0+33.0.202107301459 for earlier access versions | ||||
|         const formattedVersion = this.stable | ||||
|           ? item.version_data.semver | ||||
|           : item.version_data.semver.replace('-beta+', '+'); | ||||
|         return { | ||||
|           version: formattedVersion, | ||||
|           url: item.binaries[0].package.link | ||||
|         } as JavaDownloadRelease; | ||||
|       }); | ||||
|  | ||||
|     const satisfiedVersions = availableVersionsWithBinaries | ||||
|       .filter(item => isVersionSatisfies(version, item.version)) | ||||
|       .sort((a, b) => { | ||||
|         return -semver.compareBuild(a.version, b.version); | ||||
|       }); | ||||
|  | ||||
|     const resolvedFullVersion = satisfiedVersions.length > 0 ? satisfiedVersions[0] : null; | ||||
|     if (!resolvedFullVersion) { | ||||
|       const availableOptions = availableVersionsWithBinaries.map(item => item.version).join(', '); | ||||
|       const availableOptionsMessage = availableOptions | ||||
|         ? `\nAvailable versions: ${availableOptions}` | ||||
|         : ''; | ||||
|       throw new Error( | ||||
|         `Could not find satisfied version for SemVer '${version}'. ${availableOptionsMessage}` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     return resolvedFullVersion; | ||||
|   } | ||||
|  | ||||
|   protected async downloadTool(javaRelease: JavaDownloadRelease): Promise<JavaInstallerResults> { | ||||
|     let javaPath: string; | ||||
|     let extractedJavaPath: string; | ||||
|  | ||||
|     core.info( | ||||
|       `Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...` | ||||
|     ); | ||||
|     const javaArchivePath = await tc.downloadTool(javaRelease.url); | ||||
|  | ||||
|     core.info(`Extracting Java archive...`); | ||||
|     let extension = getDownloadArchiveExtension(); | ||||
|  | ||||
|     extractedJavaPath = await extractJdkFile(javaArchivePath, extension); | ||||
|  | ||||
|     const archiveName = fs.readdirSync(extractedJavaPath)[0]; | ||||
|     const archivePath = path.join(extractedJavaPath, archiveName); | ||||
|     const version = this.getToolcacheVersionName(javaRelease.version); | ||||
|  | ||||
|     javaPath = await tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture); | ||||
|  | ||||
|     return { version: javaRelease.version, path: javaPath }; | ||||
|   } | ||||
|  | ||||
|   protected get toolcacheFolderName(): string { | ||||
|     return super.toolcacheFolderName; | ||||
|   } | ||||
|  | ||||
|   private async getAvailableVersions(): Promise<ITemurinAvailableVersions[]> { | ||||
|     const platform = this.getPlatformOption(); | ||||
|     const arch = this.architecture; | ||||
|     const imageType = this.packageType; | ||||
|     const versionRange = encodeURI('[1.0,100.0]'); // retrieve all available versions | ||||
|     const releaseType = this.stable ? 'ga' : 'ea'; | ||||
|  | ||||
|     console.time('temurin-retrieve-available-versions'); | ||||
|  | ||||
|     const baseRequestArguments = [ | ||||
|       `project=jdk`, | ||||
|       'vendor=adoptium', | ||||
|       `heap_size=normal`, | ||||
|       'sort_method=DEFAULT', | ||||
|       'sort_order=DESC', | ||||
|       `os=${platform}`, | ||||
|       `architecture=${arch}`, | ||||
|       `image_type=${imageType}`, | ||||
|       `release_type=${releaseType}`, | ||||
|       `jvm_impl=${this.jvmImpl.toLowerCase()}` | ||||
|     ].join('&'); | ||||
|  | ||||
|     // need to iterate through all pages to retrieve the list of all versions | ||||
|     // Adoptium API doesn't provide way to retrieve the count of pages to iterate so infinity loop | ||||
|     let page_index = 0; | ||||
|     const availableVersions: ITemurinAvailableVersions[] = []; | ||||
|     while (true) { | ||||
|       const requestArguments = `${baseRequestArguments}&page_size=20&page=${page_index}`; | ||||
|       const availableVersionsUrl = `https://api.adoptium.net/v3/assets/version/${versionRange}?${requestArguments}`; | ||||
|       if (core.isDebug() && page_index === 0) { | ||||
|         // url is identical except page_index so print it once for debug | ||||
|         core.debug(`Gathering available versions from '${availableVersionsUrl}'`); | ||||
|       } | ||||
|  | ||||
|       const paginationPage = ( | ||||
|         await this.http.getJson<ITemurinAvailableVersions[]>(availableVersionsUrl) | ||||
|       ).result; | ||||
|       if (paginationPage === null || paginationPage.length === 0) { | ||||
|         // break infinity loop because we have reached end of pagination | ||||
|         break; | ||||
|       } | ||||
|  | ||||
|       availableVersions.push(...paginationPage); | ||||
|       page_index++; | ||||
|     } | ||||
|  | ||||
|     if (core.isDebug()) { | ||||
|       core.startGroup('Print information about available versions'); | ||||
|       console.timeEnd('temurin-retrieve-available-versions'); | ||||
|       console.log(`Available versions: [${availableVersions.length}]`); | ||||
|       console.log(availableVersions.map(item => item.version_data.semver).join(', ')); | ||||
|       core.endGroup(); | ||||
|     } | ||||
|  | ||||
|     return availableVersions; | ||||
|   } | ||||
|  | ||||
|   private getPlatformOption(): string { | ||||
|     // Adoptium has own platform names so need to map them | ||||
|     switch (process.platform) { | ||||
|       case 'darwin': | ||||
|         return 'mac'; | ||||
|       case 'win32': | ||||
|         return 'windows'; | ||||
|       default: | ||||
|         return process.platform; | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								src/distributions/temurin/models.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/distributions/temurin/models.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| // Models from https://api.adoptium.net/q/swagger-ui/#/Assets/searchReleasesByVersion | ||||
|  | ||||
| export interface ITemurinAvailableVersions { | ||||
|   binaries: [ | ||||
|     { | ||||
|       architecture: string; | ||||
|       heap_size: string; | ||||
|       image_type: string; | ||||
|       jvm_impl: string; | ||||
|       os: string; | ||||
|       package: { | ||||
|         checksum: string; | ||||
|         checksum_link: string; | ||||
|         download_count: number; | ||||
|         link: string; | ||||
|         metadata_link: string; | ||||
|         name: string; | ||||
|         size: string; | ||||
|       }; | ||||
|       project: string; | ||||
|       scm_ref: string; | ||||
|       updated_at: string; | ||||
|     } | ||||
|   ]; | ||||
|   id: string; | ||||
|   release_link: string; | ||||
|   release_name: string; | ||||
|   release_type: string; | ||||
|   vendor: string; | ||||
|   version_data: { | ||||
|     build: number; | ||||
|     major: number; | ||||
|     minor: number; | ||||
|     openjdk_version: string; | ||||
|     security: string; | ||||
|     semver: string; | ||||
|   }; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Jochen Schalanda
					Jochen Schalanda