add changes for check-latest

This commit is contained in:
Dmitry Shibanov 2021-03-18 12:18:52 +03:00
parent 804a60faf9
commit 8f3a7c87ff
9 changed files with 3363 additions and 9258 deletions

View file

@ -70,6 +70,43 @@ 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-major-minor-versions-with-check-latest:
name: ${{ matrix.distribution }} ${{ matrix.version }} (jdk-x64) - ${{ matrix.os }}
needs: setup-java-major-versions
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
distribution: ['adopt', 'zulu']
version:
- '11.0'
- '8.0.282'
- '11.0.2+7'
include:
- distribution: 'adopt'
version: '12.0.2+10.1'
os: macos-latest
- distribution: 'adopt'
version: '12.0.2+10.1'
os: windows-latest
- distribution: 'adopt'
version: '12.0.2+10.1'
os: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: setup-java
uses: ./
id: setup-java
with:
java-version: ${{ matrix.version }}
distribution: ${{ matrix.distribution }}
check-latest: true
- name: Verify Java
run: bash __tests__/verify-java.sh "${{ matrix.version }}" "${{ steps.setup-java.outputs.path }}"
shell: bash
setup-java-ea-versions-zulu: setup-java-ea-versions-zulu:
name: zulu ${{ matrix.version }} (jdk-x64) - ${{ matrix.os }} name: zulu ${{ matrix.version }} (jdk-x64) - ${{ matrix.os }}
needs: setup-java-major-minor-versions needs: setup-java-major-minor-versions

View file

