From 359e84cbc9ffc5a06e082f8ec9e61c46cd2f2137 Mon Sep 17 00:00:00 2001 From: Imran Ismail Date: Fri, 25 Sep 2020 22:14:20 +0800 Subject: [PATCH] Cache by requested version name --- __tests__/main.test.ts | 34 +++++++++++++++++------------- jest.config.js | 3 ++- src/installer.ts | 47 ++++++++++++++++++++++++------------------ 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 39d51fd..6cfda71 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -17,18 +17,24 @@ describe('installer tests', () => { beforeAll(async () => { await io.rmRF(toolDir) await io.rmRF(tempDir) - }, 100000) + }) - afterAll(async () => { - await io.rmRF(toolDir) - await io.rmRF(tempDir) - }, 100000) + it('Acquires the max satisfying version range', async () => { + await installer.getKustomize('~> 3.0') + const kustomizeDir = path.join(toolDir, 'kustomize', '~> 3.0', os.arch()) + expect(fs.existsSync(`${kustomizeDir}.complete`)).toBe(true) - it('Acquires the latest kustomize version 3.x successfully', () => { - expect(async () => await installer.getKustomize('3.x')).not.toThrow() - }, 100000) + if (IS_WINDOWS) { + expect(fs.existsSync(path.join(kustomizeDir, 'kustomize.exe'))).toBe(true) + } else { + expect(fs.existsSync(path.join(kustomizeDir, 'kustomize'))).toBe(true) + expect(() => + fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK) + ).not.toThrow() + } + }) - it('Acquires kustomize version 3.2.0 successfully', async () => { + it('Acquires kustomize version 3.2.0', async () => { await installer.getKustomize('3.2.0') const kustomizeDir = path.join(toolDir, 'kustomize', '3.2.0', os.arch()) @@ -42,9 +48,9 @@ describe('installer tests', () => { fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK) ).not.toThrow() } - }, 100000) + }) - it('Acquires kustomize version 3.2.1 successfully', async () => { + it('Acquires kustomize version 3.2.1', async () => { await installer.getKustomize('3.2.1') const kustomizeDir = path.join(toolDir, 'kustomize', '3.2.1', os.arch()) @@ -58,9 +64,9 @@ describe('installer tests', () => { fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK) ).not.toThrow() } - }, 100000) + }) - it('Acquires kustomize version 3.3.0 successfully', async () => { + it('Acquires kustomize version 3.3.0', async () => { await installer.getKustomize('3.3.0') const kustomizeDir = path.join(toolDir, 'kustomize', '3.3.0', os.arch()) @@ -74,7 +80,7 @@ describe('installer tests', () => { fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK) ).not.toThrow() } - }, 100000) + }) it('Throws if no location contains correct kustomize version', async () => { let thrown = false diff --git a/jest.config.js b/jest.config.js index 563d4cc..4c17f05 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,8 +4,9 @@ module.exports = { testEnvironment: 'node', testMatch: ['**/*.test.ts'], testRunner: 'jest-circus/runner', + testTimeout: 60000, transform: { '^.+\\.ts$': 'ts-jest' }, verbose: true -} \ No newline at end of file +} diff --git a/src/installer.ts b/src/installer.ts index 4038e83..0d4a34c 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -28,26 +28,31 @@ if (!tempDirectory) { tempDirectory = path.join(baseLocation, 'actions', 'temp') } -export async function getKustomize(versionSpec: string): Promise { - let toolPath = cache.find('kustomize', versionSpec) +export async function getKustomize(targetVersion: string): Promise { + if (!semver.validRange(targetVersion)) + throw new Error(`invalid semver requested: ${targetVersion}`) - if (!toolPath) { - const version = await getMaxSatisfyingVersion(versionSpec) - toolPath = await acquireVersion(version) + let kustomizePath = cache.find('kustomize', targetVersion) + + if (!kustomizePath) { + const version = await getMaxSatisfyingVersion(targetVersion) + kustomizePath = await acquireVersion(version) } - return core.addPath(toolPath) + return core.addPath(kustomizePath) } interface Version { - name: string + resolved: string + target: string url: string } -async function getMaxSatisfyingVersion(versionSpec: string): Promise { - const versionRange = semver.validRange(versionSpec) - const downloadUrls: Map = new Map() - const versions: string[] = [] +async function getMaxSatisfyingVersion( + targetVersion: string +): Promise { + const version = {target: targetVersion} + const availableVersions: Map = new Map() for await (const response of octokit.paginate.iterator( octokit.repos.listReleases, @@ -68,24 +73,26 @@ async function getMaxSatisfyingVersion(versionSpec: string): Promise { const version = (versionRegex.exec(release.name) || []).shift() if (version != null) { - downloadUrls.set(version, matchingAsset.browser_download_url) - versions.push(version) + availableVersions.set(version, matchingAsset.browser_download_url) } } } } - const versionToDownload = semver.maxSatisfying(versions, versionRange) + const resolved = semver.maxSatisfying( + [...availableVersions.keys()], + version.target + ) - if (!versionToDownload) { + if (!resolved) { throw new Error( - `Unable to find Kustomize version '${versionSpec}' for platform '${platform}' and architecture ${arch}.` + `Unable to find Kustomize version '${version.target}' for platform '${platform}' and architecture ${arch}.` ) } - const downloadUrl = downloadUrls.get(versionToDownload) as string + const url = availableVersions.get(resolved) as string - return {name: versionToDownload, url: downloadUrl} + return {...version, resolved, url} } async function acquireVersion(version: Version): Promise { @@ -97,7 +104,7 @@ async function acquireVersion(version: Version): Promise { toolPath = await cache.downloadTool(version.url) } catch (err) { core.debug(err) - throw new Error(`Failed to download version ${version.name}: ${err}`) + throw new Error(`Failed to download version ${version.target}: ${err}`) } if (version.url.endsWith('.tar.gz')) { @@ -112,5 +119,5 @@ async function acquireVersion(version: Version): Promise { break } - return await cache.cacheFile(toolPath, toolFilename, toolName, version.name) + return await cache.cacheFile(toolPath, toolFilename, toolName, version.target) }