Cache by requested version name

This commit is contained in:
Imran Ismail
2020-09-25 22:14:20 +08:00
parent 430fa071e8
commit 359e84cbc9
3 changed files with 49 additions and 35 deletions

View File

@@ -17,18 +17,24 @@ describe('installer tests', () => {
beforeAll(async () => { beforeAll(async () => {
await io.rmRF(toolDir) await io.rmRF(toolDir)
await io.rmRF(tempDir) await io.rmRF(tempDir)
}, 100000) })
afterAll(async () => { it('Acquires the max satisfying version range', async () => {
await io.rmRF(toolDir) await installer.getKustomize('~> 3.0')
await io.rmRF(tempDir) const kustomizeDir = path.join(toolDir, 'kustomize', '~> 3.0', os.arch())
}, 100000) expect(fs.existsSync(`${kustomizeDir}.complete`)).toBe(true)
it('Acquires the latest kustomize version 3.x successfully', () => { if (IS_WINDOWS) {
expect(async () => await installer.getKustomize('3.x')).not.toThrow() expect(fs.existsSync(path.join(kustomizeDir, 'kustomize.exe'))).toBe(true)
}, 100000) } 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') await installer.getKustomize('3.2.0')
const kustomizeDir = path.join(toolDir, 'kustomize', '3.2.0', os.arch()) 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) fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow() ).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') await installer.getKustomize('3.2.1')
const kustomizeDir = path.join(toolDir, 'kustomize', '3.2.1', os.arch()) 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) fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow() ).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') await installer.getKustomize('3.3.0')
const kustomizeDir = path.join(toolDir, 'kustomize', '3.3.0', os.arch()) 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) fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow() ).not.toThrow()
} }
}, 100000) })
it('Throws if no location contains correct kustomize version', async () => { it('Throws if no location contains correct kustomize version', async () => {
let thrown = false let thrown = false

View File

@@ -4,8 +4,9 @@ module.exports = {
testEnvironment: 'node', testEnvironment: 'node',
testMatch: ['**/*.test.ts'], testMatch: ['**/*.test.ts'],
testRunner: 'jest-circus/runner', testRunner: 'jest-circus/runner',
testTimeout: 60000,
transform: { transform: {
'^.+\\.ts$': 'ts-jest' '^.+\\.ts$': 'ts-jest'
}, },
verbose: true verbose: true
} }

View File

@@ -28,26 +28,31 @@ if (!tempDirectory) {
tempDirectory = path.join(baseLocation, 'actions', 'temp') tempDirectory = path.join(baseLocation, 'actions', 'temp')
} }
export async function getKustomize(versionSpec: string): Promise<void> { export async function getKustomize(targetVersion: string): Promise<void> {
let toolPath = cache.find('kustomize', versionSpec) if (!semver.validRange(targetVersion))
throw new Error(`invalid semver requested: ${targetVersion}`)
if (!toolPath) { let kustomizePath = cache.find('kustomize', targetVersion)
const version = await getMaxSatisfyingVersion(versionSpec)
toolPath = await acquireVersion(version) if (!kustomizePath) {
const version = await getMaxSatisfyingVersion(targetVersion)
kustomizePath = await acquireVersion(version)
} }
return core.addPath(toolPath) return core.addPath(kustomizePath)
} }
interface Version { interface Version {
name: string resolved: string
target: string
url: string url: string
} }
async function getMaxSatisfyingVersion(versionSpec: string): Promise<Version> { async function getMaxSatisfyingVersion(
const versionRange = semver.validRange(versionSpec) targetVersion: string
const downloadUrls: Map<string, string> = new Map() ): Promise<Version> {
const versions: string[] = [] const version = {target: targetVersion}
const availableVersions: Map<string, string> = new Map()
for await (const response of octokit.paginate.iterator( for await (const response of octokit.paginate.iterator(
octokit.repos.listReleases, octokit.repos.listReleases,
@@ -68,24 +73,26 @@ async function getMaxSatisfyingVersion(versionSpec: string): Promise<Version> {
const version = (versionRegex.exec(release.name) || []).shift() const version = (versionRegex.exec(release.name) || []).shift()
if (version != null) { if (version != null) {
downloadUrls.set(version, matchingAsset.browser_download_url) availableVersions.set(version, matchingAsset.browser_download_url)
versions.push(version)
} }
} }
} }
} }
const versionToDownload = semver.maxSatisfying(versions, versionRange) const resolved = semver.maxSatisfying(
[...availableVersions.keys()],
version.target
)
if (!versionToDownload) { if (!resolved) {
throw new Error( 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<string> { async function acquireVersion(version: Version): Promise<string> {
@@ -97,7 +104,7 @@ async function acquireVersion(version: Version): Promise<string> {
toolPath = await cache.downloadTool(version.url) toolPath = await cache.downloadTool(version.url)
} catch (err) { } catch (err) {
core.debug(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')) { if (version.url.endsWith('.tar.gz')) {
@@ -112,5 +119,5 @@ async function acquireVersion(version: Version): Promise<string> {
break break
} }
return await cache.cacheFile(toolPath, toolFilename, toolName, version.name) return await cache.cacheFile(toolPath, toolFilename, toolName, version.target)
} }