mirror of
https://github.com/Azure/setup-helm.git
synced 2026-07-24 09:02:27 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cda6f6b61c |
+1
-1
@@ -1 +1 @@
|
||||
* @Azure/cloud-native-github-action-owners
|
||||
* @Azure/aks-atlanta
|
||||
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -4,4 +4,7 @@ about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: need-to-triage
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
@@ -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:
|
||||
- '*'
|
||||
@@ -2,34 +2,34 @@ name: setting-default-labels
|
||||
|
||||
# Controls when the action will run.
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0/3 * * *'
|
||||
schedule:
|
||||
- cron: "0 0/3 * * *"
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
build:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
build:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
- uses: actions/stale@1e223db275d687790206a7acac4d1a11bd6fe629 #v10.4.0
|
||||
name: Setting issue as idle
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: 'This issue is idle because it has been open for 14 days with no activity.'
|
||||
stale-issue-label: 'idle'
|
||||
days-before-stale: 14
|
||||
days-before-close: -1
|
||||
operations-per-run: 100
|
||||
exempt-issue-labels: 'backlog'
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
name: Setting issue as idle
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: "This issue is idle because it has been open for 14 days with no activity."
|
||||
stale-issue-label: "idle"
|
||||
days-before-stale: 14
|
||||
days-before-close: -1
|
||||
operations-per-run: 100
|
||||
exempt-issue-labels: "backlog"
|
||||
|
||||
- uses: actions/stale@1e223db275d687790206a7acac4d1a11bd6fe629 #v10.4.0
|
||||
name: Setting PR as idle
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-pr-message: 'This PR is idle because it has been open for 14 days with no activity.'
|
||||
stale-pr-label: 'idle'
|
||||
days-before-stale: 14
|
||||
days-before-close: -1
|
||||
operations-per-run: 100
|
||||
- uses: actions/stale@v3
|
||||
name: Setting PR as idle
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-pr-message: "This PR is idle because it has been open for 14 days with no activity."
|
||||
stale-pr-label: "idle"
|
||||
days-before-stale: 14
|
||||
days-before-close: -1
|
||||
operations-per-run: 100
|
||||
|
||||
@@ -1,90 +1,65 @@
|
||||
name: 'Trigger Integration tests'
|
||||
name: "Trigger Integration tests"
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- 'releases/*'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- "releases/*"
|
||||
jobs:
|
||||
trigger-integration-tests:
|
||||
name: Trigger Integration tests
|
||||
strategy:
|
||||
matrix:
|
||||
os:
|
||||
- ubuntu-latest
|
||||
- ubuntu-24.04-arm
|
||||
- macos-latest # arm
|
||||
fail-fast: false
|
||||
runs-on: ${{ matrix.os }}
|
||||
env:
|
||||
HELM_3_18_4: 'v3.18.4'
|
||||
HELM_3_18_0: 'v3.18.0'
|
||||
HELM_NO_V: '3.18.4'
|
||||
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- name: npm install and build
|
||||
id: action-npm-build
|
||||
run: |
|
||||
echo $PR_BASE_REF
|
||||
if [[ $PR_BASE_REF != releases/* ]]; then
|
||||
npm install
|
||||
npm run build
|
||||
fi
|
||||
- name: Setup helm
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ env.HELM_3_18_4 }}
|
||||
- name: Validate helm 3.18.4
|
||||
run: |
|
||||
if [[ $(helm version) != *$HELM_3_18_4* ]]; then
|
||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.18.4"
|
||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||
exit 1
|
||||
else
|
||||
echo "HELM VERSION $HELM_3_18_4 INSTALLED SUCCESSFULLY"
|
||||
fi
|
||||
- name: Setup helm 3.18.0
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ env.HELM_3_18_0 }}
|
||||
- name: Validate 3.18.0
|
||||
run: |
|
||||
if [[ $(helm version) != *$HELM_3_18_0* ]]; then
|
||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.18.0"
|
||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||
exit 1
|
||||
else
|
||||
echo "HELM VERSION $HELM_3_18_0 INSTALLED SUCCESSFULLY"
|
||||
fi
|
||||
- name: Setup helm 3.18.4 with no v in version
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ env.HELM_NO_V }}
|
||||
- name: Validate 3.18.4 without v in version
|
||||
run: |
|
||||
if [[ $(helm version) != *$HELM_NO_V* ]]; then
|
||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN 3.18.4"
|
||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||
exit 1
|
||||
else
|
||||
echo "HELM VERSION $HELM_NO_V INSTALLED SUCCESSFULLY"
|
||||
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=$(curl -s https://get.helm.sh/helm-latest-version)
|
||||
|
||||
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
|
||||
trigger-integration-tests:
|
||||
name: Trigger Integration tests
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HELM_3_8_0: "v3.8.0"
|
||||
HELM_3_7_2: "v3.7.2"
|
||||
HELM_NO_V: "3.5.0"
|
||||
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2
|
||||
- name: npm install and build
|
||||
id: action-npm-build
|
||||
run: |
|
||||
echo $PR_BASE_REF
|
||||
if [[ $PR_BASE_REF != releases/* ]]; then
|
||||
npm install
|
||||
npm run build
|
||||
fi
|
||||
- name: Setup helm
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ env.HELM_3_8_0 }}
|
||||
- name: Validate helm 3.8.0
|
||||
run: |
|
||||
if [[ $(helm version) != *$HELM_3_8_0* ]]; then
|
||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.8.0"
|
||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||
exit 1
|
||||
else
|
||||
echo "HELM VERSION $HELM_3_8_0 INSTALLED SUCCESSFULLY"
|
||||
fi
|
||||
- name: Setup helm 3.7.2
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ env.HELM_3_7_2 }}
|
||||
- name: Validate 3.7.2
|
||||
run: |
|
||||
if [[ $(helm version) != *$HELM_3_7_2* ]]; then
|
||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.7.2"
|
||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||
exit 1
|
||||
else
|
||||
echo "HELM VERSION $HELM_3_7_2 INSTALLED SUCCESSFULLY"
|
||||
fi
|
||||
- name: Setup helm 3.5.0 with no v in version
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ env.HELM_NO_V }}
|
||||
- name: Validate 3.5.0 without v in version
|
||||
run: |
|
||||
if [[ $(helm version) != *$HELM_NO_V* ]]; then
|
||||
echo "HELM VERSION INCORRECT: HELM VERSION DOES NOT CONTAIN v3.5.0"
|
||||
echo "HELM VERSION OUTPUT: $(helm version)"
|
||||
exit 1
|
||||
else
|
||||
echo "HELM VERSION $HELM_3_5_0 INSTALLED SUCCESSFULLY"
|
||||
fi
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
name: 'Run prettify'
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
prettier:
|
||||
name: Prettier Check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
|
||||
- name: Enforce Prettier
|
||||
run: npx prettier --check .
|
||||
@@ -1,18 +1,14 @@
|
||||
name: Release Project
|
||||
name: Create release PR
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- CHANGELOG.md
|
||||
workflow_dispatch:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
release:
|
||||
description: "Define release version (ex: v1, v2, v3)"
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
release:
|
||||
permissions:
|
||||
actions: read
|
||||
contents: write
|
||||
uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@3c677ba5ab58f5c5c1a6f0cfb176b333b1f27405 # v1.0.3
|
||||
with:
|
||||
changelogPath: ./CHANGELOG.md
|
||||
release-pr:
|
||||
uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main
|
||||
with:
|
||||
release: ${{ github.event.inputs.release }}
|
||||
@@ -0,0 +1,10 @@
|
||||
name: Tag and create release draft
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- releases/*
|
||||
|
||||
jobs:
|
||||
tag-and-release:
|
||||
uses: OliverMKing/javascript-release-workflow/.github/workflows/tag-and-release.yml@main
|
||||
@@ -1,30 +1,21 @@
|
||||
name: 'Run unit tests.'
|
||||
name: "Run unit tests."
|
||||
on: # rebuild any PRs and main branch changes
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- 'releases/*'
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- 'releases/*'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- "releases/*"
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- "releases/*"
|
||||
|
||||
jobs:
|
||||
build: # make sure build/ci works properly
|
||||
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:
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
build: # make sure build/ci works properly
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: Run L0 tests.
|
||||
run: |
|
||||
npm install
|
||||
npm test
|
||||
- name: Run L0 tests.
|
||||
run: |
|
||||
npm install
|
||||
npm test
|
||||
|
||||
@@ -65,6 +65,3 @@ coverage
|
||||
|
||||
# Transpiled JS
|
||||
lib/
|
||||
|
||||
# Planning docs
|
||||
docs/
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
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
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
# dependencies
|
||||
/node_modules
|
||||
coverage
|
||||
/lib
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"trailingComma": "none",
|
||||
"bracketSpacing": false,
|
||||
"semi": false,
|
||||
"tabWidth": 3,
|
||||
"singleQuote": true,
|
||||
"printWidth": 80
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
# Change Log
|
||||
|
||||
## [5.0.1] - 2026-06-23
|
||||
|
||||
### Fixed
|
||||
|
||||
- #271 [Fix TypeScript 6.0 compatibility errors in run.ts](https://github.com/Azure/setup-helm/pull/271)
|
||||
- #278 [fix: use chmod 755 instead of 777 for downloaded helm binary and folder](https://github.com/Azure/setup-helm/pull/278)
|
||||
|
||||
### Changed
|
||||
|
||||
- #286 [Bump actions/checkout from 6.0.3 to 7.0.0 in /.github/workflows in the actions group](https://github.com/Azure/setup-helm/pull/286)
|
||||
- #285 [Bump the actions group with 2 updates](https://github.com/Azure/setup-helm/pull/285)
|
||||
- #284 [Bump undici](https://github.com/Azure/setup-helm/pull/284)
|
||||
- #283 [Bump the actions group with 5 updates](https://github.com/Azure/setup-helm/pull/283)
|
||||
- #280 [Bump actions/checkout from 6.0.2 to 6.0.3 in /.github/workflows in the actions group](https://github.com/Azure/setup-helm/pull/280)
|
||||
- #279 [Bump the actions group with 2 updates](https://github.com/Azure/setup-helm/pull/279)
|
||||
- #277 [Bump vitest from 4.1.7 to 4.1.8 in the actions group](https://github.com/Azure/setup-helm/pull/277)
|
||||
- #276 [chore: remove deprecated OliverMKing release workflow, pin to SHA](https://github.com/Azure/setup-helm/pull/276)
|
||||
- #275 [Bump actions/stale from 10.2.0 to 10.3.0 in /.github/workflows in the actions group](https://github.com/Azure/setup-helm/pull/275)
|
||||
- #274 [Bump the actions group with 3 updates](https://github.com/Azure/setup-helm/pull/274)
|
||||
- #273 [Bump the actions group with 2 updates](https://github.com/Azure/setup-helm/pull/273)
|
||||
- #269 [Bump the actions group across 1 directory with 7 updates](https://github.com/Azure/setup-helm/pull/269)
|
||||
- #268 [Bump vite from 8.0.0 to 8.0.5](https://github.com/Azure/setup-helm/pull/268)
|
||||
- #260 [Migrate to ESM with esbuild/vitest and upgrade to node24 (v5.0.0)](https://github.com/Azure/setup-helm/pull/260)
|
||||
|
||||
## [5.0.0] - 2026-03-23
|
||||
|
||||
### Changed
|
||||
|
||||
- #259 [Update Node.js runtime from node20 to node24](https://github.com/Azure/setup-helm/pull/259)
|
||||
- #263 [Bump undici](https://github.com/Azure/setup-helm/pull/263)
|
||||
- #257 [Bump undici and @actions/http-client](https://github.com/Azure/setup-helm/pull/257)
|
||||
- #256 [Bump minimatch](https://github.com/Azure/setup-helm/pull/256)
|
||||
- #248 [Bump the actions group with 2 updates](https://github.com/Azure/setup-helm/pull/248)
|
||||
- #247 [Bump the actions group with 3 updates](https://github.com/Azure/setup-helm/pull/247)
|
||||
- #246 [Bump @types/node from 25.0.2 to 25.0.3 in the actions group](https://github.com/Azure/setup-helm/pull/246)
|
||||
- #245 [Bump the actions group with 3 updates](https://github.com/Azure/setup-helm/pull/245)
|
||||
- #243 [Bump the actions group with 2 updates](https://github.com/Azure/setup-helm/pull/243)
|
||||
- #240 [Bump prettier from 3.6.2 to 3.7.3 in the actions group](https://github.com/Azure/setup-helm/pull/240)
|
||||
- #229 [Bump the actions group across 1 directory with 3 updates](https://github.com/Azure/setup-helm/pull/229)
|
||||
- #231 [Bump js-yaml from 3.14.1 to 3.14.2](https://github.com/Azure/setup-helm/pull/231)
|
||||
- #234 [Bump glob from 10.4.5 to 10.5.0](https://github.com/Azure/setup-helm/pull/234)
|
||||
- #225 [Fix build error](https://github.com/Azure/setup-helm/pull/225)
|
||||
- #222 [Bump @types/node from 24.7.2 to 24.8.1 in the actions group](https://github.com/Azure/setup-helm/pull/222)
|
||||
- #220 [Bump the actions group across 1 directory with 4 updates](https://github.com/Azure/setup-helm/pull/220)
|
||||
- #216 [Bump the actions group across 1 directory with 4 updates](https://github.com/Azure/setup-helm/pull/216)
|
||||
- #213 [Bump the actions group with 2 updates](https://github.com/Azure/setup-helm/pull/213)
|
||||
- #211 [Bump undici](https://github.com/Azure/setup-helm/pull/211)
|
||||
- #212 [Bump jest from 30.0.5 to 30.1.2 in the actions group](https://github.com/Azure/setup-helm/pull/212)
|
||||
- #210 [Bump @types/node from 24.2.1 to 24.3.0 in the actions group](https://github.com/Azure/setup-helm/pull/210)
|
||||
|
||||
## [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
|
||||
+9
-9
@@ -1,9 +1,9 @@
|
||||
# Microsoft Open Source Code of Conduct
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
||||
|
||||
Resources:
|
||||
|
||||
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
|
||||
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
||||
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
|
||||
# Microsoft Open Source Code of Conduct
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
||||
|
||||
Resources:
|
||||
|
||||
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
|
||||
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
||||
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# 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
|
||||
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
|
||||
|
||||
|
||||
@@ -1,55 +1,29 @@
|
||||
# Setup Helm
|
||||
|
||||
Install a specific version of helm binary on the runner.
|
||||
|
||||
## 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.
|
||||
|
||||
```yaml
|
||||
- uses: azure/setup-helm@v5
|
||||
with:
|
||||
version: '<version>' # default is latest (stable)
|
||||
id: install
|
||||
```
|
||||
|
||||
Alternatively, the version can be read from a [`.tool-versions`](https://asdf-vm.com/manage/configuration.html) file (the format used by [asdf](https://asdf-vm.com/) and [mise](https://mise.jdx.dev/)) via the `version-file` input:
|
||||
|
||||
```yaml
|
||||
- uses: azure/setup-helm@v5.0.0
|
||||
with:
|
||||
version-file: .tool-versions
|
||||
id: install
|
||||
```
|
||||
|
||||
The action reads the version declared for the `helm` tool, for example:
|
||||
|
||||
```
|
||||
helm 3.18.4
|
||||
```
|
||||
|
||||
If both `version` and `version-file` are set, an explicitly requested `version` takes precedence and `version-file` is ignored (a warning is emitted). Because `version` defaults to `latest`, `version-file` is only ignored when you set `version` to a specific value other than `latest`; if `version` is left at its default, the version from `version-file` is used.
|
||||
|
||||
> [!NOTE]
|
||||
> If something goes wrong with fetching the latest version the action will use the hardcoded default version (currently v3.18.4). 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.
|
||||
Refer to the action metadata file for details about all the inputs https://github.com/Azure/setup-helm/blob/master/action.yml
|
||||
|
||||
## Contributing
|
||||
|
||||
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
|
||||
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
|
||||
|
||||
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
|
||||
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
|
||||
provided by the bot. You will only need to do this once across all repos using our CLA.
|
||||
|
||||
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
|
||||
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.
|
||||
# Setup Helm
|
||||
Install a specific version of helm binary on the runner.
|
||||
## 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 supports Helm3.
|
||||
|
||||
```yaml
|
||||
- uses: azure/setup-helm@v2
|
||||
with:
|
||||
version: '<version>' # default is latest stable
|
||||
id: install
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
# Contributing
|
||||
|
||||
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
|
||||
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
|
||||
|
||||
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
|
||||
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
|
||||
provided by the bot. You will only need to do this once across all repos using our CLA.
|
||||
|
||||
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
|
||||
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||
|
||||
+41
-41
@@ -1,41 +1,41 @@
|
||||
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.2 BLOCK -->
|
||||
|
||||
## Security
|
||||
|
||||
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [many more](https://opensource.microsoft.com/).
|
||||
|
||||
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [definition](<https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)>) of a security vulnerability, please report it to us as described below.
|
||||
|
||||
## Reporting Security Issues
|
||||
|
||||
**Please do not report security vulnerabilities through public GitHub issues.**
|
||||
|
||||
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
|
||||
|
||||
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc).
|
||||
|
||||
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).
|
||||
|
||||
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.)
|
||||
- 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)
|
||||
- Any special configuration required to reproduce the issue
|
||||
- Step-by-step instructions to reproduce the issue
|
||||
- Proof-of-concept or exploit code (if possible)
|
||||
- Impact of the issue, including how an attacker might exploit the issue
|
||||
|
||||
This information will help us triage your report more quickly.
|
||||
|
||||
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs.
|
||||
|
||||
## Preferred Languages
|
||||
|
||||
We prefer all communications to be in English.
|
||||
|
||||
## Policy
|
||||
|
||||
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd).
|
||||
|
||||
<!-- END MICROSOFT SECURITY.MD BLOCK -->
|
||||
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.2 BLOCK -->
|
||||
|
||||
## Security
|
||||
|
||||
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [many more](https://opensource.microsoft.com/).
|
||||
|
||||
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [definition](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below.
|
||||
|
||||
## Reporting Security Issues
|
||||
|
||||
**Please do not report security vulnerabilities through public GitHub issues.**
|
||||
|
||||
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
|
||||
|
||||
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc).
|
||||
|
||||
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).
|
||||
|
||||
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.)
|
||||
* 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)
|
||||
* Any special configuration required to reproduce the issue
|
||||
* Step-by-step instructions to reproduce the issue
|
||||
* Proof-of-concept or exploit code (if possible)
|
||||
* Impact of the issue, including how an attacker might exploit the issue
|
||||
|
||||
This information will help us triage your report more quickly.
|
||||
|
||||
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs.
|
||||
|
||||
## Preferred Languages
|
||||
|
||||
We prefer all communications to be in English.
|
||||
|
||||
## Policy
|
||||
|
||||
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd).
|
||||
|
||||
<!-- END MICROSOFT SECURITY.MD BLOCK -->
|
||||
|
||||
+11
-23
@@ -1,27 +1,15 @@
|
||||
name: 'Helm tool installer'
|
||||
description: 'Install a specific version of helm binary. Acceptable values are latest or any semantic version string like 1.15.0'
|
||||
name: "Helm tool installer"
|
||||
description: "Install a specific version of helm binary. Acceptable values are latest or any semantic version string like 1.15.0"
|
||||
inputs:
|
||||
version:
|
||||
description: 'Version of helm'
|
||||
required: false
|
||||
default: 'latest'
|
||||
version-file:
|
||||
description: 'Path to a .tool-versions file to read the helm version from'
|
||||
required: false
|
||||
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'
|
||||
version:
|
||||
description: "Version of helm"
|
||||
required: true
|
||||
default: "latest"
|
||||
outputs:
|
||||
helm-path:
|
||||
description: 'Path to the cached helm binary'
|
||||
helm-path:
|
||||
description: "Path to the cached helm binary"
|
||||
branding:
|
||||
color: 'blue'
|
||||
color: "blue"
|
||||
runs:
|
||||
using: 'node24'
|
||||
main: 'lib/index.js'
|
||||
using: "node16"
|
||||
main: "lib/index.js"
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
module.exports = {
|
||||
clearMocks: true,
|
||||
moduleFileExtensions: ['js', 'ts'],
|
||||
testEnvironment: 'node',
|
||||
testMatch: ['**/*.test.ts'],
|
||||
transform: {
|
||||
'^.+\\.ts$': 'ts-jest'
|
||||
},
|
||||
verbose: true,
|
||||
coverageThreshold: {
|
||||
"global": {
|
||||
"branches": 0,
|
||||
"functions": 14,
|
||||
"lines": 27,
|
||||
"statements": 27
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+11180
-2474
File diff suppressed because it is too large
Load Diff
+28
-33
@@ -1,35 +1,30 @@
|
||||
{
|
||||
"name": "setuphelm",
|
||||
"version": "5.0.1",
|
||||
"private": true,
|
||||
"description": "Setup helm",
|
||||
"author": "Anumita Shenoy",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@actions/core": "^3.0.1",
|
||||
"@actions/exec": "^3.0.0",
|
||||
"@actions/io": "^3.0.2",
|
||||
"@actions/tool-cache": "4.0.0",
|
||||
"@octokit/action": "^8.0.4",
|
||||
"semver": "^7.8.5"
|
||||
},
|
||||
"main": "lib/index.js",
|
||||
"scripts": {
|
||||
"build": "tsc --noEmit && esbuild src/index.ts --bundle --platform=node --target=node20 --format=esm --outfile=lib/index.js --banner:js=\"import { createRequire } from 'module';const require = createRequire(import.meta.url);\"",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "vitest run",
|
||||
"test-coverage": "vitest run --coverage",
|
||||
"format": "prettier --write .",
|
||||
"format-check": "prettier --check .",
|
||||
"prepare": "husky"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^26.1.1",
|
||||
"esbuild": "^0.28",
|
||||
"husky": "^9.1.7",
|
||||
"prettier": "^3.9.5",
|
||||
"typescript": "^7.0.2",
|
||||
"vitest": "^4"
|
||||
}
|
||||
"name": "setuphelm",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"description": "Setup helm",
|
||||
"author": "Anumita Shenoy",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.2.6",
|
||||
"@actions/exec": "^1.0.0",
|
||||
"@actions/io": "^1.0.0",
|
||||
"@actions/tool-cache": "1.1.2",
|
||||
"@octokit/graphql": "^4.6.1",
|
||||
"semver": "^6.1.0"
|
||||
},
|
||||
"main": "lib/index.js",
|
||||
"scripts": {
|
||||
"build": "ncc build src/run.ts -o lib",
|
||||
"test": "jest",
|
||||
"test-coverage": "jest --coverage"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^26.0.0",
|
||||
"@types/node": "^12.0.10",
|
||||
"@vercel/ncc": "^0.33.1",
|
||||
"jest": "^26.0.1",
|
||||
"ts-jest": "^26.0.0",
|
||||
"typescript": "^3.5.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
import {run} from './run.js'
|
||||
import * as core from '@actions/core'
|
||||
|
||||
run().catch(core.setFailed)
|
||||
+268
-755
File diff suppressed because it is too large
Load Diff
+159
-328
@@ -1,363 +1,194 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
import * as os from 'os'
|
||||
import * as path from 'path'
|
||||
import * as util from 'util'
|
||||
import * as fs from 'fs'
|
||||
import * as os from "os";
|
||||
import * as path from "path";
|
||||
import * as util from "util";
|
||||
import * as fs from "fs";
|
||||
|
||||
import * as toolCache from '@actions/tool-cache'
|
||||
import * as core from '@actions/core'
|
||||
import * as toolCache from "@actions/tool-cache";
|
||||
import * as core from "@actions/core";
|
||||
|
||||
const helmToolName = 'helm'
|
||||
export const stableHelmVersion = 'v3.18.4'
|
||||
const helmToolName = "helm";
|
||||
const stableHelmVersion = "v3.8.0";
|
||||
const helmAllReleasesUrl = "https://api.github.com/repos/helm/helm/releases";
|
||||
|
||||
export async function run() {
|
||||
let version = core.getInput('version')
|
||||
const versionFile = core.getInput('version-file')
|
||||
let version = core.getInput("version", { required: true });
|
||||
|
||||
if (versionFile) {
|
||||
if (version && version !== 'latest') {
|
||||
core.warning(
|
||||
`Both 'version' and 'version-file' inputs are specified, only 'version' will be used.`
|
||||
)
|
||||
} else {
|
||||
version = getVersionFromToolVersionsFile(versionFile)
|
||||
core.info(`Resolved Helm version '${version}' from '${versionFile}'`)
|
||||
}
|
||||
}
|
||||
if(version !== "latest" && version[0] !== "v"){
|
||||
version = getValidVersion(version);
|
||||
}
|
||||
if (version.toLocaleLowerCase() === "latest") {
|
||||
version = await getLatestHelmVersion();
|
||||
}
|
||||
|
||||
if (!version) {
|
||||
version = 'latest'
|
||||
}
|
||||
core.debug(util.format("Downloading %s", version));
|
||||
let cachedPath = await downloadHelm(version);
|
||||
|
||||
const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})
|
||||
try {
|
||||
if (!process.env["PATH"].startsWith(path.dirname(cachedPath))) {
|
||||
core.addPath(path.dirname(cachedPath));
|
||||
}
|
||||
} catch {
|
||||
//do nothing, set as output variable
|
||||
}
|
||||
|
||||
if (version.toLocaleLowerCase() === 'latest') {
|
||||
version = await getLatestHelmVersion()
|
||||
} else if (isMajorMinorShaped(version)) {
|
||||
version = await resolveLatestPatchVersion(downloadBaseURL, version)
|
||||
core.info(`Resolved latest patch Helm version to '${version}'`)
|
||||
} else if (version[0] !== 'v') {
|
||||
version = getValidVersion(version)
|
||||
core.info(`Normalized Helm version to '${version}'`)
|
||||
}
|
||||
|
||||
core.startGroup(`Installing ${version}`)
|
||||
const cachedPath = await downloadHelm(downloadBaseURL, version)
|
||||
core.endGroup()
|
||||
|
||||
try {
|
||||
if (!process.env['PATH']?.startsWith(path.dirname(cachedPath))) {
|
||||
core.addPath(path.dirname(cachedPath))
|
||||
}
|
||||
} catch {
|
||||
//do nothing, set as output variable
|
||||
}
|
||||
|
||||
core.info(`Helm tool version '${version}' has been cached at ${cachedPath}`)
|
||||
core.setOutput('helm-path', cachedPath)
|
||||
console.log(
|
||||
`Helm tool version: '${version}' has been cached at ${cachedPath}`
|
||||
);
|
||||
core.setOutput("helm-path", cachedPath);
|
||||
}
|
||||
|
||||
// Prefixes version with v
|
||||
//Returns version with proper v before it
|
||||
export function getValidVersion(version: string): string {
|
||||
return 'v' + version
|
||||
}
|
||||
return "v" + version;
|
||||
}
|
||||
|
||||
// Matches a complete semantic version (major.minor.patch with optional
|
||||
// pre-release / build metadata). This is the official regex suggested at
|
||||
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
|
||||
// with an added optional leading 'v' to accept Helm-style tags (e.g. 'v3.14.0').
|
||||
const semVerShape =
|
||||
/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
|
||||
// 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
|
||||
|
||||
// Returns true when version looks like a semantic version
|
||||
export function isSemVerShaped(version: string): boolean {
|
||||
return semVerShape.test(version)
|
||||
}
|
||||
|
||||
// Matches a major.minor version with an optional leading 'v' and either no
|
||||
// patch component or a wildcard patch ('.x' / '.*'), e.g. '3.14', 'v3.14',
|
||||
// '3.14.x', 'v3.14.*'.
|
||||
const majorMinorShape = /^v?\d+\.\d+(?:\.[x*])?$/
|
||||
|
||||
// Returns true when version is a major.minor value (optionally with a wildcard
|
||||
// patch such as '.x' or '.*')
|
||||
export function isMajorMinorShaped(version: string): boolean {
|
||||
return majorMinorShape.test(version)
|
||||
}
|
||||
|
||||
// Reads a .tool-versions file and returns the helm version declared in it
|
||||
export function getVersionFromToolVersionsFile(filePath: string): string {
|
||||
if (!fs.existsSync(filePath)) {
|
||||
throw new Error(`The version-file '${filePath}' does not exist`)
|
||||
}
|
||||
const content = fs.readFileSync(filePath, 'utf8')
|
||||
const version = parseToolVersions(content)
|
||||
if (!version) {
|
||||
throw new Error(`No helm version found in '${filePath}'`)
|
||||
}
|
||||
if (!isSemVerShaped(version) && !isMajorMinorShaped(version)) {
|
||||
throw new Error(
|
||||
`The helm version '${version}' in '${filePath}' is not valid. Provide a full version (e.g. '3.14.0') or a major.minor version (e.g. '3.14' or '3.14.x')`
|
||||
)
|
||||
}
|
||||
return version
|
||||
}
|
||||
|
||||
// Parses .tool-versions content (asdf/mise format) and returns the first
|
||||
// helm version, or an empty string when none is declared. Lines look like
|
||||
// `helm 3.14.0`; comments (#) and blank lines are ignored.
|
||||
export function parseToolVersions(content: string): string {
|
||||
for (const line of content.split(/\r?\n/)) {
|
||||
const trimmed = line.trim()
|
||||
if (!trimmed || trimmed.startsWith('#')) {
|
||||
continue
|
||||
}
|
||||
const [tool, version] = trimmed.split(/\s+/)
|
||||
if (tool === helmToolName && version) {
|
||||
return version
|
||||
}
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
// Gets the latest helm version or returns a default stable if getting latest fails
|
||||
export async function getLatestHelmVersion(): Promise<string> {
|
||||
try {
|
||||
const response = await fetch('https://get.helm.sh/helm-latest-version')
|
||||
const release = (await response.text()).trim()
|
||||
return release
|
||||
} catch (err) {
|
||||
core.warning(
|
||||
`Error while fetching latest Helm release: ${err instanceof Error ? err.message : String(err)}. Using default version ${stableHelmVersion}`
|
||||
const helmJSONPath: string = await toolCache.downloadTool(helmAllReleasesUrl);
|
||||
|
||||
try {
|
||||
const helmJSON = JSON.parse(fs.readFileSync(helmJSONPath, "utf-8"));
|
||||
for (let i in helmJSON) {
|
||||
if (isValidVersion(helmJSON[i].tag_name)) {
|
||||
return helmJSON[i].tag_name;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
core.warning(
|
||||
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;
|
||||
}
|
||||
|
||||
// Number of consecutive missing patches to probe before concluding the walk,
|
||||
// and an upper bound to keep resolution from running unbounded.
|
||||
const patchLookahead = 3
|
||||
const maxPatch = 100
|
||||
|
||||
// Sends a HEAD request for the given version's download URL. Returns true when
|
||||
// the artifact exists (2xx) and false only when it is definitively absent
|
||||
// (404). Any other status (403/405/429/5xx, ...) and genuine network errors are
|
||||
// thrown, so transient failures, rate-limiting, or a host that disallows HEAD
|
||||
// are never mistaken for a missing patch.
|
||||
export async function helmPatchExists(
|
||||
baseURL: string,
|
||||
version: string
|
||||
): Promise<boolean> {
|
||||
const url = getHelmDownloadURL(baseURL, version)
|
||||
const response = await fetch(url, {method: 'HEAD'})
|
||||
if (response.ok) {
|
||||
return true
|
||||
}
|
||||
if (response.status === 404) {
|
||||
return false
|
||||
}
|
||||
throw new Error(
|
||||
`Unexpected HTTP ${response.status} while checking for Helm artifact at ${url}`
|
||||
)
|
||||
}
|
||||
|
||||
// Attempts to resolve the latest patch in a single request via the Azure Blob
|
||||
// container-listing API that backs get.helm.sh. Returns the newest stable patch
|
||||
// version, or null when the host does not support listing (any non-listing
|
||||
// response, empty result, or error) so the caller can fall back to probing.
|
||||
// Only 'major.minor.patch-<platform>' names are matched, so prereleases and
|
||||
// sidecar files (.sha256, ...) are ignored.
|
||||
export async function resolveLatestPatchViaListing(
|
||||
baseURL: string,
|
||||
major: string,
|
||||
minor: string
|
||||
): Promise<string | null> {
|
||||
let body: string
|
||||
try {
|
||||
const listURL = new URL(baseURL)
|
||||
listURL.searchParams.set('restype', 'container')
|
||||
listURL.searchParams.set('comp', 'list')
|
||||
listURL.searchParams.set('prefix', `helm-v${major}.${minor}.`)
|
||||
const response = await fetch(listURL.toString())
|
||||
if (!response.ok) {
|
||||
return null
|
||||
}
|
||||
body = await response.text()
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
|
||||
if (!body.includes('<EnumerationResults')) {
|
||||
return null
|
||||
}
|
||||
|
||||
const patchPattern = new RegExp(
|
||||
`helm-v${major}\\.${minor}\\.(\\d+)-(?:darwin|linux|windows)`,
|
||||
'g'
|
||||
)
|
||||
let latestPatch = -1
|
||||
for (const match of body.matchAll(patchPattern)) {
|
||||
const patch = Number(match[1])
|
||||
if (patch > latestPatch) {
|
||||
latestPatch = patch
|
||||
}
|
||||
}
|
||||
|
||||
if (latestPatch < 0) {
|
||||
return null
|
||||
}
|
||||
return `v${major}.${minor}.${latestPatch}`
|
||||
}
|
||||
|
||||
// Resolves a major.minor value (e.g. '3.14' or 'v3.14') to the newest available
|
||||
// patch (e.g. 'v3.14.4'). Fast path: a single container-listing request (which
|
||||
// get.helm.sh supports). When the host does not support listing, it falls back
|
||||
// to probing the download host for sequential patches. Only 'major.minor.n'
|
||||
// artifacts are considered, so prereleases are never selected.
|
||||
export async function resolveLatestPatchVersion(
|
||||
baseURL: string,
|
||||
version: string
|
||||
): Promise<string> {
|
||||
const [major, minor] = (
|
||||
version[0] === 'v' ? version.slice(1) : version
|
||||
).split('.')
|
||||
|
||||
const listed = await resolveLatestPatchViaListing(baseURL, major, minor)
|
||||
if (listed) {
|
||||
return listed
|
||||
}
|
||||
|
||||
if (!(await helmPatchExists(baseURL, `v${major}.${minor}.0`))) {
|
||||
throw new Error(`No Helm releases found for ${major}.${minor}`)
|
||||
}
|
||||
|
||||
let latestPatch = 0
|
||||
let consecutiveMisses = 0
|
||||
for (
|
||||
let patch = 1;
|
||||
patch <= maxPatch && consecutiveMisses < patchLookahead;
|
||||
patch++
|
||||
) {
|
||||
if (await helmPatchExists(baseURL, `v${major}.${minor}.${patch}`)) {
|
||||
latestPatch = patch
|
||||
consecutiveMisses = 0
|
||||
} else {
|
||||
consecutiveMisses++
|
||||
}
|
||||
}
|
||||
|
||||
// The look-ahead is what should end the walk. Exhausting maxPatch without a
|
||||
// trailing run of misses means the host answered 200 for every probe (e.g. a
|
||||
// catch-all mirror), so the resolved version cannot be trusted.
|
||||
if (consecutiveMisses < patchLookahead) {
|
||||
throw new Error(
|
||||
`Unable to resolve latest patch for ${major}.${minor} (exceeded ${maxPatch} probes)`
|
||||
)
|
||||
}
|
||||
|
||||
return `v${major}.${minor}.${latestPatch}`
|
||||
}
|
||||
|
||||
export function getArch(): string {
|
||||
return os.arch() === 'x64' ? 'amd64' : os.arch()
|
||||
}
|
||||
|
||||
export function getPlatform(): string {
|
||||
return os.platform() === 'win32' ? 'windows' : os.platform()
|
||||
}
|
||||
|
||||
export function getArchiveExtension(): string {
|
||||
return os.platform() === 'win32' ? 'zip' : 'tar.gz'
|
||||
// isValidVersion checks if verison is a stable release
|
||||
function isValidVersion(version: string): boolean {
|
||||
return version.indexOf("rc") == -1;
|
||||
}
|
||||
|
||||
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 urlPath = `helm-${version}-${getPlatform()}-${getArch()}.${getArchiveExtension()}`
|
||||
// Ensure the base ends with '/' so a subpath mirror (e.g.
|
||||
// 'https://example/kubernetes/helm') is preserved; otherwise URL resolution
|
||||
// replaces the last path segment and points at the wrong location.
|
||||
const base = baseURL.endsWith('/') ? baseURL : `${baseURL}/`
|
||||
const url = new URL(urlPath, base)
|
||||
return url.toString()
|
||||
const LINUX = "Linux";
|
||||
const MAC_OS = "Darwin";
|
||||
const WINDOWS = "Windows_NT";
|
||||
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(
|
||||
baseURL: string,
|
||||
version: string
|
||||
): Promise<string> {
|
||||
let cachedToolpath = toolCache.find(helmToolName, version)
|
||||
if (cachedToolpath) {
|
||||
core.info(`Restoring '${version}' from cache`)
|
||||
} else {
|
||||
core.info(`Downloading '${version}' from '${baseURL}'`)
|
||||
let helmDownloadPath
|
||||
try {
|
||||
helmDownloadPath = await toolCache.downloadTool(
|
||||
getHelmDownloadURL(baseURL, version)
|
||||
)
|
||||
} catch (exception) {
|
||||
throw new Error(
|
||||
`Failed to download Helm from location ${getHelmDownloadURL(
|
||||
baseURL,
|
||||
version
|
||||
)}`
|
||||
)
|
||||
}
|
||||
|
||||
fs.chmodSync(helmDownloadPath, '755')
|
||||
const extractedPath =
|
||||
getPlatform() === 'windows'
|
||||
? await toolCache.extractZip(helmDownloadPath)
|
||||
: await toolCache.extractTar(helmDownloadPath)
|
||||
|
||||
cachedToolpath = await toolCache.cacheDir(
|
||||
extractedPath,
|
||||
helmToolName,
|
||||
version
|
||||
)
|
||||
}
|
||||
|
||||
const helmpath = findHelm(cachedToolpath)
|
||||
if (!helmpath) {
|
||||
export async function downloadHelm(version: string): Promise<string> {
|
||||
let cachedToolpath = toolCache.find(helmToolName, version);
|
||||
if (!cachedToolpath) {
|
||||
let helmDownloadPath;
|
||||
try {
|
||||
helmDownloadPath = await toolCache.downloadTool(
|
||||
getHelmDownloadURL(version)
|
||||
);
|
||||
} catch (exception) {
|
||||
throw new Error(
|
||||
util.format('Helm executable not found in path', cachedToolpath)
|
||||
)
|
||||
}
|
||||
util.format(
|
||||
"Failed to download Helm from location",
|
||||
getHelmDownloadURL(version)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
fs.chmodSync(helmpath, '755')
|
||||
return helmpath
|
||||
fs.chmodSync(helmDownloadPath, "777");
|
||||
const unzipedHelmPath = await toolCache.extractZip(helmDownloadPath);
|
||||
cachedToolpath = await toolCache.cacheDir(
|
||||
unzipedHelmPath,
|
||||
helmToolName,
|
||||
version
|
||||
);
|
||||
}
|
||||
|
||||
const helmpath = findHelm(cachedToolpath);
|
||||
if (!helmpath) {
|
||||
throw new Error(
|
||||
util.format("Helm executable not found in path", cachedToolpath)
|
||||
);
|
||||
}
|
||||
|
||||
fs.chmodSync(helmpath, "777");
|
||||
return helmpath;
|
||||
}
|
||||
|
||||
export function findHelm(rootFolder: string): string {
|
||||
fs.chmodSync(rootFolder, '755')
|
||||
let filelist: string[] = []
|
||||
walkSync(rootFolder, filelist, helmToolName + getExecutableExtension())
|
||||
if (!filelist || filelist.length == 0) {
|
||||
throw new Error(
|
||||
util.format('Helm executable not found in path', rootFolder)
|
||||
)
|
||||
} else {
|
||||
return filelist[0]
|
||||
}
|
||||
fs.chmodSync(rootFolder, "777");
|
||||
var filelist: string[] = [];
|
||||
walkSync(rootFolder, filelist, helmToolName + getExecutableExtension());
|
||||
if (!filelist || filelist.length == 0) {
|
||||
throw new Error(
|
||||
util.format("Helm executable not found in path", rootFolder)
|
||||
);
|
||||
} else {
|
||||
return filelist[0];
|
||||
}
|
||||
}
|
||||
|
||||
export function walkSync(dir, filelist, fileToFind) {
|
||||
const files = fs.readdirSync(dir)
|
||||
filelist = filelist || []
|
||||
files.forEach(function (file) {
|
||||
if (fs.statSync(path.join(dir, file)).isDirectory()) {
|
||||
filelist = walkSync(path.join(dir, file), filelist, fileToFind)
|
||||
} else {
|
||||
core.debug(file)
|
||||
if (file == fileToFind) {
|
||||
filelist.push(path.join(dir, file))
|
||||
}
|
||||
export var walkSync = function (dir, filelist, fileToFind) {
|
||||
var files = fs.readdirSync(dir);
|
||||
filelist = filelist || [];
|
||||
files.forEach(function (file) {
|
||||
if (fs.statSync(path.join(dir, file)).isDirectory()) {
|
||||
filelist = walkSync(path.join(dir, file), filelist, fileToFind);
|
||||
} else {
|
||||
core.debug(file);
|
||||
if (file == fileToFind) {
|
||||
filelist.push(path.join(dir, file));
|
||||
}
|
||||
})
|
||||
return filelist
|
||||
}
|
||||
}
|
||||
});
|
||||
return filelist;
|
||||
};
|
||||
|
||||
run().catch(core.setFailed);
|
||||
|
||||
+62
-12
@@ -1,14 +1,64 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"module": "NodeNext",
|
||||
"moduleResolution": "NodeNext",
|
||||
"rootDir": "./src",
|
||||
"outDir": "./lib",
|
||||
"noImplicitAny": false,
|
||||
"skipLibCheck": true,
|
||||
"noEmit": true,
|
||||
"types": ["node", "vitest/globals"]
|
||||
},
|
||||
"exclude": ["node_modules", "**/*.test.ts", "vitest.config.ts"]
|
||||
"compilerOptions": {
|
||||
/* Basic Options */
|
||||
// "incremental": true, /* Enable incremental compilation */
|
||||
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||
// "checkJs": true, /* Report errors in .js files. */
|
||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
||||
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
||||
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||
"outDir": "./lib", /* Redirect output structure to the directory. */
|
||||
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||
// "composite": true, /* Enable project compilation */
|
||||
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
||||
// "removeComments": true, /* Do not emit comments to output. */
|
||||
// "noEmit": true, /* Do not emit outputs. */
|
||||
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||
|
||||
/* Strict Type-Checking Options */
|
||||
//"strict": true, /* Enable all strict type-checking options. */
|
||||
"noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* Enable strict null checks. */
|
||||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
||||
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||
|
||||
/* Additional Checks */
|
||||
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
||||
|
||||
/* Module Resolution Options */
|
||||
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||
// "types": [], /* Type declaration files to be included in compilation. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||
// "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
|
||||
/* Source Map Options */
|
||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||
|
||||
/* Experimental Options */
|
||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"exclude": ["node_modules", "**/*.test.ts"]
|
||||
}
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
import {defineConfig} from 'vitest/config'
|
||||
|
||||
export default defineConfig({
|
||||
test: {
|
||||
globals: true,
|
||||
environment: 'node',
|
||||
include: ['**/*.test.ts'],
|
||||
clearMocks: true
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user