Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add action input to set download base url #113

Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ inputs:
token:
description: GitHub token. Required only if 'version' == 'latest'
required: false
downloadBaseURL:
description: 'Set the download base URL'
required: false
default: 'https://get.helm.sh'
outputs:
helm-path:
description: 'Path to the cached helm binary'
Expand Down
50 changes: 32 additions & 18 deletions src/run.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,41 +21,45 @@ describe('run.ts', () => {
})

test('getHelmDownloadURL() - return the URL to download helm for Linux', () => {
const downloadBaseURL = 'https://test.tld'

jest.spyOn(os, 'type').mockReturnValue('Linux')
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
const helmLinuxUrl = 'https://get.helm.sh/helm-v3.8.0-linux-amd64.zip'
const helmLinuxUrl = 'https://test.tld/helm-v3.8.0-linux-amd64.zip'

expect(run.getHelmDownloadURL('v3.8.0')).toBe(helmLinuxUrl)
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(helmLinuxUrl)
expect(os.type).toBeCalled()
expect(os.arch).toBeCalled()

// arm64
jest.spyOn(os, 'type').mockReturnValue('Linux')
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
const helmLinuxArm64Url =
'https://get.helm.sh/helm-v3.8.0-linux-arm64.zip'
'https://test.tld/helm-v3.8.0-linux-arm64.zip'

expect(run.getHelmDownloadURL('v3.8.0')).toBe(helmLinuxArm64Url)
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(helmLinuxArm64Url)
expect(os.type).toBeCalled()
expect(os.arch).toBeCalled()
})

test('getHelmDownloadURL() - return the URL to download helm for Darwin', () => {
const downloadBaseURL = 'https://test.tld'

jest.spyOn(os, 'type').mockReturnValue('Darwin')
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
const helmDarwinUrl = 'https://get.helm.sh/helm-v3.8.0-darwin-amd64.zip'
const helmDarwinUrl = 'https://test.tld/helm-v3.8.0-darwin-amd64.zip'

expect(run.getHelmDownloadURL('v3.8.0')).toBe(helmDarwinUrl)
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(helmDarwinUrl)
expect(os.type).toBeCalled()
expect(os.arch).toBeCalled()

// arm64
jest.spyOn(os, 'type').mockReturnValue('Darwin')
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
const helmDarwinArm64Url =
'https://get.helm.sh/helm-v3.8.0-darwin-arm64.zip'
'https://test.tld/helm-v3.8.0-darwin-arm64.zip'

expect(run.getHelmDownloadURL('v3.8.0')).toBe(helmDarwinArm64Url)
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(helmDarwinArm64Url)
expect(os.type).toBeCalled()
expect(os.arch).toBeCalled()
})
Expand All @@ -65,10 +69,12 @@ describe('run.ts', () => {
})

test('getHelmDownloadURL() - return the URL to download helm for Windows', () => {
const downloadBaseURL = 'https://test.tld'

jest.spyOn(os, 'type').mockReturnValue('Windows_NT')

const helmWindowsUrl = 'https://get.helm.sh/helm-v3.8.0-windows-amd64.zip'
expect(run.getHelmDownloadURL('v3.8.0')).toBe(helmWindowsUrl)
const helmWindowsUrl = 'https://test.tld/helm-v3.8.0-windows-amd64.zip'
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(helmWindowsUrl)
expect(os.type).toBeCalled()
})

Expand Down Expand Up @@ -193,12 +199,14 @@ describe('run.ts', () => {
return {isDirectory: () => isDirectory} as fs.Stats
})

expect(await run.downloadHelm('v4.0.0')).toBe(
const baseURL = 'https://test.tld'

expect(await run.downloadHelm(baseURL, 'v4.0.0')).toBe(
path.join('pathToCachedDir', 'helm.exe')
)
expect(toolCache.find).toBeCalledWith('helm', 'v4.0.0')
expect(toolCache.downloadTool).toBeCalledWith(
'https://get.helm.sh/helm-v4.0.0-windows-amd64.zip'
'https://test.tld/helm-v4.0.0-windows-amd64.zip'
)
expect(fs.chmodSync).toBeCalledWith('pathToTool', '777')
expect(toolCache.extractZip).toBeCalledWith('pathToTool')
Expand All @@ -215,20 +223,24 @@ describe('run.ts', () => {
})
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')

await expect(run.downloadHelm('v3.2.1')).rejects.toThrow(
'Failed to download Helm from location https://get.helm.sh/helm-v3.2.1-windows-amd64.zip'
const baseURL = 'https://test.tld'

await expect(run.downloadHelm(baseURL, 'v3.2.1')).rejects.toThrow(
'Failed to download Helm from location https://test.tld/helm-v3.2.1-windows-amd64.zip'
)
expect(toolCache.find).toBeCalledWith('helm', 'v3.2.1')
expect(toolCache.downloadTool).toBeCalledWith(
'https://get.helm.sh/helm-v3.2.1-windows-amd64.zip'
'https://test.tld/helm-v3.2.1-windows-amd64.zip'
)
})

