mirror of
https://github.com/Azure/setup-helm.git
synced 2025-07-17 11:20:42 +00:00
Compare commits
2 Commits
v4
...
Vidyareddy
Author | SHA1 | Date | |
---|---|---|---|
83902c34cd | |||
7b23fe67ac |
36
.github/ISSUE_TEMPLATE/bugReportForm.yml
vendored
36
.github/ISSUE_TEMPLATE/bugReportForm.yml
vendored
@ -1,36 +0,0 @@
|
|||||||
name: Bug Report
|
|
||||||
description: File a bug report specifying all inputs you provided for the action, we will respond to this thread with any questions.
|
|
||||||
title: 'Bug: '
|
|
||||||
labels: ['bug', 'triage']
|
|
||||||
assignees: '@Azure/aks-atlanta'
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: What-happened
|
|
||||||
attributes:
|
|
||||||
label: What happened?
|
|
||||||
description: Tell us what happened and how is it different from the expected?
|
|
||||||
placeholder: Tell us what you see!
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: checkboxes
|
|
||||||
id: Version
|
|
||||||
attributes:
|
|
||||||
label: Version
|
|
||||||
options:
|
|
||||||
- label: I am using the latest version
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
id: Runner
|
|
||||||
attributes:
|
|
||||||
label: Runner
|
|
||||||
description: What runner are you using?
|
|
||||||
placeholder: Mention the runner info (self-hosted, operating system)
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
id: Logs
|
|
||||||
attributes:
|
|
||||||
label: Relevant log output
|
|
||||||
description: Run in debug mode for the most verbose logs. Please feel free to attach a screenshot of the logs
|
|
||||||
validations:
|
|
||||||
required: true
|
|
6
.github/ISSUE_TEMPLATE/config.yml
vendored
6
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,6 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: GitHub Action "setup-helm" Support
|
|
||||||
url: https://github.com/Azure/setup-helm
|
|
||||||
security: https://github.com/Azure/setup-helm/blob/main/SECURITY.md
|
|
||||||
about: Please ask and answer questions here.
|
|
13
.github/ISSUE_TEMPLATE/featureRequestForm.yml
vendored
13
.github/ISSUE_TEMPLATE/featureRequestForm.yml
vendored
@ -1,13 +0,0 @@
|
|||||||
name: Feature Request
|
|
||||||
description: File a Feature Request form, we will respond to this thread with any questions.
|
|
||||||
title: 'Feature Request: '
|
|
||||||
labels: ['Feature']
|
|
||||||
assignees: '@Azure/aks-atlanta'
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
id: Feature_request
|
|
||||||
attributes:
|
|
||||||
label: Feature request
|
|
||||||
description: Provide example functionality and links to relevant docs
|
|
||||||
validations:
|
|
||||||
required: true
|
|
18
.github/dependabot.yml
vendored
18
.github/dependabot.yml
vendored
@ -1,18 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: /
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
groups:
|
|
||||||
actions:
|
|
||||||
patterns:
|
|
||||||
- '*'
|
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: .github/workflows
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
groups:
|
|
||||||
actions:
|
|
||||||
patterns:
|
|
||||||
- '*'
|
|
4
.github/workflows/defaultLabels.yml
vendored
4
.github/workflows/defaultLabels.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v3
|
||||||
name: Setting issue as idle
|
name: Setting issue as idle
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@ -24,7 +24,7 @@ jobs:
|
|||||||
operations-per-run: 100
|
operations-per-run: 100
|
||||||
exempt-issue-labels: 'backlog'
|
exempt-issue-labels: 'backlog'
|
||||||
|
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v3
|
||||||
name: Setting PR as idle
|
name: Setting PR as idle
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
24
.github/workflows/integration-tests.yml
vendored
24
.github/workflows/integration-tests.yml
vendored
@ -15,7 +15,7 @@ jobs:
|
|||||||
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
- name: npm install and build
|
- name: npm install and build
|
||||||
id: action-npm-build
|
id: action-npm-build
|
||||||
run: |
|
run: |
|
||||||
@ -63,25 +63,3 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo "HELM VERSION $HELM_3_5_0 INSTALLED SUCCESSFULLY"
|
echo "HELM VERSION $HELM_3_5_0 INSTALLED SUCCESSFULLY"
|
||||||
fi
|
fi
|
||||||
- name: Setup helm latest version
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
version: latest
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Validate latest
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
HELM_LATEST=$(gh release list \
|
|
||||||
--repo helm/helm \
|
|
||||||
--exclude-drafts \
|
|
||||||
--exclude-pre-releases \
|
|
||||||
--limit 1 | awk '{print $4}')
|
|
||||||
|
|
||||||
if [[ $(helm version) != *$HELM_LATEST* ]]; then
|
|
||||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN $HELM_LATEST"
|
|
||||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "HELM VERSION $HELM_LATEST INSTALLED SUCCESSFULLY"
|
|
||||||
fi
|
|
||||||
|
4
.github/workflows/prettify-code.yml
vendored
4
.github/workflows/prettify-code.yml
vendored
@ -10,9 +10,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Enforce Prettier
|
- name: Enforce Prettier
|
||||||
uses: actionsx/prettier@v3
|
uses: actionsx/prettier@v2
|
||||||
with:
|
with:
|
||||||
args: --check .
|
args: --check .
|
||||||
|
20
.github/workflows/release-pr.yml
vendored
20
.github/workflows/release-pr.yml
vendored
@ -1,18 +1,14 @@
|
|||||||
name: Release Project
|
name: Create release PR
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- CHANGELOG.md
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
release:
|
||||||
|
description: 'Define release version (ex: v1, v2, v3)'
|
||||||
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release-pr:
|
||||||
permissions:
|
uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main
|
||||||
actions: read
|
|
||||||
contents: write
|
|
||||||
uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@v1
|
|
||||||
with:
|
with:
|
||||||
changelogPath: ./CHANGELOG.md
|
release: ${{ github.event.inputs.release }}
|
||||||
|
2
.github/workflows/unit-tests.yml
vendored
2
.github/workflows/unit-tests.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
build: # make sure build/ci works properly
|
build: # make sure build/ci works properly
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
- name: Run L0 tests.
|
- name: Run L0 tests.
|
||||||
run: |
|
run: |
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -11,6 +11,8 @@ pids
|
|||||||
*.seed
|
*.seed
|
||||||
*.pid.lock
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
# Coverage directory used by tools like istanbul
|
||||||
coverage
|
coverage
|
||||||
@ -62,3 +64,4 @@ node_modules
|
|||||||
coverage
|
coverage
|
||||||
|
|
||||||
# Transpiled JS
|
# Transpiled JS
|
||||||
|
lib/
|
||||||
|
19
CHANGELOG.md
19
CHANGELOG.md
@ -1,19 +0,0 @@
|
|||||||
# Change Log
|
|
||||||
|
|
||||||
## [4.3.0] - 2025-02-15
|
|
||||||
|
|
||||||
- #152 feat: log when restoring from cache
|
|
||||||
- #157 Dependencies Update
|
|
||||||
- #137 Add dependabot
|
|
||||||
|
|
||||||
## [4.2.0] - 2024-04-15
|
|
||||||
|
|
||||||
- #124 Fix OS detection and download OS-native archive extension
|
|
||||||
|
|
||||||
## [4.1.0] - 2024-03-01
|
|
||||||
|
|
||||||
- #130 switches to use Helm published file to read latest version instead of using GitHub releases
|
|
||||||
|
|
||||||
## [4.0.0] - 2024-02-12
|
|
||||||
|
|
||||||
- #121 update to node20 as node16 is deprecated
|
|
15
README.md
15
README.md
@ -4,22 +4,19 @@ Install a specific version of helm binary on the runner.
|
|||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
Acceptable values are latest or any semantic version string like v3.5.0 Use this action in workflow to define which version of helm will be used. v2+ of this action only support Helm3.
|
Acceptable values are latest or any semantic version string like v3.5.0 Use this action in workflow to define which version of helm will be used. v2 and v3 of this action only supports Helm3.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: azure/setup-helm@v4.3.0
|
- uses: azure/setup-helm@v3
|
||||||
with:
|
with:
|
||||||
version: '<version>' # default is latest (stable)
|
version: '<version>' # default is latest stable
|
||||||
id: install
|
id: install
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> If something goes wrong with fetching the latest version the action will use the hardcoded default stable version (currently v3.13.3). If you rely on a certain version higher than the default, you should explicitly use that version instead of latest.
|
|
||||||
|
|
||||||
The cached helm binary path is prepended to the PATH environment variable as well as stored in the helm-path output variable.
|
The cached helm binary path is prepended to the PATH environment variable as well as stored in the helm-path output variable.
|
||||||
Refer to the action metadata file for details about all the inputs https://github.com/Azure/setup-helm/blob/master/action.yml
|
Refer to the action metadata file for details about all the inputs https://github.com/Azure/setup-helm/blob/master/action.yml
|
||||||
|
|
||||||
## Contributing
|
# Contributing
|
||||||
|
|
||||||
This project welcomes contributions and suggestions. Most contributions require you to agree to a
|
This project welcomes contributions and suggestions. Most contributions require you to agree to a
|
||||||
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
|
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
|
||||||
@ -32,7 +29,3 @@ provided by the bot. You will only need to do this once across all repos using o
|
|||||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
||||||
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
|
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
|
||||||
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
setup-helm is an open source project that is [**not** covered by the Microsoft Azure support policy](https://support.microsoft.com/en-us/help/2941892/support-for-linux-and-open-source-technology-in-azure). [Please search open issues here](https://github.com/Azure/setup-helm/issues), and if your issue isn't already represented please [open a new one](https://github.com/Azure/setup-helm/issues/new/choose). The project maintainers will respond to the best of their abilities.
|
|
||||||
|
11
action.yml
11
action.yml
@ -5,20 +5,11 @@ inputs:
|
|||||||
description: 'Version of helm'
|
description: 'Version of helm'
|
||||||
required: true
|
required: true
|
||||||
default: 'latest'
|
default: 'latest'
|
||||||
token:
|
|
||||||
description: GitHub token. Used to be required to fetch the latest version
|
|
||||||
required: false
|
|
||||||
deprecationMessage: 'GitHub token is no longer required'
|
|
||||||
default: '${{ github.token }}'
|
|
||||||
downloadBaseURL:
|
|
||||||
description: 'Set the download base URL'
|
|
||||||
required: false
|
|
||||||
default: 'https://get.helm.sh'
|
|
||||||
outputs:
|
outputs:
|
||||||
helm-path:
|
helm-path:
|
||||||
description: 'Path to the cached helm binary'
|
description: 'Path to the cached helm binary'
|
||||||
branding:
|
branding:
|
||||||
color: 'blue'
|
color: 'blue'
|
||||||
runs:
|
runs:
|
||||||
using: 'node20'
|
using: 'node16'
|
||||||
main: 'lib/index.js'
|
main: 'lib/index.js'
|
||||||
|
30252
lib/index.js
30252
lib/index.js
File diff suppressed because one or more lines are too long
10466
package-lock.json
generated
10466
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
31
package.json
31
package.json
@ -1,35 +1,32 @@
|
|||||||
{
|
{
|
||||||
"name": "setuphelm",
|
"name": "setuphelm",
|
||||||
"version": "4.3.0",
|
"version": "0.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Setup helm",
|
"description": "Setup helm",
|
||||||
"author": "Anumita Shenoy",
|
"author": "Anumita Shenoy",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.0.0",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/io": "^1.0.0",
|
||||||
"@actions/tool-cache": "2.0.2",
|
"@actions/tool-cache": "1.1.2",
|
||||||
"@octokit/action": "^7.0.0",
|
"@octokit/graphql": "^4.6.1",
|
||||||
"ncc": "^0.3.6",
|
"semver": "^6.1.0"
|
||||||
"semver": "^7.7.1"
|
|
||||||
},
|
},
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prebuild": "npm i ncc",
|
"build": "ncc build src/run.ts -o lib",
|
||||||
"build": "ncc build src/index.ts -o lib",
|
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test-coverage": "jest --coverage",
|
"test-coverage": "jest --coverage",
|
||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
"format-check": "prettier --check ."
|
"format-check": "prettier --check ."
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.14",
|
"@types/jest": "^26.0.0",
|
||||||
"@types/node": "^22.13.1",
|
"@types/node": "^12.0.10",
|
||||||
"@vercel/ncc": "^0.38.3",
|
"@vercel/ncc": "^0.34.0",
|
||||||
"jest": "^29.7.0",
|
"jest": "^26.0.1",
|
||||||
"prettier": "^3.5.0",
|
"ts-jest": "^26.0.0",
|
||||||
"ts-jest": "^29.2.5",
|
"typescript": "^3.5.2"
|
||||||
"typescript": "^5.7.3"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
import {run} from './run'
|
|
||||||
import * as core from '@actions/core'
|
|
||||||
|
|
||||||
run().catch(core.setFailed)
|
|
210
src/run.test.ts
210
src/run.test.ts
@ -6,95 +6,82 @@ import * as path from 'path'
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
|
|
||||||
describe('run.ts', () => {
|
describe('run.ts', () => {
|
||||||
const downloadBaseURL = 'https://test.tld'
|
|
||||||
|
|
||||||
// Cleanup mocks after each test to ensure that subsequent tests are not affected by the mocks.
|
|
||||||
afterEach(() => {
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('getExecutableExtension() - return .exe when os is Windows', () => {
|
test('getExecutableExtension() - return .exe when os is Windows', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
expect(run.getExecutableExtension()).toBe('.exe')
|
expect(run.getExecutableExtension()).toBe('.exe')
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toBeCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getExecutableExtension() - return empty string for non-windows OS', () => {
|
test('getExecutableExtension() - return empty string for non-windows OS', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
||||||
|
|
||||||
expect(run.getExecutableExtension()).toBe('')
|
expect(run.getExecutableExtension()).toBe('')
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toBeCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Linux amd64', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Linux', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('linux')
|
jest.spyOn(os, 'type').mockReturnValue('Linux')
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-linux-amd64.tar.gz'
|
const kubectlLinuxUrl = 'https://get.helm.sh/helm-v3.8.0-linux-amd64.zip'
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
expect(run.getHelmDownloadURL('v3.8.0')).toBe(kubectlLinuxUrl)
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toBeCalled()
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toBeCalled()
|
||||||
|
|
||||||
|
// arm64
|
||||||
|
jest.spyOn(os, 'type').mockReturnValue('Linux')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
|
||||||
|
const kubectlLinuxArm64Url =
|
||||||
|
'https://get.helm.sh/helm-v3.8.0-linux-arm64.zip'
|
||||||
|
|
||||||
|
expect(run.getHelmDownloadURL('v3.8.0')).toBe(kubectlLinuxArm64Url)
|
||||||
|
expect(os.type).toBeCalled()
|
||||||
|
expect(os.arch).toBeCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Linux arm64', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Darwin', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('linux')
|
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('arm64')
|
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-linux-arm64.tar.gz'
|
const kubectlDarwinUrl =
|
||||||
|
'https://get.helm.sh/helm-v3.8.0-darwin-amd64.zip'
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
expect(run.getHelmDownloadURL('v3.8.0')).toBe(kubectlDarwinUrl)
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toBeCalled()
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toBeCalled()
|
||||||
})
|
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Darwin x64', () => {
|
// arm64
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-darwin-amd64.tar.gz'
|
const kubectlDarwinArm64Url =
|
||||||
|
'https://get.helm.sh/helm-v3.8.0-darwin-arm64.zip'
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
expect(run.getHelmDownloadURL('v3.8.0')).toBe(kubectlDarwinArm64Url)
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toBeCalled()
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toBeCalled()
|
||||||
})
|
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Darwin arm64', () => {
|
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('arm64')
|
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-darwin-arm64.tar.gz'
|
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
|
||||||
expect(os.platform).toHaveBeenCalled()
|
|
||||||
expect(os.arch).toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Windows', () => {
|
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
|
||||||
|
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-windows-amd64.zip'
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
|
||||||
expect(os.platform).toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('getLatestHelmVersion() - return the latest version of HELM', async () => {
|
|
||||||
const res = {
|
|
||||||
status: 200,
|
|
||||||
text: async () => 'v9.99.999'
|
|
||||||
} as Response
|
|
||||||
global.fetch = jest.fn().mockReturnValue(res)
|
|
||||||
expect(await run.getLatestHelmVersion()).toBe('v9.99.999')
|
|
||||||
})
|
|
||||||
|
|
||||||
test('getLatestHelmVersion() - return the stable version of HELM when simulating a network error', async () => {
|
|
||||||
const errorMessage: string = 'Network Error'
|
|
||||||
global.fetch = jest.fn().mockRejectedValueOnce(new Error(errorMessage))
|
|
||||||
expect(await run.getLatestHelmVersion()).toBe('v3.13.3')
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getValidVersion() - return version with v prepended', () => {
|
test('getValidVersion() - return version with v prepended', () => {
|
||||||
expect(run.getValidVersion('3.8.0')).toBe('v3.8.0')
|
expect(run.getValidVersion('3.8.0')).toBe('v3.8.0')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('getHelmDownloadURL() - return the URL to download helm for Windows', () => {
|
||||||
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
|
const kubectlWindowsUrl =
|
||||||
|
'https://get.helm.sh/helm-v3.8.0-windows-amd64.zip'
|
||||||
|
expect(run.getHelmDownloadURL('v3.8.0')).toBe(kubectlWindowsUrl)
|
||||||
|
expect(os.type).toBeCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('getLatestHelmVersion() - return the latest version of HELM', async () => {
|
||||||
|
try {
|
||||||
|
expect(await run.getLatestHelmVersion()).toBe('v3.8.0')
|
||||||
|
} catch (e) {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
test('walkSync() - return path to the all files matching fileToFind in dir', () => {
|
test('walkSync() - return path to the all files matching fileToFind in dir', () => {
|
||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
||||||
if (file == 'mainFolder')
|
if (file == 'mainFolder')
|
||||||
@ -114,7 +101,6 @@ describe('run.ts', () => {
|
|||||||
'file21' as unknown as fs.Dirent,
|
'file21' as unknown as fs.Dirent,
|
||||||
'file22' as unknown as fs.Dirent
|
'file22' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(core, 'debug').mockImplementation()
|
jest.spyOn(core, 'debug').mockImplementation()
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
@ -126,8 +112,8 @@ describe('run.ts', () => {
|
|||||||
expect(run.walkSync('mainFolder', null, 'file21')).toEqual([
|
expect(run.walkSync('mainFolder', null, 'file21')).toEqual([
|
||||||
path.join('mainFolder', 'folder2', 'file21')
|
path.join('mainFolder', 'folder2', 'file21')
|
||||||
])
|
])
|
||||||
expect(fs.readdirSync).toHaveBeenCalledTimes(3)
|
expect(fs.readdirSync).toBeCalledTimes(3)
|
||||||
expect(fs.statSync).toHaveBeenCalledTimes(8)
|
expect(fs.statSync).toBeCalledTimes(8)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('walkSync() - return empty array if no file with name fileToFind exists', () => {
|
test('walkSync() - return empty array if no file with name fileToFind exists', () => {
|
||||||
@ -149,7 +135,6 @@ describe('run.ts', () => {
|
|||||||
'file21' as unknown as fs.Dirent,
|
'file21' as unknown as fs.Dirent,
|
||||||
'file22' as unknown as fs.Dirent
|
'file22' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(core, 'debug').mockImplementation()
|
jest.spyOn(core, 'debug').mockImplementation()
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
@ -159,22 +144,21 @@ describe('run.ts', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
expect(run.walkSync('mainFolder', null, 'helm.exe')).toEqual([])
|
expect(run.walkSync('mainFolder', null, 'helm.exe')).toEqual([])
|
||||||
expect(fs.readdirSync).toHaveBeenCalledTimes(3)
|
expect(fs.readdirSync).toBeCalledTimes(3)
|
||||||
expect(fs.statSync).toHaveBeenCalledTimes(8)
|
expect(fs.statSync).toBeCalledTimes(8)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('findHelm() - change access permissions and find the helm in given directory', () => {
|
test('findHelm() - change access permissions and find the helm in given directory', () => {
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
||||||
if (file == 'mainFolder') return ['helm.exe' as unknown as fs.Dirent]
|
if (file == 'mainFolder') return ['helm.exe' as unknown as fs.Dirent]
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
const isDirectory =
|
const isDirectory =
|
||||||
(file as string).indexOf('folder') == -1 ? false : true
|
(file as string).indexOf('folder') == -1 ? false : true
|
||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
})
|
})
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
expect(run.findHelm('mainFolder')).toBe(
|
expect(run.findHelm('mainFolder')).toBe(
|
||||||
path.join('mainFolder', 'helm.exe')
|
path.join('mainFolder', 'helm.exe')
|
||||||
@ -185,13 +169,11 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
||||||
if (file == 'mainFolder') return []
|
if (file == 'mainFolder') return []
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
return {isDirectory: () => true} as fs.Stats
|
return {isDirectory: () => true} as fs.Stats
|
||||||
})
|
})
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
expect(() => run.findHelm('mainFolder')).toThrow(
|
expect(() => run.findHelm('mainFolder')).toThrow(
|
||||||
'Helm executable not found in path mainFolder'
|
'Helm executable not found in path mainFolder'
|
||||||
)
|
)
|
||||||
@ -202,9 +184,11 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
||||||
const response = JSON.stringify([{tag_name: 'v4.0.0'}])
|
const response = JSON.stringify([{tag_name: 'v4.0.0'}])
|
||||||
jest.spyOn(fs, 'readFileSync').mockReturnValue(response)
|
jest.spyOn(fs, 'readFileSync').mockReturnValue(response)
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest.spyOn(toolCache, 'extractZip').mockResolvedValue('extractedPath')
|
jest
|
||||||
|
.spyOn(toolCache, 'extractZip')
|
||||||
|
.mockResolvedValue('pathToUnzippedHelm')
|
||||||
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
||||||
jest
|
jest
|
||||||
.spyOn(fs, 'readdirSync')
|
.spyOn(fs, 'readdirSync')
|
||||||
@ -215,16 +199,16 @@ describe('run.ts', () => {
|
|||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(await run.downloadHelm(downloadBaseURL, 'v4.0.0')).toBe(
|
expect(await run.downloadHelm('v4.0.0')).toBe(
|
||||||
path.join('pathToCachedDir', 'helm.exe')
|
path.join('pathToCachedDir', 'helm.exe')
|
||||||
)
|
)
|
||||||
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v4.0.0')
|
expect(toolCache.find).toBeCalledWith('helm', 'v4.0.0')
|
||||||
expect(toolCache.downloadTool).toHaveBeenCalledWith(
|
expect(toolCache.downloadTool).toBeCalledWith(
|
||||||
'https://test.tld/helm-v4.0.0-windows-amd64.zip'
|
'https://get.helm.sh/helm-v4.0.0-windows-amd64.zip'
|
||||||
)
|
)
|
||||||
expect(fs.chmodSync).toHaveBeenCalledWith('pathToTool', '777')
|
expect(fs.chmodSync).toBeCalledWith('pathToTool', '777')
|
||||||
expect(toolCache.extractZip).toHaveBeenCalledWith('pathToTool')
|
expect(toolCache.extractZip).toBeCalledWith('pathToTool')
|
||||||
expect(fs.chmodSync).toHaveBeenCalledWith(
|
expect(fs.chmodSync).toBeCalledWith(
|
||||||
path.join('pathToCachedDir', 'helm.exe'),
|
path.join('pathToCachedDir', 'helm.exe'),
|
||||||
'777'
|
'777'
|
||||||
)
|
)
|
||||||
@ -235,37 +219,26 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(toolCache, 'downloadTool').mockImplementation(async () => {
|
jest.spyOn(toolCache, 'downloadTool').mockImplementation(async () => {
|
||||||
throw 'Unable to download'
|
throw 'Unable to download'
|
||||||
})
|
})
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
const downloadUrl = 'https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
await expect(run.downloadHelm('v3.2.1')).rejects.toThrow(
|
||||||
await expect(run.downloadHelm(downloadBaseURL, 'v3.2.1')).rejects.toThrow(
|
'Failed to download Helm from location https://get.helm.sh/helm-v3.2.1-windows-amd64.zip'
|
||||||
`Failed to download Helm from location ${downloadUrl}`
|
)
|
||||||
|
expect(toolCache.find).toBeCalledWith('helm', 'v3.2.1')
|
||||||
|
expect(toolCache.downloadTool).toBeCalledWith(
|
||||||
|
'https://get.helm.sh/helm-v3.2.1-windows-amd64.zip'
|
||||||
)
|
)
|
||||||
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
|
||||||
expect(toolCache.downloadTool).toHaveBeenCalledWith(`${downloadUrl}`)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('downloadHelm() - return path to helm tool with same version from toolCache', async () => {
|
test('downloadHelm() - return path to helm tool with same version from toolCache', async () => {
|
||||||
jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedDir')
|
jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedDir')
|
||||||
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
|
||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
|
||||||
jest.spyOn(toolCache, 'extractZip').mockResolvedValue('extractedPath')
|
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest
|
|
||||||
.spyOn(fs, 'readdirSync')
|
|
||||||
.mockReturnValue(['helm.exe' as unknown as fs.Dirent])
|
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
|
||||||
const isDirectory =
|
|
||||||
(file as string).indexOf('folder') == -1 ? false : true
|
|
||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
|
||||||
})
|
|
||||||
|
|
||||||
expect(await run.downloadHelm(downloadBaseURL, 'v3.2.1')).toBe(
|
expect(await run.downloadHelm('v3.2.1')).toBe(
|
||||||
path.join('pathToCachedDir', 'helm.exe')
|
path.join('pathToCachedDir', 'helm.exe')
|
||||||
)
|
)
|
||||||
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
expect(toolCache.find).toBeCalledWith('helm', 'v3.2.1')
|
||||||
expect(fs.chmodSync).toHaveBeenCalledWith(
|
expect(fs.chmodSync).toBeCalledWith(
|
||||||
path.join('pathToCachedDir', 'helm.exe'),
|
path.join('pathToCachedDir', 'helm.exe'),
|
||||||
'777'
|
'777'
|
||||||
)
|
)
|
||||||
@ -274,11 +247,12 @@ describe('run.ts', () => {
|
|||||||
test('downloadHelm() - throw error is helm is not found in path', async () => {
|
test('downloadHelm() - throw error is helm is not found in path', async () => {
|
||||||
jest.spyOn(toolCache, 'find').mockReturnValue('')
|
jest.spyOn(toolCache, 'find').mockReturnValue('')
|
||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
||||||
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
|
||||||
jest.spyOn(toolCache, 'extractZip').mockResolvedValue('extractedPath')
|
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation()
|
jest.spyOn(fs, 'chmodSync').mockImplementation()
|
||||||
|
jest
|
||||||
|
.spyOn(toolCache, 'extractZip')
|
||||||
|
.mockResolvedValue('pathToUnzippedHelm')
|
||||||
|
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => [])
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => [])
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
const isDirectory =
|
const isDirectory =
|
||||||
@ -286,14 +260,14 @@ describe('run.ts', () => {
|
|||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
})
|
})
|
||||||
|
|
||||||
await expect(run.downloadHelm(downloadBaseURL, 'v3.2.1')).rejects.toThrow(
|
await expect(run.downloadHelm('v3.2.1')).rejects.toThrow(
|
||||||
'Helm executable not found in path pathToCachedDir'
|
'Helm executable not found in path pathToCachedDir'
|
||||||
)
|
)
|
||||||
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
expect(toolCache.find).toBeCalledWith('helm', 'v3.2.1')
|
||||||
expect(toolCache.downloadTool).toHaveBeenCalledWith(
|
expect(toolCache.downloadTool).toBeCalledWith(
|
||||||
'https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
'https://get.helm.sh/helm-v3.2.1-windows-amd64.zip'
|
||||||
)
|
)
|
||||||
expect(fs.chmodSync).toHaveBeenCalledWith('pathToTool', '777')
|
expect(fs.chmodSync).toBeCalledWith('pathToTool', '777')
|
||||||
expect(toolCache.extractZip).toHaveBeenCalledWith('pathToTool')
|
expect(toolCache.extractZip).toBeCalledWith('pathToTool')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
131
src/run.ts
131
src/run.ts
@ -1,4 +1,5 @@
|
|||||||
// Copyright (c) Microsoft Corporation.
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
// Licensed under the MIT license.
|
// Licensed under the MIT license.
|
||||||
|
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
@ -10,24 +11,21 @@ import * as toolCache from '@actions/tool-cache'
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
|
|
||||||
const helmToolName = 'helm'
|
const helmToolName = 'helm'
|
||||||
const stableHelmVersion = 'v3.13.3'
|
const stableHelmVersion = 'v3.8.0'
|
||||||
|
const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases'
|
||||||
|
|
||||||
export async function run() {
|
export async function run() {
|
||||||
let version = core.getInput('version', {required: true})
|
let version = core.getInput('version', {required: true})
|
||||||
|
|
||||||
if (version !== 'latest' && version[0] !== 'v') {
|
if (version !== 'latest' && version[0] !== 'v') {
|
||||||
core.info('Getting latest Helm version')
|
|
||||||
version = getValidVersion(version)
|
version = getValidVersion(version)
|
||||||
}
|
}
|
||||||
if (version.toLocaleLowerCase() === 'latest') {
|
if (version.toLocaleLowerCase() === 'latest') {
|
||||||
version = await getLatestHelmVersion()
|
version = await getLatestHelmVersion()
|
||||||
}
|
}
|
||||||
|
|
||||||
const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})
|
core.debug(util.format('Downloading %s', version))
|
||||||
|
let cachedPath = await downloadHelm(version)
|
||||||
core.startGroup(`Installing ${version}`)
|
|
||||||
const cachedPath = await downloadHelm(downloadBaseURL, version)
|
|
||||||
core.endGroup()
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) {
|
if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) {
|
||||||
@ -37,82 +35,117 @@ export async function run() {
|
|||||||
//do nothing, set as output variable
|
//do nothing, set as output variable
|
||||||
}
|
}
|
||||||
|
|
||||||
core.info(`Helm tool version '${version}' has been cached at ${cachedPath}`)
|
console.log(
|
||||||
|
`Helm tool version: '${version}' has been cached at ${cachedPath}`
|
||||||
|
)
|
||||||
core.setOutput('helm-path', cachedPath)
|
core.setOutput('helm-path', cachedPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prefixes version with v
|
//Returns version with proper v before it
|
||||||
export function getValidVersion(version: string): string {
|
export function getValidVersion(version: string): string {
|
||||||
return 'v' + version
|
return 'v' + version
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the latest helm version or returns a default stable if getting latest fails
|
// Downloads the helm releases JSON and parses all the recent versions of helm from it.
|
||||||
|
// Defaults to sending stable helm version if none are valid or if it fails
|
||||||
|
|
||||||
export async function getLatestHelmVersion(): Promise<string> {
|
export async function getLatestHelmVersion(): Promise<string> {
|
||||||
|
const helmJSONPath: string = await toolCache.downloadTool(helmAllReleasesUrl)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch('https://get.helm.sh/helm-latest-version')
|
const helmJSON = JSON.parse(fs.readFileSync(helmJSONPath, 'utf-8'))
|
||||||
const release = (await response.text()).trim()
|
for (let i in helmJSON) {
|
||||||
return release
|
if (isValidVersion(helmJSON[i].tag_name)) {
|
||||||
|
return helmJSON[i].tag_name
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
core.warning(
|
core.warning(
|
||||||
`Error while fetching latest Helm release: ${err.toString()}. Using default version ${stableHelmVersion}`
|
util.format(
|
||||||
|
'Error while fetching the latest Helm release. Error: %s. Using default Helm version %s',
|
||||||
|
err.toString(),
|
||||||
|
stableHelmVersion
|
||||||
|
)
|
||||||
)
|
)
|
||||||
return stableHelmVersion
|
return stableHelmVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return stableHelmVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getArch(): string {
|
// isValidVersion checks if verison is a stable release
|
||||||
return os.arch() === 'x64' ? 'amd64' : os.arch()
|
function isValidVersion(version: string): boolean {
|
||||||
}
|
return version.indexOf('rc') == -1
|
||||||
|
|
||||||
export function getPlatform(): string {
|
|
||||||
return os.platform() === 'win32' ? 'windows' : os.platform()
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getArchiveExtension(): string {
|
|
||||||
return os.platform() === 'win32' ? 'zip' : 'tar.gz'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getExecutableExtension(): string {
|
export function getExecutableExtension(): string {
|
||||||
return os.platform() === 'win32' ? '.exe' : ''
|
if (os.type().match(/^Win/)) {
|
||||||
|
return '.exe'
|
||||||
|
}
|
||||||
|
return ''
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getHelmDownloadURL(baseURL: string, version: string): string {
|
const LINUX = 'Linux'
|
||||||
const urlPath = `helm-${version}-${getPlatform()}-${getArch()}.${getArchiveExtension()}`
|
const MAC_OS = 'Darwin'
|
||||||
const url = new URL(urlPath, baseURL)
|
const WINDOWS = 'Windows_NT'
|
||||||
return url.toString()
|
const ARM64 = 'arm64'
|
||||||
|
export function getHelmDownloadURL(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',
|
||||||
|
version
|
||||||
|
)
|
||||||
|
case operatingSystem == LINUX:
|
||||||
|
return util.format(
|
||||||
|
'https://get.helm.sh/helm-%s-linux-amd64.zip',
|
||||||
|
version
|
||||||
|
)
|
||||||
|
|
||||||
|
case operatingSystem == MAC_OS && arch == ARM64:
|
||||||
|
return util.format(
|
||||||
|
'https://get.helm.sh/helm-%s-darwin-arm64.zip',
|
||||||
|
version
|
||||||
|
)
|
||||||
|
case operatingSystem == MAC_OS:
|
||||||
|
return util.format(
|
||||||
|
'https://get.helm.sh/helm-%s-darwin-amd64.zip',
|
||||||
|
version
|
||||||
|
)
|
||||||
|
|
||||||
|
case operatingSystem == WINDOWS:
|
||||||
|
default:
|
||||||
|
return util.format(
|
||||||
|
'https://get.helm.sh/helm-%s-windows-amd64.zip',
|
||||||
|
version
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function downloadHelm(
|
export async function downloadHelm(version: string): Promise<string> {
|
||||||
baseURL: string,
|
|
||||||
version: string
|
|
||||||
): Promise<string> {
|
|
||||||
let cachedToolpath = toolCache.find(helmToolName, version)
|
let cachedToolpath = toolCache.find(helmToolName, version)
|
||||||
if (cachedToolpath) {
|
if (!cachedToolpath) {
|
||||||
core.info(`Restoring '${version}' from cache`)
|
|
||||||
} else {
|
|
||||||
core.info(`Downloading '${version}' from '${baseURL}'`)
|
|
||||||
let helmDownloadPath
|
let helmDownloadPath
|
||||||
try {
|
try {
|
||||||
helmDownloadPath = await toolCache.downloadTool(
|
helmDownloadPath = await toolCache.downloadTool(
|
||||||
getHelmDownloadURL(baseURL, version)
|
getHelmDownloadURL(version)
|
||||||
)
|
)
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Failed to download Helm from location ${getHelmDownloadURL(
|
util.format(
|
||||||
baseURL,
|
'Failed to download Helm from location',
|
||||||
version
|
getHelmDownloadURL(version)
|
||||||
)}`
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.chmodSync(helmDownloadPath, '777')
|
fs.chmodSync(helmDownloadPath, '777')
|
||||||
const extractedPath =
|
const unzipedHelmPath = await toolCache.extractZip(helmDownloadPath)
|
||||||
getPlatform() === 'windows'
|
|
||||||
? await toolCache.extractZip(helmDownloadPath)
|
|
||||||
: await toolCache.extractTar(helmDownloadPath)
|
|
||||||
|
|
||||||
cachedToolpath = await toolCache.cacheDir(
|
cachedToolpath = await toolCache.cacheDir(
|
||||||
extractedPath,
|
unzipedHelmPath,
|
||||||
helmToolName,
|
helmToolName,
|
||||||
version
|
version
|
||||||
)
|
)
|
||||||
@ -157,3 +190,5 @@ export var walkSync = function (dir, filelist, fileToFind) {
|
|||||||
})
|
})
|
||||||
return filelist
|
return filelist
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run().catch(core.setFailed)
|
||||||
|
Reference in New Issue
Block a user