diff --git a/README.md b/README.md index c174abe..ced5928 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Currently, the following distributions are supported: The action has a built-in functionality for caching and restoring dependencies. It uses [actions/cache](https://github.com/actions/cache) under hood for caching dependencies but requires less configuration settings. Supported package managers are gradle, maven and sbt. The format of the used cache key is `setup-java-${{ platform }}-${{ packageManager }}-${{ fileHash }}`, where the hash is based on the following files: - gradle: `**/*.gradle*`, `**/gradle-wrapper.properties`, `buildSrc/**/Versions.kt`, `buildSrc/**/Dependencies.kt`, and `gradle/*.versions.toml` - maven: `**/pom.xml` -- sbt: all sbt build definition files `**/*.sbt`, `**/project/build.properties`, `**/project/**.{scala,sbt}` +- sbt: all sbt build definition files `**/*.sbt`, `**/project/build.properties`, `**/project/**.scala`, `**/project/**.sbt` The workflow output `cache-hit` is set to indicate if an exact match was found for the key [as actions/cache does](https://github.com/actions/cache/tree/main#outputs). diff --git a/__tests__/cache.test.ts b/__tests__/cache.test.ts index 8bcb635..ae56844 100644 --- a/__tests__/cache.test.ts +++ b/__tests__/cache.test.ts @@ -145,7 +145,7 @@ describe('dependency cache', () => { await expect(restore('sbt')).rejects.toThrow( `No file in ${projectRoot( workspace - )} matched to [**/*.sbt,**/project/build.properties,**/project/**.{scala,sbt}], make sure you have checked out the target repository` + )} matched to [**/*.sbt,**/project/build.properties,**/project/**.scala,**/project/**.sbt], make sure you have checked out the target repository` ); }); it('downloads cache', async () => { @@ -156,6 +156,28 @@ describe('dependency cache', () => { expect(spyWarning).not.toHaveBeenCalled(); expect(spyInfo).toHaveBeenCalledWith('sbt cache is not found'); }); + it('detects scala and sbt changes under **/project/ folder', async () => { + createFile(join(workspace, 'build.sbt')); + createDirectory(join(workspace, 'project')); + createFile(join(workspace, 'project/DependenciesV1.scala')); + + await restore('sbt'); + const firstCall = spySaveState.mock.calls.toString(); + + spySaveState.mockClear(); + await restore('sbt'); + const secondCall = spySaveState.mock.calls.toString(); + + // Make sure multiple restores produce the same cache + expect(firstCall).toBe(secondCall); + + spySaveState.mockClear(); + createFile(join(workspace, 'project/DependenciesV2.scala')); + await restore('sbt'); + const thirdCall = spySaveState.mock.calls.toString(); + + expect(firstCall).not.toBe(thirdCall); + }); }); }); describe('save', () => { diff --git a/__tests__/distributors/local-installer.test.ts b/__tests__/distributors/local-installer.test.ts index 717f97a..8e9d5d4 100644 --- a/__tests__/distributors/local-installer.test.ts +++ b/__tests__/distributors/local-installer.test.ts @@ -214,6 +214,93 @@ describe('setupJava', () => { ); }); + it('java is resolved from toolcache including Contents/Home on MacOS', async () => { + const inputs = { + version: actualJavaVersion, + architecture: 'x86', + packageType: 'jdk', + checkLatest: false + }; + const jdkFile = 'not_existing_one'; + const expected = { + version: actualJavaVersion, + path: path.join( + 'Java_jdkfile_jdk', + inputs.version, + inputs.architecture, + 'Contents', + 'Home' + ) + }; + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { + value: 'darwin' + }); + + spyFsStat = jest.spyOn(fs, 'existsSync'); + spyFsStat.mockImplementation((file: string) => { + return file.endsWith('Home'); + }); + + mockJavaBase = new LocalDistribution(inputs, jdkFile); + await expect(mockJavaBase.setupJava()).resolves.toEqual(expected); + expect(spyGetToolcachePath).toHaveBeenCalled(); + expect(spyCoreInfo).toHaveBeenCalledWith( + `Resolved Java ${actualJavaVersion} from tool-cache` + ); + expect(spyCoreInfo).not.toHaveBeenCalledWith( + `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...` + ); + + Object.defineProperty(process, 'platform', { + value: originalPlatform + }); + }); + + it('java is unpacked from jdkfile including Contents/Home on MacOS', async () => { + const inputs = { + version: '11.0.289', + architecture: 'x86', + packageType: 'jdk', + checkLatest: false + }; + const jdkFile = expectedJdkFile; + const expected = { + version: '11.0.289', + path: path.join( + 'Java_jdkfile_jdk', + inputs.version, + inputs.architecture, + 'Contents', + 'Home' + ) + }; + const originalPlatform = process.platform; + Object.defineProperty(process, 'platform', { + value: 'darwin' + }); + spyFsStat = jest.spyOn(fs, 'existsSync'); + spyFsStat.mockImplementation((file: string) => { + return file.endsWith('Home'); + }); + + mockJavaBase = new LocalDistribution(inputs, jdkFile); + await expect(mockJavaBase.setupJava()).resolves.toEqual(expected); + expect(spyTcFindAllVersions).toHaveBeenCalled(); + expect(spyCoreInfo).not.toHaveBeenCalledWith( + `Resolved Java ${actualJavaVersion} from tool-cache` + ); + expect(spyCoreInfo).toHaveBeenCalledWith( + `Extracting Java from '${jdkFile}'` + ); + expect(spyCoreInfo).toHaveBeenCalledWith( + `Java ${inputs.version} was not found in tool-cache. Trying to unpack JDK file...` + ); + Object.defineProperty(process, 'platform', { + value: originalPlatform + }); + }); + it.each([ [ { diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index 701be2e..f8b8a72 100644 --- a/__tests__/distributors/zulu-installer.test.ts +++ b/__tests__/distributors/zulu-installer.test.ts @@ -227,22 +227,3 @@ describe('findPackageForDownload', () => { ).rejects.toThrow(/Could not find satisfied version for semver */); }); }); - -describe('convertVersionToSemver', () => { - it.each([ - [[12], '12'], - [[12, 0], '12.0'], - [[12, 0, 2], '12.0.2'], - [[12, 0, 2, 1], '12.0.2+1'], - [[12, 0, 2, 1, 3], '12.0.2+1'] - ])('%s -> %s', (input: number[], expected: string) => { - const distribution = new ZuluDistribution({ - version: '18', - architecture: 'x86', - packageType: 'jdk', - checkLatest: false - }); - const actual = distribution['convertVersionToSemver'](input); - expect(actual).toBe(expected); - }); -}); diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index 51de35a..bb7560d 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -1,6 +1,10 @@ import * as cache from '@actions/cache'; import * as core from '@actions/core'; -import {isVersionSatisfies, isCacheFeatureAvailable} from '../src/util'; +import { + convertVersionToSemver, + isVersionSatisfies, + isCacheFeatureAvailable +} from '../src/util'; jest.mock('@actions/cache'); jest.mock('@actions/core'); @@ -63,3 +67,16 @@ describe('isCacheFeatureAvailable', () => { expect(isCacheFeatureAvailable()).toBe(true); }); }); + +describe('convertVersionToSemver', () => { + it.each([ + ['12', '12'], + ['12.0', '12.0'], + ['12.0.2', '12.0.2'], + ['12.0.2.1', '12.0.2+1'], + ['12.0.2.1.0', '12.0.2+1.0'] + ])('%s -> %s', (input: string, expected: string) => { + const actual = convertVersionToSemver(input); + expect(actual).toBe(expected); + }); +}); diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 4481094..d5ad196 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -68416,7 +68416,8 @@ const supportedPackageManager = [ pattern: [ '**/*.sbt', '**/project/build.properties', - '**/project/**.{scala,sbt}' + '**/project/**.scala', + '**/project/**.sbt' ] } ]; @@ -68785,7 +68786,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getVersionFromFileContent = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0; +exports.convertVersionToSemver = exports.getVersionFromFileContent = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0; const os_1 = __importDefault(__nccwpck_require__(2037)); const path_1 = __importDefault(__nccwpck_require__(1017)); const fs = __importStar(__nccwpck_require__(7147)); @@ -68912,6 +68913,16 @@ exports.getVersionFromFileContent = getVersionFromFileContent; function avoidOldNotation(content) { return content.startsWith('1.') ? content.substring(2) : content; } +function convertVersionToSemver(version) { + // Some distributions may use semver-like notation (12.10.2.1, 12.10.2.1.1) + const versionArray = Array.isArray(version) ? version : version.split('.'); + const mainVersion = versionArray.slice(0, 3).join('.'); + if (versionArray.length > 3) { + return `${mainVersion}+${versionArray.slice(3).join('.')}`; + } + return mainVersion; +} +exports.convertVersionToSemver = convertVersionToSemver; /***/ }), diff --git a/dist/setup/index.js b/dist/setup/index.js index 2d095d4..e0a4424 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -103621,7 +103621,8 @@ const supportedPackageManager = [ pattern: [ '**/*.sbt', '**/project/build.properties', - '**/project/**.{scala,sbt}' + '**/project/**.scala', + '**/project/**.sbt' ] } ]; @@ -104208,7 +104209,7 @@ class CorrettoDistribution extends base_installer_1.JavaBase { .filter(item => item.version == version) .map(item => { return { - version: item.correttoVersion, + version: util_1.convertVersionToSemver(item.correttoVersion), url: item.downloadLink }; }); @@ -104608,17 +104609,17 @@ class LocalDistribution extends base_installer_1.JavaBase { const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0]; const archivePath = path_1.default.join(extractedJavaPath, archiveName); const javaVersion = this.version; - let javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaVersion), this.architecture); - // for different Java distributions, postfix can exist or not so need to check both cases - if (process.platform === 'darwin' && - fs_1.default.existsSync(path_1.default.join(javaPath, constants_1.MACOS_JAVA_CONTENT_POSTFIX))) { - javaPath = path_1.default.join(javaPath, constants_1.MACOS_JAVA_CONTENT_POSTFIX); - } + const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaVersion), this.architecture); foundJava = { version: javaVersion, path: javaPath }; } + // JDK folder may contain postfix "Contents/Home" on macOS + const macOSPostfixPath = path_1.default.join(foundJava.path, constants_1.MACOS_JAVA_CONTENT_POSTFIX); + if (process.platform === 'darwin' && fs_1.default.existsSync(macOSPostfixPath)) { + foundJava.path = macOSPostfixPath; + } core.info(`Setting Java ${foundJava.version} as default`); this.setJavaDefault(foundJava.version, foundJava.path); return foundJava; @@ -105309,9 +105310,9 @@ class ZuluDistribution extends base_installer_1.JavaBase { const availableVersionsRaw = yield this.getAvailableVersions(); const availableVersions = availableVersionsRaw.map(item => { return { - version: this.convertVersionToSemver(item.jdk_version), + version: util_1.convertVersionToSemver(item.jdk_version), url: item.url, - zuluVersion: this.convertVersionToSemver(item.zulu_version) + zuluVersion: util_1.convertVersionToSemver(item.zulu_version) }; }); const satisfiedVersions = availableVersions @@ -105418,15 +105419,6 @@ class ZuluDistribution extends base_installer_1.JavaBase { return process.platform; } } - // Azul API returns jdk_version as array of digits like [11, 0, 2, 1] - convertVersionToSemver(version_array) { - const mainVersion = version_array.slice(0, 3).join('.'); - if (version_array.length > 3) { - // intentionally ignore more than 4 numbers because it is invalid semver - return `${mainVersion}+${version_array[3]}`; - } - return mainVersion; - } } exports.ZuluDistribution = ZuluDistribution; @@ -105842,7 +105834,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getVersionFromFileContent = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0; +exports.convertVersionToSemver = exports.getVersionFromFileContent = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0; const os_1 = __importDefault(__nccwpck_require__(2037)); const path_1 = __importDefault(__nccwpck_require__(1017)); const fs = __importStar(__nccwpck_require__(7147)); @@ -105969,6 +105961,16 @@ exports.getVersionFromFileContent = getVersionFromFileContent; function avoidOldNotation(content) { return content.startsWith('1.') ? content.substring(2) : content; } +function convertVersionToSemver(version) { + // Some distributions may use semver-like notation (12.10.2.1, 12.10.2.1.1) + const versionArray = Array.isArray(version) ? version : version.split('.'); + const mainVersion = versionArray.slice(0, 3).join('.'); + if (versionArray.length > 3) { + return `${mainVersion}+${versionArray.slice(3).join('.')}`; + } + return mainVersion; +} +exports.convertVersionToSemver = convertVersionToSemver; /***/ }), diff --git a/src/cache.ts b/src/cache.ts index 81d0b27..4d37664 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -56,7 +56,8 @@ const supportedPackageManager: PackageManager[] = [ pattern: [ '**/*.sbt', '**/project/build.properties', - '**/project/**.{scala,sbt}' + '**/project/**.scala', + '**/project/**.sbt' ] } ]; diff --git a/src/distributions/corretto/installer.ts b/src/distributions/corretto/installer.ts index 38384cb..1e6329c 100644 --- a/src/distributions/corretto/installer.ts +++ b/src/distributions/corretto/installer.ts @@ -2,7 +2,11 @@ import * as core from '@actions/core'; import * as tc from '@actions/tool-cache'; import fs from 'fs'; import path from 'path'; -import {extractJdkFile, getDownloadArchiveExtension} from '../../util'; +import { + extractJdkFile, + getDownloadArchiveExtension, + convertVersionToSemver +} from '../../util'; import {JavaBase} from '../base-installer'; import { JavaDownloadRelease, @@ -62,7 +66,7 @@ export class CorrettoDistribution extends JavaBase { .filter(item => item.version == version) .map(item => { return { - version: item.correttoVersion, + version: convertVersionToSemver(item.correttoVersion), url: item.downloadLink } as JavaDownloadRelease; }); diff --git a/src/distributions/local/installer.ts b/src/distributions/local/installer.ts index 72c2d27..adfac49 100644 --- a/src/distributions/local/installer.ts +++ b/src/distributions/local/installer.ts @@ -47,27 +47,28 @@ export class LocalDistribution extends JavaBase { const archivePath = path.join(extractedJavaPath, archiveName); const javaVersion = this.version; - let javaPath = await tc.cacheDir( + const javaPath = await tc.cacheDir( archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaVersion), this.architecture ); - // for different Java distributions, postfix can exist or not so need to check both cases - if ( - process.platform === 'darwin' && - fs.existsSync(path.join(javaPath, MACOS_JAVA_CONTENT_POSTFIX)) - ) { - javaPath = path.join(javaPath, MACOS_JAVA_CONTENT_POSTFIX); - } - foundJava = { version: javaVersion, path: javaPath }; } + // JDK folder may contain postfix "Contents/Home" on macOS + const macOSPostfixPath = path.join( + foundJava.path, + MACOS_JAVA_CONTENT_POSTFIX + ); + if (process.platform === 'darwin' && fs.existsSync(macOSPostfixPath)) { + foundJava.path = macOSPostfixPath; + } + core.info(`Setting Java ${foundJava.version} as default`); this.setJavaDefault(foundJava.version, foundJava.path); diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index dec9dbf..c996bb8 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -10,6 +10,7 @@ import {IZuluVersions} from './models'; import { extractJdkFile, getDownloadArchiveExtension, + convertVersionToSemver, isVersionSatisfies } from '../../util'; import { @@ -29,9 +30,9 @@ export class ZuluDistribution extends JavaBase { const availableVersionsRaw = await this.getAvailableVersions(); const availableVersions = availableVersionsRaw.map(item => { return { - version: this.convertVersionToSemver(item.jdk_version), + version: convertVersionToSemver(item.jdk_version), url: item.url, - zuluVersion: this.convertVersionToSemver(item.zulu_version) + zuluVersion: convertVersionToSemver(item.zulu_version) }; }); @@ -172,15 +173,4 @@ export class ZuluDistribution extends JavaBase { return process.platform; } } - - // Azul API returns jdk_version as array of digits like [11, 0, 2, 1] - private convertVersionToSemver(version_array: number[]) { - const mainVersion = version_array.slice(0, 3).join('.'); - if (version_array.length > 3) { - // intentionally ignore more than 4 numbers because it is invalid semver - return `${mainVersion}+${version_array[3]}`; - } - - return mainVersion; - } } diff --git a/src/util.ts b/src/util.ts index acd9e6e..fe1078d 100644 --- a/src/util.ts +++ b/src/util.ts @@ -151,3 +151,13 @@ export function getVersionFromFileContent( function avoidOldNotation(content: string): string { return content.startsWith('1.') ? content.substring(2) : content; } + +export function convertVersionToSemver(version: number[] | string) { + // Some distributions may use semver-like notation (12.10.2.1, 12.10.2.1.1) + const versionArray = Array.isArray(version) ? version : version.split('.'); + const mainVersion = versionArray.slice(0, 3).join('.'); + if (versionArray.length > 3) { + return `${mainVersion}+${versionArray.slice(3).join('.')}`; + } + return mainVersion; +}