mirror of
https://github.com/Azure/setup-helm.git
synced 2025-12-21 14:55:43 +00:00
Compare commits
71 Commits
davidgamer
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3ce81801f | ||
|
|
c9feef90b0 | ||
|
|
73239af346 | ||
|
|
f838c7624e | ||
|
|
c357e9f852 | ||
|
|
ed9b26085d | ||
|
|
66bd493dcc | ||
|
|
d3968cd00b | ||
|
|
c5faea29a6 | ||
|
|
95eab887c3 | ||
|
|
0400c1212d | ||
|
|
56c6cf6081 | ||
|
|
9522c92b52 | ||
|
|
1858547716 | ||
|
|
1e96d927b6 | ||
|
|
11cf983218 | ||
|
|
da792be48c | ||
|
|
35f21158b9 | ||
|
|
9d84ec5754 | ||
|
|
dd78250c1f | ||
|
|
9e7f762d6f | ||
|
|
c096176d63 | ||
|
|
5e7287287e | ||
|
|
fb8fa40706 | ||
|
|
0d097290a8 | ||
|
|
32bc12022d | ||
|
|
51463d68e8 | ||
|
|
aff10941b2 | ||
|
|
a10a5247d8 | ||
|
|
378ae69bda | ||
|
|
50d615e7a7 | ||
|
|
0147554077 | ||
|
|
4eee2cd0ed | ||
|
|
8527f3ee39 | ||
|
|
c9a6a97d7f | ||
|
|
027e8cdfd7 | ||
|
|
df342a2656 | ||
|
|
230641be01 | ||
|
|
f57bbf1821 | ||
|
|
5b950139b7 | ||
|
|
28f285563b | ||
|
|
d030d7f717 | ||
|
|
05502a08f2 | ||
|
|
24eca957cf | ||
|
|
56195efbb1 | ||
|
|
babfb8676f | ||
|
|
c757a812df | ||
|
|
d5f1fcb584 | ||
|
|
cc690771a5 | ||
|
|
c4cd5ccdf7 | ||
|
|
740f020522 | ||
|
|
5976fc8a1b | ||
|
|
0e8654bb94 | ||
|
|
b48e1dfac1 | ||
|
|
855ae7a03c | ||
|
|
124c6d88e7 | ||
|
|
048f4e7eae | ||
|
|
8618769467 | ||
|
|
4eb898eef0 | ||
|
|
7a2001c0f6 | ||
|
|
e90c86ceea | ||
|
|
4675ea6b05 | ||
|
|
df50d879fa | ||
|
|
08d7123a4a | ||
|
|
0a0c55a4c3 | ||
|
|
d00ce1cb5e | ||
|
|
4c255dde26 | ||
|
|
ec8dd7c209 | ||
|
|
efbd96d464 | ||
|
|
859dc38e9a | ||
|
|
0788eb3317 |
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -1 +1 @@
|
|||||||
* @Azure/aks-atlanta
|
* @Azure/cloud-native-github-action-owners
|
||||||
|
|||||||
18
.github/dependabot.yml
vendored
Normal file
18
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
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@997185467fa4f803885201cee163a9f38240193d #v10.1.1
|
||||||
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@997185467fa4f803885201cee163a9f38240193d #v10.1.1
|
||||||
name: Setting PR as idle
|
name: Setting PR as idle
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
53
.github/workflows/integration-tests.yml
vendored
53
.github/workflows/integration-tests.yml
vendored
@@ -7,15 +7,22 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
trigger-integration-tests:
|
trigger-integration-tests:
|
||||||
name: Trigger Integration tests
|
name: Trigger Integration tests
|
||||||
runs-on: ubuntu-latest
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- ubuntu-latest
|
||||||
|
- ubuntu-24.04-arm
|
||||||
|
- macos-latest # arm
|
||||||
|
fail-fast: false
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
HELM_3_8_0: 'v3.8.0'
|
HELM_3_18_4: 'v3.18.4'
|
||||||
HELM_3_7_2: 'v3.7.2'
|
HELM_3_18_0: 'v3.18.0'
|
||||||
HELM_NO_V: '3.5.0'
|
HELM_NO_V: '3.18.4'
|
||||||
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@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
- name: npm install and build
|
- name: npm install and build
|
||||||
id: action-npm-build
|
id: action-npm-build
|
||||||
run: |
|
run: |
|
||||||
@@ -27,41 +34,41 @@ jobs:
|
|||||||
- name: Setup helm
|
- name: Setup helm
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: ${{ env.HELM_3_8_0 }}
|
version: ${{ env.HELM_3_18_4 }}
|
||||||
- name: Validate helm 3.8.0
|
- name: Validate helm 3.18.4
|
||||||
run: |
|
run: |
|
||||||
if [[ $(helm version) != *$HELM_3_8_0* ]]; then
|
if [[ $(helm version) != *$HELM_3_18_4* ]]; then
|
||||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.8.0"
|
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.18.4"
|
||||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "HELM VERSION $HELM_3_8_0 INSTALLED SUCCESSFULLY"
|
echo "HELM VERSION $HELM_3_18_4 INSTALLED SUCCESSFULLY"
|
||||||
fi
|
fi
|
||||||
- name: Setup helm 3.7.2
|
- name: Setup helm 3.18.0
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: ${{ env.HELM_3_7_2 }}
|
version: ${{ env.HELM_3_18_0 }}
|
||||||
- name: Validate 3.7.2
|
- name: Validate 3.18.0
|
||||||
run: |
|
run: |
|
||||||
if [[ $(helm version) != *$HELM_3_7_2* ]]; then
|
if [[ $(helm version) != *$HELM_3_18_0* ]]; then
|
||||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.7.2"
|
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.18.0"
|
||||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "HELM VERSION $HELM_3_7_2 INSTALLED SUCCESSFULLY"
|
echo "HELM VERSION $HELM_3_18_0 INSTALLED SUCCESSFULLY"
|
||||||
fi
|
fi
|
||||||
- name: Setup helm 3.5.0 with no v in version
|
- name: Setup helm 3.18.4 with no v in version
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: ${{ env.HELM_NO_V }}
|
version: ${{ env.HELM_NO_V }}
|
||||||
- name: Validate 3.5.0 without v in version
|
- name: Validate 3.18.4 without v in version
|
||||||
run: |
|
run: |
|
||||||
if [[ $(helm version) != *$HELM_NO_V* ]]; then
|
if [[ $(helm version) != *$HELM_NO_V* ]]; then
|
||||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.5.0"
|
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN 3.18.4"
|
||||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "HELM VERSION $HELM_3_5_0 INSTALLED SUCCESSFULLY"
|
echo "HELM VERSION $HELM_NO_V INSTALLED SUCCESSFULLY"
|
||||||
fi
|
fi
|
||||||
- name: Setup helm latest version
|
- name: Setup helm latest version
|
||||||
uses: ./
|
uses: ./
|
||||||
@@ -72,11 +79,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
HELM_LATEST=$(gh release list \
|
HELM_LATEST=$(curl -s https://get.helm.sh/helm-latest-version)
|
||||||
--repo helm/helm \
|
|
||||||
--exclude-drafts \
|
|
||||||
--exclude-pre-releases \
|
|
||||||
--limit 1 | awk '{print $4}')
|
|
||||||
|
|
||||||
if [[ $(helm version) != *$HELM_LATEST* ]]; then
|
if [[ $(helm version) != *$HELM_LATEST* ]]; then
|
||||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN $HELM_LATEST"
|
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN $HELM_LATEST"
|
||||||
|
|||||||
6
.github/workflows/prettify-code.yml
vendored
6
.github/workflows/prettify-code.yml
vendored
@@ -10,9 +10,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: Enforce Prettier
|
- name: Enforce Prettier
|
||||||
uses: actionsx/prettier@v3
|
run: npx prettier --check .
|
||||||
with:
|
|
||||||
args: --check .
|
|
||||||
|
|||||||
20
.github/workflows/release-pr.yml
vendored
20
.github/workflows/release-pr.yml
vendored
@@ -1,14 +1,18 @@
|
|||||||
name: Create release PR
|
name: Release Project
|
||||||
|
|
||||||
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-pr:
|
release:
|
||||||
uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: write
|
||||||
|
uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@3c677ba5ab58f5c5c1a6f0cfb176b333b1f27405 # v1.0.3
|
||||||
with:
|
with:
|
||||||
release: ${{ github.event.inputs.release }}
|
changelogPath: ./CHANGELOG.md
|
||||||
|
|||||||
2
.github/workflows/tag-and-draft.yml
vendored
2
.github/workflows/tag-and-draft.yml
vendored
@@ -7,4 +7,4 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tag-and-release:
|
tag-and-release:
|
||||||
uses: OliverMKing/javascript-release-workflow/.github/workflows/tag-and-release.yml@main
|
uses: OliverMKing/javascript-release-workflow/.github/workflows/tag-and-release.yml@c753e1545b144562237cd1177a95bab21a785cff # main
|
||||||
|
|||||||
13
.github/workflows/unit-tests.yml
vendored
13
.github/workflows/unit-tests.yml
vendored
@@ -11,9 +11,18 @@ on: # rebuild any PRs and main branch changes
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build: # make sure build/ci works properly
|
build: # make sure build/ci works properly
|
||||||
runs-on: ubuntu-latest
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- ubuntu-latest
|
||||||
|
- ubuntu-24.04-arm
|
||||||
|
- windows-latest
|
||||||
|
- windows-11-arm
|
||||||
|
- macos-latest # arm
|
||||||
|
fail-fast: false
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- name: Run L0 tests.
|
- name: Run L0 tests.
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
7
.husky/pre-commit
Normal file
7
.husky/pre-commit
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
npm test
|
||||||
|
npm run format-check || {
|
||||||
|
echo ""
|
||||||
|
echo "❌ Formatting check failed."
|
||||||
|
echo "💡 Run 'npm run format' or 'prettier --write .' to fix formatting issues."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
34
CHANGELOG.md
Normal file
34
CHANGELOG.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Change Log
|
||||||
|
|
||||||
|
## [4.3.1] - 2025-08-12
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- #167 [Pinning Action Dependencies for Security and Reliability](https://github.com/Azure/setup-helm/pull/167)
|
||||||
|
- #181 [Fix types, and update node version.](https://github.com/Azure/setup-helm/pull/181)
|
||||||
|
- #191 [chore(tests): Mock arch to make tests pass on arm host](https://github.com/Azure/setup-helm/pull/191)
|
||||||
|
- #192 [chore: remove unnecessary prebuild script](https://github.com/Azure/setup-helm/pull/192)
|
||||||
|
- #203 [Update helm version retrieval to use JSON output for latest version](https://github.com/Azure/setup-helm/pull/203)
|
||||||
|
- #207 [ci(workflows): update helm version to v3.18.4 and add matrix for tests](https://github.com/Azure/setup-helm/pull/207)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- #197 [Add pre-commit hook](https://github.com/Azure/setup-helm/pull/197)
|
||||||
|
|
||||||
|
## [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
|
||||||
@@ -4,6 +4,6 @@ This project has adopted the [Microsoft Open Source Code of Conduct](https://ope
|
|||||||
|
|
||||||
Resources:
|
Resources:
|
||||||
|
|
||||||
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
|
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
|
||||||
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
||||||
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
|
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
|
||||||
|
|||||||
@@ -4,18 +4,17 @@ 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 and v3 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+ of this action only support Helm3.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: azure/setup-helm@v3
|
- uses: azure/setup-helm@v4.3.0
|
||||||
with:
|
with:
|
||||||
version: '<version>' # default is latest (stable)
|
version: '<version>' # default is latest (stable)
|
||||||
token: ${{ secrets.GITHUB_TOKEN }} # only needed if version is 'latest'
|
|
||||||
id: install
|
id: install
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> When using latest version you might hit the GitHub GraphQL API hourly rate limit of 5,000. The action will then return the hardcoded default stable version (currently v3.13.3). If you rely on a certain version higher than the default, you should use that version instead of latest.
|
> If something goes wrong with fetching the latest version the action will use the hardcoded default version (currently v3.18.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
|
||||||
|
|||||||
14
SECURITY.md
14
SECURITY.md
@@ -18,13 +18,13 @@ You should receive a response within 24 hours. If for some reason you do not, pl
|
|||||||
|
|
||||||
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
|
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
|
||||||
|
|
||||||
- Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
|
- Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
|
||||||
- Full paths of source file(s) related to the manifestation of the issue
|
- Full paths of source file(s) related to the manifestation of the issue
|
||||||
- The location of the affected source code (tag/branch/commit or direct URL)
|
- The location of the affected source code (tag/branch/commit or direct URL)
|
||||||
- Any special configuration required to reproduce the issue
|
- Any special configuration required to reproduce the issue
|
||||||
- Step-by-step instructions to reproduce the issue
|
- Step-by-step instructions to reproduce the issue
|
||||||
- Proof-of-concept or exploit code (if possible)
|
- Proof-of-concept or exploit code (if possible)
|
||||||
- Impact of the issue, including how an attacker might exploit the issue
|
- Impact of the issue, including how an attacker might exploit the issue
|
||||||
|
|
||||||
This information will help us triage your report more quickly.
|
This information will help us triage your report more quickly.
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,9 @@ inputs:
|
|||||||
required: true
|
required: true
|
||||||
default: 'latest'
|
default: 'latest'
|
||||||
token:
|
token:
|
||||||
description: GitHub token. Required only if 'version' == 'latest'
|
description: GitHub token. Used to be required to fetch the latest version
|
||||||
required: false
|
required: false
|
||||||
|
deprecationMessage: 'GitHub token is no longer required'
|
||||||
default: '${{ github.token }}'
|
default: '${{ github.token }}'
|
||||||
downloadBaseURL:
|
downloadBaseURL:
|
||||||
description: 'Set the download base URL'
|
description: 'Set the download base URL'
|
||||||
|
|||||||
3662
package-lock.json
generated
3662
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
34
package.json
34
package.json
@@ -1,33 +1,35 @@
|
|||||||
{
|
{
|
||||||
"name": "setuphelm",
|
"name": "setuphelm",
|
||||||
"version": "0.0.0",
|
"version": "4.3.1",
|
||||||
"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.10.0",
|
"@actions/core": "^2.0.1",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^2.0.0",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/io": "^2.0.0",
|
||||||
"@actions/tool-cache": "2.0.1",
|
"@actions/tool-cache": "2.0.2",
|
||||||
"@octokit/action": "^6.0.7",
|
"@octokit/action": "^8.0.4",
|
||||||
"semver": "^7.5.4"
|
"semver": "^7.7.3"
|
||||||
},
|
},
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"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 .",
|
||||||
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.11",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/node": "^20.11.8",
|
"@types/node": "^25.0.2",
|
||||||
"@vercel/ncc": "^0.38.1",
|
"@vercel/ncc": "^0.38.4",
|
||||||
"jest": "^29.7.0",
|
"husky": "^9.1.7",
|
||||||
"prettier": "^3.2.5",
|
"jest": "^30.2.0",
|
||||||
"ts-jest": "^29.1.2",
|
"prettier": "^3.7.4",
|
||||||
"typescript": "^5.3.3"
|
"ts-jest": "^29.4.6",
|
||||||
|
"typescript": "^5.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
src/index.ts
Normal file
4
src/index.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import {run} from './run'
|
||||||
|
import * as core from '@actions/core'
|
||||||
|
|
||||||
|
run().catch(core.setFailed)
|
||||||
236
src/run.test.ts
236
src/run.test.ts
@@ -6,109 +6,124 @@ 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, 'type').mockReturnValue('Windows_NT')
|
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
||||||
|
|
||||||
expect(run.getExecutableExtension()).toBe('.exe')
|
expect(run.getExecutableExtension()).toBe('.exe')
|
||||||
expect(os.type).toHaveBeenCalled()
|
expect(os.platform).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getExecutableExtension() - return empty string for non-windows OS', () => {
|
test('getExecutableExtension() - return empty string for non-windows OS', () => {
|
||||||
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
||||||
|
|
||||||
expect(run.getExecutableExtension()).toBe('')
|
expect(run.getExecutableExtension()).toBe('')
|
||||||
expect(os.type).toHaveBeenCalled()
|
expect(os.platform).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Linux', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Linux amd64', () => {
|
||||||
const downloadBaseURL = 'https://test.tld'
|
jest.spyOn(os, 'platform').mockReturnValue('linux')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
||||||
|
const expected = 'https://test.tld/helm-v3.8.0-linux-amd64.tar.gz'
|
||||||
|
|
||||||
jest.spyOn(os, 'type').mockReturnValue('Linux')
|
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
||||||
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
|
expect(os.platform).toHaveBeenCalled()
|
||||||
const helmLinuxUrl = 'https://test.tld/helm-v3.8.0-linux-amd64.zip'
|
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(
|
|
||||||
helmLinuxUrl
|
|
||||||
)
|
|
||||||
expect(os.type).toHaveBeenCalled()
|
|
||||||
expect(os.arch).toHaveBeenCalled()
|
|
||||||
|
|
||||||
// arm64
|
|
||||||
jest.spyOn(os, 'type').mockReturnValue('Linux')
|
|
||||||
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
|
|
||||||
const helmLinuxArm64Url = 'https://test.tld/helm-v3.8.0-linux-arm64.zip'
|
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(
|
|
||||||
helmLinuxArm64Url
|
|
||||||
)
|
|
||||||
expect(os.type).toHaveBeenCalled()
|
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Darwin', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Linux arm64', () => {
|
||||||
const downloadBaseURL = 'https://test.tld'
|
jest.spyOn(os, 'platform').mockReturnValue('linux')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValue('arm64')
|
||||||
|
const expected = 'https://test.tld/helm-v3.8.0-linux-arm64.tar.gz'
|
||||||
|
|
||||||
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
||||||
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
|
expect(os.platform).toHaveBeenCalled()
|
||||||
const helmDarwinUrl = 'https://test.tld/helm-v3.8.0-darwin-amd64.zip'
|
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(
|
|
||||||
helmDarwinUrl
|
|
||||||
)
|
|
||||||
expect(os.type).toHaveBeenCalled()
|
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
// arm64
|
test('getHelmDownloadURL() - return the URL to download helm for Darwin x64', () => {
|
||||||
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
||||||
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
|
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
||||||
const helmDarwinArm64Url = 'https://test.tld/helm-v3.8.0-darwin-arm64.zip'
|
const expected = 'https://test.tld/helm-v3.8.0-darwin-amd64.tar.gz'
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(
|
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
||||||
helmDarwinArm64Url
|
expect(os.platform).toHaveBeenCalled()
|
||||||
)
|
|
||||||
expect(os.type).toHaveBeenCalled()
|
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
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 x64', () => {
|
||||||
|
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('getHelmDownloadURL() - return the URL to download helm for Windows arm64', () => {
|
||||||
|
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValue('arm64')
|
||||||
|
|
||||||
|
const expected = 'https://test.tld/helm-v3.8.0-windows-arm64.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(run.stableHelmVersion)
|
||||||
|
})
|
||||||
|
|
||||||
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', () => {
|
|
||||||
const downloadBaseURL = 'https://test.tld'
|
|
||||||
|
|
||||||
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
|
||||||
|
|
||||||
const helmWindowsUrl = 'https://test.tld/helm-v3.8.0-windows-amd64.zip'
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(
|
|
||||||
helmWindowsUrl
|
|
||||||
)
|
|
||||||
expect(os.type).toHaveBeenCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('getLatestHelmVersion() - return the stable version of HELM since its not authenticated', async () => {
|
|
||||||
expect(await run.getLatestHelmVersion()).toBe('v3.13.3')
|
|
||||||
})
|
|
||||||
|
|
||||||
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')
|
||||||
return [
|
return [
|
||||||
'file1' as unknown as fs.Dirent,
|
'file1' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'file2' as unknown as fs.Dirent,
|
'file2' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'folder1' as unknown as fs.Dirent,
|
'folder1' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'folder2' as unknown as fs.Dirent
|
'folder2' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder1'))
|
if (file == path.join('mainFolder', 'folder1'))
|
||||||
return [
|
return [
|
||||||
'file11' as unknown as fs.Dirent,
|
'file11' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'file12' as unknown as fs.Dirent
|
'file12' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder2'))
|
if (file == path.join('mainFolder', 'folder2'))
|
||||||
return [
|
return [
|
||||||
'file21' as unknown as fs.Dirent,
|
'file21' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'file22' as unknown as fs.Dirent
|
'file22' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
]
|
]
|
||||||
|
return []
|
||||||
})
|
})
|
||||||
jest.spyOn(core, 'debug').mockImplementation()
|
jest.spyOn(core, 'debug').mockImplementation()
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
@@ -128,21 +143,22 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
||||||
if (file == 'mainFolder')
|
if (file == 'mainFolder')
|
||||||
return [
|
return [
|
||||||
'file1' as unknown as fs.Dirent,
|
'file1' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'file2' as unknown as fs.Dirent,
|
'file2' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'folder1' as unknown as fs.Dirent,
|
'folder1' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'folder2' as unknown as fs.Dirent
|
'folder2' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder1'))
|
if (file == path.join('mainFolder', 'folder1'))
|
||||||
return [
|
return [
|
||||||
'file11' as unknown as fs.Dirent,
|
'file11' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'file12' as unknown as fs.Dirent
|
'file12' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder2'))
|
if (file == path.join('mainFolder', 'folder2'))
|
||||||
return [
|
return [
|
||||||
'file21' as unknown as fs.Dirent,
|
'file21' as unknown as fs.Dirent<NonSharedBuffer>,
|
||||||
'file22' as unknown as fs.Dirent
|
'file22' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
]
|
]
|
||||||
|
return []
|
||||||
})
|
})
|
||||||
jest.spyOn(core, 'debug').mockImplementation()
|
jest.spyOn(core, 'debug').mockImplementation()
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
@@ -159,14 +175,16 @@ describe('run.ts', () => {
|
|||||||
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<NonSharedBuffer>]
|
||||||
|
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, 'type').mockReturnValue('Windows_NT')
|
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
||||||
|
|
||||||
expect(run.findHelm('mainFolder')).toBe(
|
expect(run.findHelm('mainFolder')).toBe(
|
||||||
path.join('mainFolder', 'helm.exe')
|
path.join('mainFolder', 'helm.exe')
|
||||||
@@ -177,11 +195,13 @@ 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, 'type').mockReturnValue('Windows_NT')
|
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
||||||
|
|
||||||
expect(() => run.findHelm('mainFolder')).toThrow(
|
expect(() => run.findHelm('mainFolder')).toThrow(
|
||||||
'Helm executable not found in path mainFolder'
|
'Helm executable not found in path mainFolder'
|
||||||
)
|
)
|
||||||
@@ -192,24 +212,23 @@ 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, 'type').mockReturnValue('Windows_NT')
|
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest
|
jest.spyOn(toolCache, 'extractZip').mockResolvedValue('extractedPath')
|
||||||
.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')
|
||||||
.mockImplementation((file, _) => ['helm.exe' as unknown as fs.Dirent])
|
.mockImplementation((file, _) => [
|
||||||
|
'helm.exe' as unknown as fs.Dirent<NonSharedBuffer>
|
||||||
|
])
|
||||||
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
|
||||||
})
|
})
|
||||||
|
|
||||||
const baseURL = 'https://test.tld'
|
expect(await run.downloadHelm(downloadBaseURL, 'v4.0.0')).toBe(
|
||||||
|
|
||||||
expect(await run.downloadHelm(baseURL, '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).toHaveBeenCalledWith('helm', 'v4.0.0')
|
||||||
@@ -229,26 +248,35 @@ 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, 'type').mockReturnValue('Windows_NT')
|
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
||||||
|
|
||||||
const baseURL = 'https://test.tld'
|
const downloadUrl = 'https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
||||||
|
await expect(run.downloadHelm(downloadBaseURL, 'v3.2.1')).rejects.toThrow(
|
||||||
await expect(run.downloadHelm(baseURL, 'v3.2.1')).rejects.toThrow(
|
`Failed to download Helm from location ${downloadUrl}`
|
||||||
'Failed to download Helm from location https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
|
||||||
)
|
)
|
||||||
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
||||||
expect(toolCache.downloadTool).toHaveBeenCalledWith(
|
expect(toolCache.downloadTool).toHaveBeenCalledWith(`${downloadUrl}`)
|
||||||
'https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
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(os, 'arch').mockReturnValue('x64')
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
|
jest
|
||||||
|
.spyOn(fs, 'readdirSync')
|
||||||
|
.mockReturnValue(['helm.exe' as unknown as fs.Dirent<NonSharedBuffer>])
|
||||||
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
|
const isDirectory =
|
||||||
|
(file as string).indexOf('folder') == -1 ? false : true
|
||||||
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
|
})
|
||||||
|
|
||||||
const baseURL = 'https://test.tld'
|
expect(await run.downloadHelm(downloadBaseURL, 'v3.2.1')).toBe(
|
||||||
|
|
||||||
expect(await run.downloadHelm(baseURL, '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).toHaveBeenCalledWith('helm', 'v3.2.1')
|
||||||
@@ -261,12 +289,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(os, 'type').mockReturnValue('Windows_NT')
|
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation()
|
|
||||||
jest
|
|
||||||
.spyOn(toolCache, 'extractZip')
|
|
||||||
.mockResolvedValue('pathToUnzippedHelm')
|
|
||||||
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('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(os, 'arch').mockReturnValue('x64')
|
||||||
|
jest.spyOn(fs, 'chmodSync').mockImplementation()
|
||||||
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 =
|
||||||
@@ -274,9 +302,7 @@ describe('run.ts', () => {
|
|||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
})
|
})
|
||||||
|
|
||||||
const baseURL = 'https://test.tld'
|
await expect(run.downloadHelm(downloadBaseURL, 'v3.2.1')).rejects.toThrow(
|
||||||
|
|
||||||
await expect(run.downloadHelm(baseURL, '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).toHaveBeenCalledWith('helm', 'v3.2.1')
|
||||||
|
|||||||
91
src/run.ts
91
src/run.ts
@@ -1,5 +1,4 @@
|
|||||||
// 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'
|
||||||
@@ -9,10 +8,9 @@ import * as fs from 'fs'
|
|||||||
|
|
||||||
import * as toolCache from '@actions/tool-cache'
|
import * as toolCache from '@actions/tool-cache'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import {Octokit} from '@octokit/action'
|
|
||||||
|
|
||||||
const helmToolName = 'helm'
|
const helmToolName = 'helm'
|
||||||
const stableHelmVersion = 'v3.13.3'
|
export const stableHelmVersion = 'v3.18.4'
|
||||||
|
|
||||||
export async function run() {
|
export async function run() {
|
||||||
let version = core.getInput('version', {required: true})
|
let version = core.getInput('version', {required: true})
|
||||||
@@ -27,7 +25,7 @@ export async function run() {
|
|||||||
|
|
||||||
const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})
|
const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})
|
||||||
|
|
||||||
core.startGroup(`Downloading ${version}`)
|
core.startGroup(`Installing ${version}`)
|
||||||
const cachedPath = await downloadHelm(downloadBaseURL, version)
|
const cachedPath = await downloadHelm(downloadBaseURL, version)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
@@ -51,75 +49,35 @@ export function getValidVersion(version: string): string {
|
|||||||
// Gets the latest helm version or returns a default stable if getting latest fails
|
// Gets the latest helm version or returns a default stable if getting latest fails
|
||||||
export async function getLatestHelmVersion(): Promise<string> {
|
export async function getLatestHelmVersion(): Promise<string> {
|
||||||
try {
|
try {
|
||||||
const octokit = new Octokit()
|
const response = await fetch('https://get.helm.sh/helm-latest-version')
|
||||||
const response = await octokit.rest.repos.listReleases({
|
const release = (await response.text()).trim()
|
||||||
owner: 'helm',
|
return release
|
||||||
repo: 'helm',
|
|
||||||
per_page: 100,
|
|
||||||
order: 'desc',
|
|
||||||
sort: 'created'
|
|
||||||
})
|
|
||||||
|
|
||||||
const releases = response.data
|
|
||||||
const latestValidRelease: string = releases.find(
|
|
||||||
({tag_name, draft, prerelease}) =>
|
|
||||||
isValidVersion(tag_name) && !draft && !prerelease
|
|
||||||
)?.tag_name
|
|
||||||
|
|
||||||
if (latestValidRelease) return latestValidRelease
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
core.warning(
|
core.warning(
|
||||||
`Error while fetching latest Helm release: ${err.toString()}. Using default version ${stableHelmVersion}`
|
`Error while fetching latest Helm release: ${err.toString()}. Using default version ${stableHelmVersion}`
|
||||||
)
|
)
|
||||||
return stableHelmVersion
|
return stableHelmVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
core.warning(
|
|
||||||
`Could not find valid release. Using default version ${stableHelmVersion}`
|
|
||||||
)
|
|
||||||
return stableHelmVersion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// isValidVersion checks if verison is a stable release
|
export function getArch(): string {
|
||||||
function isValidVersion(version: string): boolean {
|
return os.arch() === 'x64' ? 'amd64' : os.arch()
|
||||||
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 {
|
||||||
if (os.type().match(/^Win/)) {
|
return os.platform() === 'win32' ? '.exe' : ''
|
||||||
return '.exe'
|
|
||||||
}
|
|
||||||
return ''
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const LINUX = 'Linux'
|
|
||||||
const MAC_OS = 'Darwin'
|
|
||||||
const WINDOWS = 'Windows_NT'
|
|
||||||
const ARM64 = 'arm64'
|
|
||||||
export function getHelmDownloadURL(baseURL: string, version: string): string {
|
export function getHelmDownloadURL(baseURL: string, version: string): string {
|
||||||
const arch = os.arch()
|
const urlPath = `helm-${version}-${getPlatform()}-${getArch()}.${getArchiveExtension()}`
|
||||||
const operatingSystem = os.type()
|
|
||||||
|
|
||||||
let urlPath = ''
|
|
||||||
|
|
||||||
switch (true) {
|
|
||||||
case operatingSystem == LINUX && arch == ARM64:
|
|
||||||
urlPath = util.format(`/helm-%s-linux-arm64.zip`, version)
|
|
||||||
break
|
|
||||||
case operatingSystem == LINUX:
|
|
||||||
urlPath = util.format(`/helm-%s-linux-amd64.zip`, version)
|
|
||||||
break
|
|
||||||
case operatingSystem == MAC_OS && arch == ARM64:
|
|
||||||
urlPath = util.format(`/helm-%s-darwin-arm64.zip`, version)
|
|
||||||
break
|
|
||||||
case operatingSystem == MAC_OS:
|
|
||||||
urlPath = util.format(`/helm-%s-darwin-amd64.zip`, version)
|
|
||||||
break
|
|
||||||
case operatingSystem == WINDOWS:
|
|
||||||
default:
|
|
||||||
urlPath = util.format(`/helm-%s-windows-amd64.zip`, version)
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = new URL(urlPath, baseURL)
|
const url = new URL(urlPath, baseURL)
|
||||||
return url.toString()
|
return url.toString()
|
||||||
}
|
}
|
||||||
@@ -129,7 +87,10 @@ export async function downloadHelm(
|
|||||||
version: string
|
version: string
|
||||||
): Promise<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(
|
||||||
@@ -145,9 +106,13 @@ export async function downloadHelm(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fs.chmodSync(helmDownloadPath, '777')
|
fs.chmodSync(helmDownloadPath, '777')
|
||||||
const unzipedHelmPath = await toolCache.extractZip(helmDownloadPath)
|
const extractedPath =
|
||||||
|
getPlatform() === 'windows'
|
||||||
|
? await toolCache.extractZip(helmDownloadPath)
|
||||||
|
: await toolCache.extractTar(helmDownloadPath)
|
||||||
|
|
||||||
cachedToolpath = await toolCache.cacheDir(
|
cachedToolpath = await toolCache.cacheDir(
|
||||||
unzipedHelmPath,
|
extractedPath,
|
||||||
helmToolName,
|
helmToolName,
|
||||||
version
|
version
|
||||||
)
|
)
|
||||||
@@ -192,5 +157,3 @@ export var walkSync = function (dir, filelist, fileToFind) {
|
|||||||
})
|
})
|
||||||
return filelist
|
return filelist
|
||||||
}
|
}
|
||||||
|
|
||||||
run().catch(core.setFailed)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user