test('downloadHelm() - return path to helm tool with same version from toolCache', async () => {
jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedDir')
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})

expect(await run.downloadHelm('v3.2.1')).toBe(
const baseURL = 'https://test.tld'

expect(await run.downloadHelm(baseURL, 'v3.2.1')).toBe(
path.join('pathToCachedDir', 'helm.exe')
)
expect(toolCache.find).toBeCalledWith('helm', 'v3.2.1')
Expand All @@ -254,12 +266,14 @@ describe('run.ts', () => {
return {isDirectory: () => isDirectory} as fs.Stats
})

await expect(run.downloadHelm('v3.2.1')).rejects.toThrow(
const baseURL = 'https://test.tld'

await expect(run.downloadHelm(baseURL, 'v3.2.1')).rejects.toThrow(
'Helm executable not found in path pathToCachedDir'
)
expect(toolCache.find).toBeCalledWith('helm', 'v3.2.1')
expect(toolCache.downloadTool).toBeCalledWith(
'https://get.helm.sh/helm-v3.2.1-windows-amd64.zip'
'https://test.tld/helm-v3.2.1-windows-amd64.zip'
)
expect(fs.chmodSync).toBeCalledWith('pathToTool', '777')
expect(toolCache.extractZip).toBeCalledWith('pathToTool')
Expand Down
22 changes: 12 additions & 10 deletions src/run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ export async function run() {
version = await getLatestHelmVersion()
}

const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})

core.startGroup(`Downloading ${version}`)
const cachedPath = await downloadHelm(version)
const cachedPath = await downloadHelm(downloadBaseURL, version)
core.endGroup()

try {
Expand Down Expand Up @@ -105,54 +107,54 @@ const LINUX = 'Linux'
const MAC_OS = 'Darwin'
const WINDOWS = 'Windows_NT'
const ARM64 = 'arm64'
export function getHelmDownloadURL(version: string): string {
export function getHelmDownloadURL(baseURL: string, version: string): string {
const arch = os.arch()
const operatingSystem = os.type()

switch (true) {
case operatingSystem == LINUX && arch == ARM64:
return util.format(
'https://get.helm.sh/helm-%s-linux-arm64.zip',
`${baseURL}/helm-%s-linux-arm64.zip`,
paulvollmer marked this conversation as resolved.
Show resolved Hide resolved
version
)
case operatingSystem == LINUX:
return util.format(
'https://get.helm.sh/helm-%s-linux-amd64.zip',
`${baseURL}/helm-%s-linux-amd64.zip`,
version
)

case operatingSystem == MAC_OS && arch == ARM64:
return util.format(
'https://get.helm.sh/helm-%s-darwin-arm64.zip',
`${baseURL}/helm-%s-darwin-arm64.zip`,
version
)
case operatingSystem == MAC_OS:
return util.format(
'https://get.helm.sh/helm-%s-darwin-amd64.zip',
`${baseURL}/helm-%s-darwin-amd64.zip`,
version
)

case operatingSystem == WINDOWS:
default:
return util.format(
'https://get.helm.sh/helm-%s-windows-amd64.zip',
`${baseURL}/helm-%s-windows-amd64.zip`,
version
)
}
}

export async function downloadHelm(version: string): Promise<string> {
export async function downloadHelm(baseURL: string, version: string): Promise<string> {
let cachedToolpath = toolCache.find(helmToolName, version)
if (!cachedToolpath) {
let helmDownloadPath
try {
helmDownloadPath = await toolCache.downloadTool(
getHelmDownloadURL(version)
getHelmDownloadURL(baseURL, version)
)
} catch (exception) {
throw new Error(
`Failed to download Helm from location ${getHelmDownloadURL(
version
baseURL, version
)}`
)
}
Expand Down