@ -19,13 +19,13 @@ class EmptyJavaBase extends JavaBase {
protected async downloadTool(javaRelease: JavaDownloadRelease): Promise<JavaInstallerResults> { protected async downloadTool(javaRelease: JavaDownloadRelease): Promise<JavaInstallerResults> {
return { return {
version: '11.0.8', version: '11.0.9',
path: `/toolcache/${this.toolcacheFolderName}/11.0.8/${this.architecture}` path: `toolcache/${this.toolcacheFolderName}/11.0.9/${this.architecture}`
}; };
} }
protected async findPackageForDownload(range: string): Promise<JavaDownloadRelease> { protected async findPackageForDownload(range: string): Promise<JavaDownloadRelease> {
const availableVersion = '11.0.8'; const availableVersion = '11.0.9';
if (!semver.satisfies(availableVersion, range)) { if (!semver.satisfies(availableVersion, range)) {
throw new Error('Available version not found'); throw new Error('Available version not found');
} }
@ -38,7 +38,7 @@ class EmptyJavaBase extends JavaBase {
} }
describe('findInToolcache', () => { describe('findInToolcache', () => {
const actualJavaVersion = '11.1.10'; const actualJavaVersion = '11.0.8';
const javaPath = path.join('Java_Empty_jdk', actualJavaVersion, 'x64'); const javaPath = path.join('Java_Empty_jdk', actualJavaVersion, 'x64');
let mockJavaBase: EmptyJavaBase; let mockJavaBase: EmptyJavaBase;
@ -62,18 +62,30 @@ describe('findInToolcache', () => {
{ version: actualJavaVersion, path: javaPath } { version: actualJavaVersion, path: javaPath }
], ],
[ [
{ version: '11.1', architecture: 'x64', packageType: 'jdk' }, { version: '11.0', architecture: 'x64', packageType: 'jdk' },
{ version: actualJavaVersion, path: javaPath } { version: actualJavaVersion, path: javaPath }
], ],
[ [
{ version: '11.1.10', architecture: 'x64', packageType: 'jdk' }, { version: '11.0.8', architecture: 'x64', packageType: 'jdk' },
{ version: actualJavaVersion, path: javaPath }
],
[
{ version: '11', architecture: 'x64', packageType: 'jdk', checkLatest: true },
{ version: actualJavaVersion, path: javaPath }
],
[
{ version: '11.0', architecture: 'x64', packageType: 'jdk', checkLatest: true },
{ version: actualJavaVersion, path: javaPath }
],
[
{ version: '11.0.8', architecture: 'x64', packageType: 'jdk', checkLatest: true },
{ version: actualJavaVersion, path: javaPath } { version: actualJavaVersion, path: javaPath }
], ],
[{ version: '11', architecture: 'x64', packageType: 'jre' }, null], [{ version: '11', architecture: 'x64', packageType: 'jre' }, null],
[{ version: '8', architecture: 'x64', packageType: 'jdk' }, null], [{ version: '8', architecture: 'x64', packageType: 'jdk' }, null],
[{ version: '11', architecture: 'x86', packageType: 'jdk' }, null], [{ version: '11', architecture: 'x86', packageType: 'jdk' }, null],
[{ version: '11', architecture: 'x86', packageType: 'jre' }, null] [{ version: '11', architecture: 'x86', packageType: 'jre' }, null]
])(`should find java for path %s -> %s`, (input, expected) => { ])(`should find java for path %o -> %o`, (input, expected) => {
spyTcFindAllVersions.mockReturnValue([actualJavaVersion]); spyTcFindAllVersions.mockReturnValue([actualJavaVersion]);
spyGetToolcachePath.mockImplementation( spyGetToolcachePath.mockImplementation(
(toolname: string, javaVersion: string, architecture: string) => { (toolname: string, javaVersion: string, architecture: string) => {
@ -122,8 +134,10 @@ describe('findInToolcache', () => {
}); });
describe('setupJava', () => { describe('setupJava', () => {
const actualJavaVersion = '11.1.10'; const actualJavaVersion = '11.0.8';
const installedJavaVersion = '11.0.9';
const javaPath = path.join('Java_Empty_jdk', actualJavaVersion, 'x86'); const javaPath = path.join('Java_Empty_jdk', actualJavaVersion, 'x86');
const javaPathInstalled = path.join('toolcache', 'Java_Empty_jdk', installedJavaVersion, 'x86');
let mockJavaBase: EmptyJavaBase; let mockJavaBase: EmptyJavaBase;
@ -181,31 +195,54 @@ describe('setupJava', () => {
{ version: actualJavaVersion, path: javaPath } { version: actualJavaVersion, path: javaPath }
], ],
[ [
{ version: '11.1', architecture: 'x86', packageType: 'jdk' }, { version: '11.0', architecture: 'x86', packageType: 'jdk' },
{ version: actualJavaVersion, path: javaPath } { version: actualJavaVersion, path: javaPath }
], ],
[ [
{ version: '11.1.10', architecture: 'x86', packageType: 'jdk' }, { version: '11.0.8', architecture: 'x86', packageType: 'jdk' },
{ version: actualJavaVersion, path: javaPath } { version: actualJavaVersion, path: javaPath }
] ]
])('should find java locally for %s', (input, expected) => { ])('should find java locally for %o', (input, expected) => {
mockJavaBase = new EmptyJavaBase(input); mockJavaBase = new EmptyJavaBase(input);
expect(mockJavaBase.setupJava()).resolves.toEqual(expected); expect(mockJavaBase.setupJava()).resolves.toEqual(expected);
expect(spyGetToolcachePath).toHaveBeenCalled(); expect(spyGetToolcachePath).toHaveBeenCalled();
}); });
it.each([
[
{ version: '11', architecture: 'x86', packageType: 'jdk', checkLatest: true },
{ version: installedJavaVersion, path: javaPathInstalled }
],
[
{ version: '11.0', architecture: 'x86', packageType: 'jdk', checkLatest: true },
{ version: installedJavaVersion, path: javaPathInstalled }
],
[
{ version: '11.0.x', architecture: 'x86', packageType: 'jdk', checkLatest: true },
{ version: installedJavaVersion, path: javaPathInstalled }
]
])('should check the latest java version for %o', async (input, expected) => {
mockJavaBase = new EmptyJavaBase(input);
await expect(mockJavaBase.setupJava()).resolves.toEqual(expected);
expect(spyGetToolcachePath).toHaveBeenCalled();
expect(spyCoreInfo).toHaveBeenCalledWith(
`Java ${input.version} was not found in tool-cache. Trying to download...`
);
expect(spyCoreInfo).toHaveBeenCalledWith(`Java ${installedJavaVersion} was downloaded`);
});
it.each([ it.each([
[ [
{ version: '11', architecture: 'x86', packageType: 'jre' }, { version: '11', architecture: 'x86', packageType: 'jre' },
{ path: `/toolcache/Java_Empty_jre/11.0.8/x86`, version: '11.0.8' } { path: `toolcache/Java_Empty_jre/11.0.9/x86`, version: '11.0.9' }
], ],
[ [
{ version: '11', architecture: 'x64', packageType: 'jdk' }, { version: '11', architecture: 'x64', packageType: 'jdk' },
{ path: `/toolcache/Java_Empty_jdk/11.0.8/x64`, version: '11.0.8' } { path: `toolcache/Java_Empty_jdk/11.0.9/x64`, version: '11.0.9' }
], ],
[ [
{ version: '11', architecture: 'x64', packageType: 'jre' }, { version: '11', architecture: 'x64', packageType: 'jre' },
{ path: `/toolcache/Java_Empty_jre/11.0.8/x64`, version: '11.0.8' } { path: `toolcache/Java_Empty_jre/11.0.9/x64`, version: '11.0.9' }
] ]
])('download java with configuration %s', async (input, expected) => { ])('download java with configuration %s', async (input, expected) => {
mockJavaBase = new EmptyJavaBase(input); mockJavaBase = new EmptyJavaBase(input);

View file

@ -20,6 +20,10 @@ inputs:
jdkFile: jdkFile:
description: 'Path to where the compressed JDK is located' description: 'Path to where the compressed JDK is located'
required: false required: false
check-latest:
description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec'
required: false
default: false
server-id: server-id:
description: 'ID of the distributionManagement repository in the pom.xml description: 'ID of the distributionManagement repository in the pom.xml
file. Default is `github`' file. Default is `github`'

6199
dist/cleanup/index.js vendored

File diff suppressed because it is too large Load diff

6298
dist/setup/index.js vendored

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,7 @@ export const INPUT_ARCHITECTURE = 'architecture';
export const INPUT_JAVA_PACKAGE = 'java-package'; export const INPUT_JAVA_PACKAGE = 'java-package';
export const INPUT_DISTRIBUTION = 'distribution'; export const INPUT_DISTRIBUTION = 'distribution';
export const INPUT_JDK_FILE = 'jdkFile'; export const INPUT_JDK_FILE = 'jdkFile';
export const INPUT_CHECK_LATEST = 'check-latest';
export const INPUT_SERVER_ID = 'server-id'; export const INPUT_SERVER_ID = 'server-id';
export const INPUT_SERVER_USERNAME = 'server-username'; export const INPUT_SERVER_USERNAME = 'server-username';
export const INPUT_SERVER_PASSWORD = 'server-password'; export const INPUT_SERVER_PASSWORD = 'server-password';

View file

@ -12,6 +12,7 @@ export abstract class JavaBase {
protected architecture: string; protected architecture: string;
protected packageType: string; protected packageType: string;
protected stable: boolean; protected stable: boolean;
protected checkLatest: boolean;
constructor(protected distribution: string, installerOptions: JavaInstallerOptions) { constructor(protected distribution: string, installerOptions: JavaInstallerOptions) {
this.http = new httpm.HttpClient('actions/setup-java', undefined, { this.http = new httpm.HttpClient('actions/setup-java', undefined, {
@ -24,6 +25,7 @@ export abstract class JavaBase {
)); ));
this.architecture = installerOptions.architecture; this.architecture = installerOptions.architecture;
this.packageType = installerOptions.packageType; this.packageType = installerOptions.packageType;
this.checkLatest = !!installerOptions.checkLatest;
} }
protected abstract downloadTool(javaRelease: JavaDownloadRelease): Promise<JavaInstallerResults>; protected abstract downloadTool(javaRelease: JavaDownloadRelease): Promise<JavaInstallerResults>;
@ -31,13 +33,17 @@ export abstract class JavaBase {
public async setupJava(): Promise<JavaInstallerResults> { public async setupJava(): Promise<JavaInstallerResults> {
let foundJava = this.findInToolcache(); let foundJava = this.findInToolcache();
if (foundJava) { if (foundJava && !this.checkLatest) {
core.info(`Resolved Java ${foundJava.version} from tool-cache`); core.info(`Resolved Java ${foundJava.version} from tool-cache`);
} else { } else {
core.info(`Java ${this.version} was not found in tool-cache. Trying to download...`); core.info(`Java ${this.version} was not found in tool-cache. Trying to download...`);
const javaRelease = await this.findPackageForDownload(this.version); const javaRelease = await this.findPackageForDownload(this.version);
foundJava = await this.downloadTool(javaRelease); if (foundJava?.version != javaRelease.version) {
core.info(`Java ${foundJava.version} was downloaded`); foundJava = await this.downloadTool(javaRelease);
core.info(`Java ${foundJava.version} was downloaded`);
}
core.info(`Java ${foundJava.version} was resolved`);
} }
core.info(`Setting Java ${foundJava.version} as the default`); core.info(`Setting Java ${foundJava.version} as the default`);

View file

@ -2,6 +2,7 @@ export interface JavaInstallerOptions {
version: string; version: string;
architecture: string; architecture: string;
packageType: string; packageType: string;
checkLatest?: boolean;
} }
export interface JavaInstallerResults { export interface JavaInstallerResults {

View file

@ -13,11 +13,13 @@ async function run() {
const architecture = core.getInput(constants.INPUT_ARCHITECTURE); const architecture = core.getInput(constants.INPUT_ARCHITECTURE);
const packageType = core.getInput(constants.INPUT_JAVA_PACKAGE); const packageType = core.getInput(constants.INPUT_JAVA_PACKAGE);
const jdkFile = core.getInput(constants.INPUT_JDK_FILE); const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
const checkLatest = core.getInput(constants.INPUT_CHECK_LATEST);
const installerOptions: JavaInstallerOptions = { const installerOptions: JavaInstallerOptions = {
architecture, architecture,
packageType, packageType,
version version,
checkLatest: checkLatest ? false : checkLatest.toLowerCase() === 'true'
}; };
const distribution = getJavaDistribution(distributionName, installerOptions, jdkFile); const distribution = getJavaDistribution(distributionName, installerOptions, jdkFile);