mirror of
https://github.com/actions/setup-java
synced 2024-12-22 21:22:41 +00:00
Add microsoft distribution of the JDK. (#252)
* Add microsoft distribution of the JDK. * Fix formatting to match prettier. * Rebuild js. * Fix archive suffix for Windows. * Update src/distributions/microsoft/installer.ts Co-authored-by: Brian Cristante <33549821+brcrista@users.noreply.github.com> * Update src/distributions/microsoft/installer.ts Co-authored-by: Brian Cristante <33549821+brcrista@users.noreply.github.com> * Add support for the microsoft distribution. * revert lockfile changes * npm run format * fix e2e-versions.yml * eliminate duplication in version numbers * Fix test Co-authored-by: Brendan Burns <brendan.d.burns@gmail.com> Co-authored-by: Brian Cristante <33549821+brcrista@users.noreply.github.com>
This commit is contained in:
parent
5f00602cd1
commit
db2f350d2b
7 changed files with 367 additions and 8 deletions
18
.github/workflows/e2e-versions.yml
vendored
18
.github/workflows/e2e-versions.yml
vendored
|
@ -20,8 +20,11 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-latest, windows-latest, ubuntu-latest]
|
os: [macos-latest, windows-latest, ubuntu-latest]
|
||||||
distribution: ['temurin', 'adopt', 'adopt-openj9', 'zulu', 'liberica'] # internally 'adopt-hotspot' is the same as 'adopt'
|
distribution: ['temurin', 'adopt', 'adopt-openj9', 'zulu', 'liberica', 'microsoft' ] # internally 'adopt-hotspot' is the same as 'adopt'
|
||||||
version: ['8', '11', '16']
|
version: ['8', '11', '16']
|
||||||
|
exclude:
|
||||||
|
- distribution: microsoft
|
||||||
|
version: 8
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
@ -174,16 +177,17 @@ jobs:
|
||||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
setup-java-custom-architecture:
|
# Only Liberica and Zulu provide x86
|
||||||
name: ${{ matrix.distribution }} ${{ matrix.version }} (jdk-x86) - ${{ matrix.os }}
|
setup-java-x86:
|
||||||
|
name: ${{ matrix.distribution }} ${{ matrix.version }} (jdk-${{ matrix.architecture }}) - ${{ matrix.os }}
|
||||||
needs: setup-java-major-minor-versions
|
needs: setup-java-major-minor-versions
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# Only Zulu and Liberica provides x86 arch for now and only for windows / ubuntu
|
# x86 is not supported on macOS
|
||||||
os: [windows-latest, ubuntu-latest]
|
os: [windows-latest, ubuntu-latest]
|
||||||
distribution: ['zulu', 'liberica']
|
distribution: ['liberica', 'zulu']
|
||||||
version: ['11']
|
version: ['11']
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
@ -194,7 +198,9 @@ jobs:
|
||||||
with:
|
with:
|
||||||
distribution: ${{ matrix.distribution }}
|
distribution: ${{ matrix.distribution }}
|
||||||
java-version: ${{ matrix.version }}
|
java-version: ${{ matrix.version }}
|
||||||
architecture: x86
|
architecture: 'x86'
|
||||||
- name: Verify Java
|
- name: Verify Java
|
||||||
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
|
# Only Microsoft provides AArch64. However, GitHub-hosted runners do not support this architecture.
|
|
@ -59,6 +59,7 @@ Currently, the following distributions are supported:
|
||||||
| `adopt` or `adopt-hotspot` | Adopt OpenJDK Hotspot | [Link](https://adoptopenjdk.net/) | [Link](https://adoptopenjdk.net/about.html) |
|
| `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) |
|
| `adopt-openj9` | Adopt OpenJDK OpenJ9 | [Link](https://adoptopenjdk.net/) | [Link](https://adoptopenjdk.net/about.html) |
|
||||||
| `liberica` | Liberica JDK | [Link](https://bell-sw.com/) | [Link](https://bell-sw.com/liberica_eula/) |
|
| `liberica` | Liberica JDK | [Link](https://bell-sw.com/) | [Link](https://bell-sw.com/liberica_eula/) |
|
||||||
|
| `microsoft` | Microsoft Build of OpenJDK | [Link](https://www.microsoft.com/openjdk) | [Link](https://docs.microsoft.com/java/openjdk/faq)
|
||||||
|
|
||||||
**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.
|
**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.
|
||||||
|
|
||||||
|
|
88
__tests__/distributors/microsoft-installer.test.ts
Normal file
88
__tests__/distributors/microsoft-installer.test.ts
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
import { MicrosoftDistributions } from '../../src/distributions/microsoft/installer';
|
||||||
|
|
||||||
|
describe('findPackageForDownload', () => {
|
||||||
|
let distribution: MicrosoftDistributions;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
distribution = new MicrosoftDistributions({
|
||||||
|
version: '',
|
||||||
|
architecture: 'x64',
|
||||||
|
packageType: 'jdk',
|
||||||
|
checkLatest: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
[
|
||||||
|
'17.x',
|
||||||
|
'17.0.1',
|
||||||
|
'https://aka.ms/download-jdk/microsoft-jdk-17.0.1.12.1-{{OS_TYPE}}-x64.{{ARCHIVE_TYPE}}'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'16.0.x',
|
||||||
|
'16.0.2',
|
||||||
|
'https://aka.ms/download-jdk/microsoft-jdk-16.0.2.7.1-{{OS_TYPE}}-x64.{{ARCHIVE_TYPE}}'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'11.0.13',
|
||||||
|
'11.0.13',
|
||||||
|
'https://aka.ms/download-jdk/microsoft-jdk-11.0.13.8.1-{{OS_TYPE}}-x64.{{ARCHIVE_TYPE}}'
|
||||||
|
]
|
||||||
|
])('version is %s -> %s', async (input, expectedVersion, expectedUrl) => {
|
||||||
|
const result = await distribution['findPackageForDownload'](input);
|
||||||
|
expect(result.version).toBe(expectedVersion);
|
||||||
|
let os: string;
|
||||||
|
let archive: string;
|
||||||
|
switch (process.platform) {
|
||||||
|
case 'darwin':
|
||||||
|
os = 'macos';
|
||||||
|
archive = 'tar.gz';
|
||||||
|
break;
|
||||||
|
case 'win32':
|
||||||
|
os = 'windows';
|
||||||
|
archive = 'zip';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
os = process.platform.toString();
|
||||||
|
archive = 'tar.gz';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const url = expectedUrl.replace('{{OS_TYPE}}', os).replace('{{ARCHIVE_TYPE}}', archive);
|
||||||
|
expect(result.url).toBe(url);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw an error', async () => {
|
||||||
|
await expect(distribution['findPackageForDownload']('8')).rejects.toThrow(
|
||||||
|
/Could not find satisfied version for SemVer */
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getPlatformOption', () => {
|
||||||
|
const distributions = new MicrosoftDistributions({
|
||||||
|
architecture: 'x64',
|
||||||
|
version: '11',
|
||||||
|
packageType: 'jdk',
|
||||||
|
checkLatest: false
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
['linux', 'tar.gz', 'linux'],
|
||||||
|
['darwin', 'tar.gz', 'macos'],
|
||||||
|
['win32', 'zip', 'windows']
|
||||||
|
])('os version %s -> %s', (input, expectedArchive, expectedOs) => {
|
||||||
|
const actual = distributions['getPlatformOption'](input as NodeJS.Platform);
|
||||||
|
|
||||||
|
expect(actual.archive).toEqual(expectedArchive);
|
||||||
|
expect(actual.os).toEqual(expectedOs);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each(['aix', 'android', 'freebsd', 'openbsd', 'netbsd', 'solaris', 'cygwin'])(
|
||||||
|
'not support os version %s',
|
||||||
|
input => {
|
||||||
|
expect(() => distributions['getPlatformOption'](input as NodeJS.Platform)).toThrow(
|
||||||
|
/Platform '\w+' is not supported\. Supported platforms: .+/
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
135
dist/setup/index.js
vendored
135
dist/setup/index.js
vendored
|
@ -13819,7 +13819,136 @@ exports.XMLCBWriter = XMLCBWriter;
|
||||||
/* 193 */,
|
/* 193 */,
|
||||||
/* 194 */,
|
/* 194 */,
|
||||||
/* 195 */,
|
/* 195 */,
|
||||||
/* 196 */,
|
/* 196 */
|
||||||
|
/***/ (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.MicrosoftDistributions = void 0;
|
||||||
|
const base_installer_1 = __webpack_require__(83);
|
||||||
|
const semver_1 = __importDefault(__webpack_require__(876));
|
||||||
|
const util_1 = __webpack_require__(322);
|
||||||
|
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));
|
||||||
|
class MicrosoftDistributions extends base_installer_1.JavaBase {
|
||||||
|
constructor(installerOptions) {
|
||||||
|
super('Microsoft', installerOptions);
|
||||||
|
}
|
||||||
|
downloadTool(javaRelease) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
|
||||||
|
const javaArchivePath = yield tc.downloadTool(javaRelease.url);
|
||||||
|
core.info(`Extracting Java archive...`);
|
||||||
|
const extension = util_1.getDownloadArchiveExtension();
|
||||||
|
const extractedJavaPath = yield util_1.extractJdkFile(javaArchivePath, extension);
|
||||||
|
const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0];
|
||||||
|
const archivePath = path_1.default.join(extractedJavaPath, archiveName);
|
||||||
|
const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
|
||||||
|
return { version: javaRelease.version, path: javaPath };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
findPackageForDownload(range) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
if (this.architecture !== 'x64' && this.architecture !== 'aarch64') {
|
||||||
|
throw new Error(`Unsupported architecture: ${this.architecture}`);
|
||||||
|
}
|
||||||
|
const availableVersionsRaw = yield this.getAvailableVersions();
|
||||||
|
const opts = this.getPlatformOption();
|
||||||
|
const availableVersions = availableVersionsRaw.map(item => ({
|
||||||
|
url: `https://aka.ms/download-jdk/microsoft-jdk-${item.version.join('.')}-${opts.os}-${this.architecture}.${opts.archive}`,
|
||||||
|
version: this.convertVersionToSemver(item)
|
||||||
|
}));
|
||||||
|
const satisfiedVersion = availableVersions
|
||||||
|
.filter(item => util_1.isVersionSatisfies(range, item.version))
|
||||||
|
.sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0];
|
||||||
|
if (!satisfiedVersion) {
|
||||||
|
const availableOptions = availableVersions.map(item => item.version).join(', ');
|
||||||
|
const availableOptionsMessage = availableOptions
|
||||||
|
? `\nAvailable versions: ${availableOptions}`
|
||||||
|
: '';
|
||||||
|
throw new Error(`Could not find satisfied version for SemVer ${range}. ${availableOptionsMessage}`);
|
||||||
|
}
|
||||||
|
return satisfiedVersion;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
getAvailableVersions() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
// TODO get these dynamically!
|
||||||
|
// We will need Microsoft to add an endpoint where we can query for versions.
|
||||||
|
const jdkVersions = [
|
||||||
|
{
|
||||||
|
version: [17, 0, 1, 12, 1]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: [16, 0, 2, 7, 1]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
// M1 is only supported for Java 16 & 17
|
||||||
|
if (process.platform !== 'darwin' || this.architecture !== 'aarch64') {
|
||||||
|
jdkVersions.push({
|
||||||
|
version: [11, 0, 13, 8, 1]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return jdkVersions;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
getPlatformOption(platform = process.platform /* for testing */) {
|
||||||
|
switch (platform) {
|
||||||
|
case 'darwin':
|
||||||
|
return { archive: 'tar.gz', os: 'macos' };
|
||||||
|
case 'win32':
|
||||||
|
return { archive: 'zip', os: 'windows' };
|
||||||
|
case 'linux':
|
||||||
|
return { archive: 'tar.gz', os: 'linux' };
|
||||||
|
default:
|
||||||
|
throw new Error(`Platform '${platform}' is not supported. Supported platforms: 'darwin', 'linux', 'win32'`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
convertVersionToSemver(version) {
|
||||||
|
const major = version.version[0];
|
||||||
|
const minor = version.version[1];
|
||||||
|
const patch = version.version[2];
|
||||||
|
return `${major}.${minor}.${patch}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.MicrosoftDistributions = MicrosoftDistributions;
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
/* 197 */
|
/* 197 */
|
||||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
@ -56004,6 +56133,7 @@ const installer_2 = __webpack_require__(834);
|
||||||
const installer_3 = __webpack_require__(584);
|
const installer_3 = __webpack_require__(584);
|
||||||
const installer_4 = __webpack_require__(439);
|
const installer_4 = __webpack_require__(439);
|
||||||
const installer_5 = __webpack_require__(507);
|
const installer_5 = __webpack_require__(507);
|
||||||
|
const installer_6 = __webpack_require__(196);
|
||||||
var JavaDistribution;
|
var JavaDistribution;
|
||||||
(function (JavaDistribution) {
|
(function (JavaDistribution) {
|
||||||
JavaDistribution["Adopt"] = "adopt";
|
JavaDistribution["Adopt"] = "adopt";
|
||||||
|
@ -56013,6 +56143,7 @@ var JavaDistribution;
|
||||||
JavaDistribution["Zulu"] = "zulu";
|
JavaDistribution["Zulu"] = "zulu";
|
||||||
JavaDistribution["Liberica"] = "liberica";
|
JavaDistribution["Liberica"] = "liberica";
|
||||||
JavaDistribution["JdkFile"] = "jdkfile";
|
JavaDistribution["JdkFile"] = "jdkfile";
|
||||||
|
JavaDistribution["Microsoft"] = "microsoft";
|
||||||
})(JavaDistribution || (JavaDistribution = {}));
|
})(JavaDistribution || (JavaDistribution = {}));
|
||||||
function getJavaDistribution(distributionName, installerOptions, jdkFile) {
|
function getJavaDistribution(distributionName, installerOptions, jdkFile) {
|
||||||
switch (distributionName) {
|
switch (distributionName) {
|
||||||
|
@ -56029,6 +56160,8 @@ function getJavaDistribution(distributionName, installerOptions, jdkFile) {
|
||||||
return new installer_2.ZuluDistribution(installerOptions);
|
return new installer_2.ZuluDistribution(installerOptions);
|
||||||
case JavaDistribution.Liberica:
|
case JavaDistribution.Liberica:
|
||||||
return new installer_5.LibericaDistributions(installerOptions);
|
return new installer_5.LibericaDistributions(installerOptions);
|
||||||
|
case JavaDistribution.Microsoft:
|
||||||
|
return new installer_6.MicrosoftDistributions(installerOptions);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { ZuluDistribution } from './zulu/installer';
|
||||||
import { AdoptDistribution, AdoptImplementation } from './adopt/installer';
|
import { AdoptDistribution, AdoptImplementation } from './adopt/installer';
|
||||||
import { TemurinDistribution, TemurinImplementation } from './temurin/installer';
|
import { TemurinDistribution, TemurinImplementation } from './temurin/installer';
|
||||||
import { LibericaDistributions } from './liberica/installer';
|
import { LibericaDistributions } from './liberica/installer';
|
||||||
|
import { MicrosoftDistributions } from './microsoft/installer';
|
||||||
|
|
||||||
enum JavaDistribution {
|
enum JavaDistribution {
|
||||||
Adopt = 'adopt',
|
Adopt = 'adopt',
|
||||||
|
@ -13,7 +14,8 @@ enum JavaDistribution {
|
||||||
Temurin = 'temurin',
|
Temurin = 'temurin',
|
||||||
Zulu = 'zulu',
|
Zulu = 'zulu',
|
||||||
Liberica = 'liberica',
|
Liberica = 'liberica',
|
||||||
JdkFile = 'jdkfile'
|
JdkFile = 'jdkfile',
|
||||||
|
Microsoft = 'microsoft'
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getJavaDistribution(
|
export function getJavaDistribution(
|
||||||
|
@ -35,6 +37,8 @@ export function getJavaDistribution(
|
||||||
return new ZuluDistribution(installerOptions);
|
return new ZuluDistribution(installerOptions);
|
||||||
case JavaDistribution.Liberica:
|
case JavaDistribution.Liberica:
|
||||||
return new LibericaDistributions(installerOptions);
|
return new LibericaDistributions(installerOptions);
|
||||||
|
case JavaDistribution.Microsoft:
|
||||||
|
return new MicrosoftDistributions(installerOptions);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
115
src/distributions/microsoft/installer.ts
Normal file
115
src/distributions/microsoft/installer.ts
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
import { JavaBase } from '../base-installer';
|
||||||
|
import { JavaDownloadRelease, JavaInstallerOptions, JavaInstallerResults } from '../base-models';
|
||||||
|
import semver from 'semver';
|
||||||
|
import { extractJdkFile, getDownloadArchiveExtension, isVersionSatisfies } from '../../util';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import { MicrosoftVersion, PlatformOptions } from './models';
|
||||||
|
import * as tc from '@actions/tool-cache';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
export class MicrosoftDistributions extends JavaBase {
|
||||||
|
constructor(installerOptions: JavaInstallerOptions) {
|
||||||
|
super('Microsoft', installerOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async downloadTool(javaRelease: JavaDownloadRelease): Promise<JavaInstallerResults> {
|
||||||
|
core.info(
|
||||||
|
`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`
|
||||||
|
);
|
||||||
|
const javaArchivePath = await tc.downloadTool(javaRelease.url);
|
||||||
|
|
||||||
|
core.info(`Extracting Java archive...`);
|
||||||
|
const extension = getDownloadArchiveExtension();
|
||||||
|
const extractedJavaPath = await extractJdkFile(javaArchivePath, extension);
|
||||||
|
|
||||||
|
const archiveName = fs.readdirSync(extractedJavaPath)[0];
|
||||||
|
const archivePath = path.join(extractedJavaPath, archiveName);
|
||||||
|
|
||||||
|
const javaPath = await tc.cacheDir(
|
||||||
|
archivePath,
|
||||||
|
this.toolcacheFolderName,
|
||||||
|
this.getToolcacheVersionName(javaRelease.version),
|
||||||
|
this.architecture
|
||||||
|
);
|
||||||
|
|
||||||
|
return { version: javaRelease.version, path: javaPath };
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async findPackageForDownload(range: string): Promise<JavaDownloadRelease> {
|
||||||
|
if (this.architecture !== 'x64' && this.architecture !== 'aarch64') {
|
||||||
|
throw new Error(`Unsupported architecture: ${this.architecture}`);
|
||||||
|
}
|
||||||
|
const availableVersionsRaw = await this.getAvailableVersions();
|
||||||
|
|
||||||
|
const opts = this.getPlatformOption();
|
||||||
|
const availableVersions = availableVersionsRaw.map(item => ({
|
||||||
|
url: `https://aka.ms/download-jdk/microsoft-jdk-${item.version.join('.')}-${opts.os}-${
|
||||||
|
this.architecture
|
||||||
|
}.${opts.archive}`,
|
||||||
|
version: this.convertVersionToSemver(item)
|
||||||
|
}));
|
||||||
|
|
||||||
|
const satisfiedVersion = availableVersions
|
||||||
|
.filter(item => isVersionSatisfies(range, item.version))
|
||||||
|
.sort((a, b) => -semver.compareBuild(a.version, b.version))[0];
|
||||||
|
|
||||||
|
if (!satisfiedVersion) {
|
||||||
|
const availableOptions = availableVersions.map(item => item.version).join(', ');
|
||||||
|
const availableOptionsMessage = availableOptions
|
||||||
|
? `\nAvailable versions: ${availableOptions}`
|
||||||
|
: '';
|
||||||
|
throw new Error(
|
||||||
|
`Could not find satisfied version for SemVer ${range}. ${availableOptionsMessage}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return satisfiedVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async getAvailableVersions(): Promise<MicrosoftVersion[]> {
|
||||||
|
// TODO get these dynamically!
|
||||||
|
// We will need Microsoft to add an endpoint where we can query for versions.
|
||||||
|
const jdkVersions = [
|
||||||
|
{
|
||||||
|
version: [17, 0, 1, 12, 1]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: [16, 0, 2, 7, 1]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// M1 is only supported for Java 16 & 17
|
||||||
|
if (process.platform !== 'darwin' || this.architecture !== 'aarch64') {
|
||||||
|
jdkVersions.push({
|
||||||
|
version: [11, 0, 13, 8, 1]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return jdkVersions;
|
||||||
|
}
|
||||||
|
|
||||||
|
private getPlatformOption(
|
||||||
|
platform: NodeJS.Platform = process.platform /* for testing */
|
||||||
|
): PlatformOptions {
|
||||||
|
switch (platform) {
|
||||||
|
case 'darwin':
|
||||||
|
return { archive: 'tar.gz', os: 'macos' };
|
||||||
|
case 'win32':
|
||||||
|
return { archive: 'zip', os: 'windows' };
|
||||||
|
case 'linux':
|
||||||
|
return { archive: 'tar.gz', os: 'linux' };
|
||||||
|
default:
|
||||||
|
throw new Error(
|
||||||
|
`Platform '${platform}' is not supported. Supported platforms: 'darwin', 'linux', 'win32'`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private convertVersionToSemver(version: MicrosoftVersion): string {
|
||||||
|
const major = version.version[0];
|
||||||
|
const minor = version.version[1];
|
||||||
|
const patch = version.version[2];
|
||||||
|
return `${major}.${minor}.${patch}`;
|
||||||
|
}
|
||||||
|
}
|
12
src/distributions/microsoft/models.ts
Normal file
12
src/distributions/microsoft/models.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
type OsVersions = 'linux' | 'macos' | 'windows';
|
||||||
|
type ArchiveType = 'tar.gz' | 'zip';
|
||||||
|
|
||||||
|
export interface PlatformOptions {
|
||||||
|
archive: ArchiveType;
|
||||||
|
os: OsVersions;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MicrosoftVersion {
|
||||||
|
downloadUrl?: string;
|
||||||
|
version: Array<number>;
|
||||||
|
}
|
Loading…
Reference in a new issue