mirror of
https://github.com/Azure/setup-helm.git
synced 2025-12-22 07:15:45 +00:00
Compare commits
1 Commits
update-cod
...
v4.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7246b12e7 |
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -1 +1 @@
|
|||||||
* @Azure/cloud-native-github-action-owners
|
* @Azure/aks-atlanta
|
||||||
|
|||||||
18
.github/dependabot.yml
vendored
18
.github/dependabot.yml
vendored
@@ -1,18 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: /
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
groups:
|
|
||||||
actions:
|
|
||||||
patterns:
|
|
||||||
- '*'
|
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: .github/workflows
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
groups:
|
|
||||||
actions:
|
|
||||||
patterns:
|
|
||||||
- '*'
|
|
||||||
4
.github/workflows/defaultLabels.yml
vendored
4
.github/workflows/defaultLabels.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 #v9.1.0
|
- uses: actions/stale@v9
|
||||||
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@5bef64f19d7facfb25b37b414482c7164d639639 #v9.1.0
|
- uses: actions/stale@v9
|
||||||
name: Setting PR as idle
|
name: Setting PR as idle
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
2
.github/workflows/integration-tests.yml
vendored
2
.github/workflows/integration-tests.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
- name: npm install and build
|
- name: npm install and build
|
||||||
id: action-npm-build
|
id: action-npm-build
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
6
.github/workflows/prettify-code.yml
vendored
6
.github/workflows/prettify-code.yml
vendored
@@ -10,7 +10,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Enforce Prettier
|
- name: Enforce Prettier
|
||||||
run: npx prettier --check .
|
uses: actionsx/prettier@v3
|
||||||
|
with:
|
||||||
|
args: --check .
|
||||||
|
|||||||
2
.github/workflows/release-pr.yml
vendored
2
.github/workflows/release-pr.yml
vendored
@@ -13,6 +13,6 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
actions: read
|
actions: read
|
||||||
contents: write
|
contents: write
|
||||||
uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@3c677ba5ab58f5c5c1a6f0cfb176b333b1f27405 # v1.0.3
|
uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@a705b2ab6a3ee889f2b0d925ad0bd2f9eb733ce6
|
||||||
with:
|
with:
|
||||||
changelogPath: ./CHANGELOG.md
|
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@c753e1545b144562237cd1177a95bab21a785cff # main
|
uses: OliverMKing/javascript-release-workflow/.github/workflows/tag-and-release.yml@main
|
||||||
|
|||||||
2
.github/workflows/unit-tests.yml
vendored
2
.github/workflows/unit-tests.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
build: # make sure build/ci works properly
|
build: # make sure build/ci works properly
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Run L0 tests.
|
- name: Run L0 tests.
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -11,8 +11,6 @@ pids
|
|||||||
*.seed
|
*.seed
|
||||||
*.pid.lock
|
*.pid.lock
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
# Coverage directory used by tools like istanbul
|
||||||
coverage
|
coverage
|
||||||
@@ -64,4 +62,3 @@ node_modules
|
|||||||
coverage
|
coverage
|
||||||
|
|
||||||
# Transpiled JS
|
# Transpiled JS
|
||||||
lib/
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
10
CHANGELOG.md
10
CHANGELOG.md
@@ -1,15 +1,5 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [4.3.0] - 2025-02-15
|
|
||||||
|
|
||||||
- #152 feat: log when restoring from cache
|
|
||||||
- #157 Dependencies Update
|
|
||||||
- #137 Add dependabot
|
|
||||||
|
|
||||||
## [4.2.0] - 2024-04-15
|
|
||||||
|
|
||||||
- #124 Fix OS detection and download OS-native archive extension
|
|
||||||
|
|
||||||
## [4.1.0] - 2024-03-01
|
## [4.1.0] - 2024-03-01
|
||||||
|
|
||||||
- #130 switches to use Helm published file to read latest version instead of using GitHub releases
|
- #130 switches to use Helm published file to read latest version instead of using GitHub releases
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Install a specific version of helm binary on the runner.
|
|||||||
Acceptable values are latest or any semantic version string like v3.5.0 Use this action in workflow to define which version of helm will be used. v2+ of this action only support Helm3.
|
Acceptable values are latest or any semantic version string like v3.5.0 Use this action in workflow to define which version of helm will be used. v2+ of this action only support Helm3.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- uses: azure/setup-helm@v4.3.0
|
- uses: azure/setup-helm@v4.1.0
|
||||||
with:
|
with:
|
||||||
version: '<version>' # default is latest (stable)
|
version: '<version>' # default is latest (stable)
|
||||||
id: install
|
id: install
|
||||||
|
|||||||
30640
lib/index.js
Normal file
30640
lib/index.js
Normal file
File diff suppressed because one or more lines are too long
3460
package-lock.json
generated
3460
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
31
package.json
31
package.json
@@ -1,36 +1,35 @@
|
|||||||
{
|
{
|
||||||
"name": "setuphelm",
|
"name": "setuphelm",
|
||||||
"version": "4.3.0",
|
"version": "4.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Setup helm",
|
"description": "Setup helm",
|
||||||
"author": "Anumita Shenoy",
|
"author": "Anumita Shenoy",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/io": "^1.1.2",
|
||||||
"@actions/tool-cache": "2.0.2",
|
"@actions/tool-cache": "2.0.1",
|
||||||
"@octokit/action": "^8.0.2",
|
"@octokit/action": "^6.0.7",
|
||||||
"semver": "^7.7.2"
|
"ncc": "^0.3.6",
|
||||||
|
"semver": "^7.5.4"
|
||||||
},
|
},
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prebuild": "npm i ncc",
|
"prebuild": "npm i ncc",
|
||||||
"build": "ncc build src/index.ts -o lib",
|
"build": "ncc build src/run.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": "^30.0.0",
|
"@types/jest": "^29.5.11",
|
||||||
"@types/node": "^24.0.13",
|
"@types/node": "^20.11.8",
|
||||||
"@vercel/ncc": "^0.38.3",
|
"@vercel/ncc": "^0.38.1",
|
||||||
"husky": "^9.1.7",
|
"jest": "^29.7.0",
|
||||||
"jest": "^30.0.4",
|
"prettier": "^3.2.5",
|
||||||
"prettier": "^3.6.2",
|
"ts-jest": "^29.1.2",
|
||||||
"ts-jest": "^29.4.0",
|
"typescript": "^5.3.3"
|
||||||
"typescript": "^5.8.3"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
import {run} from './run'
|
|
||||||
import * as core from '@actions/core'
|
|
||||||
|
|
||||||
run().catch(core.setFailed)
|
|
||||||
208
src/run.test.ts
208
src/run.test.ts
@@ -6,74 +6,84 @@ import * as path from 'path'
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
|
|
||||||
describe('run.ts', () => {
|
describe('run.ts', () => {
|
||||||
const downloadBaseURL = 'https://test.tld'
|
|
||||||
|
|
||||||
// Cleanup mocks after each test to ensure that subsequent tests are not affected by the mocks.
|
|
||||||
afterEach(() => {
|
|
||||||
jest.restoreAllMocks()
|
|
||||||
})
|
|
||||||
|
|
||||||
test('getExecutableExtension() - return .exe when os is Windows', () => {
|
test('getExecutableExtension() - return .exe when os is Windows', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
expect(run.getExecutableExtension()).toBe('.exe')
|
expect(run.getExecutableExtension()).toBe('.exe')
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getExecutableExtension() - return empty string for non-windows OS', () => {
|
test('getExecutableExtension() - return empty string for non-windows OS', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
||||||
|
|
||||||
expect(run.getExecutableExtension()).toBe('')
|
expect(run.getExecutableExtension()).toBe('')
|
||||||
expect(os.platform).toHaveBeenCalled()
|
expect(os.type).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Linux amd64', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Linux', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('linux')
|
const downloadBaseURL = 'https://test.tld'
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-linux-amd64.tar.gz'
|
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
jest.spyOn(os, 'type').mockReturnValue('Linux')
|
||||||
expect(os.platform).toHaveBeenCalled()
|
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
|
||||||
|
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 Linux arm64', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Darwin', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('linux')
|
const downloadBaseURL = 'https://test.tld'
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('arm64')
|
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-linux-arm64.tar.gz'
|
|
||||||
|
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
||||||
expect(os.platform).toHaveBeenCalled()
|
jest.spyOn(os, 'arch').mockReturnValueOnce('unknown')
|
||||||
|
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()
|
||||||
|
|
||||||
|
// arm64
|
||||||
|
jest.spyOn(os, 'type').mockReturnValue('Darwin')
|
||||||
|
jest.spyOn(os, 'arch').mockReturnValueOnce('arm64')
|
||||||
|
const helmDarwinArm64Url = 'https://test.tld/helm-v3.8.0-darwin-arm64.zip'
|
||||||
|
|
||||||
|
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(
|
||||||
|
helmDarwinArm64Url
|
||||||
|
)
|
||||||
|
expect(os.type).toHaveBeenCalled()
|
||||||
expect(os.arch).toHaveBeenCalled()
|
expect(os.arch).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getHelmDownloadURL() - return the URL to download helm for Darwin x64', () => {
|
test('getValidVersion() - return version with v prepended', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('darwin')
|
expect(run.getValidVersion('3.8.0')).toBe('v3.8.0')
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-darwin-amd64.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 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', () => {
|
test('getHelmDownloadURL() - return the URL to download helm for Windows', () => {
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
const downloadBaseURL = 'https://test.tld'
|
||||||
jest.spyOn(os, 'arch').mockReturnValue('x64')
|
|
||||||
|
|
||||||
const expected = 'https://test.tld/helm-v3.8.0-windows-amd64.zip'
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
expect(run.getHelmDownloadURL(downloadBaseURL, 'v3.8.0')).toBe(expected)
|
|
||||||
expect(os.platform).toHaveBeenCalled()
|
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 latest version of HELM', async () => {
|
test('getLatestHelmVersion() - return the latest version of HELM', async () => {
|
||||||
@@ -91,30 +101,25 @@ describe('run.ts', () => {
|
|||||||
expect(await run.getLatestHelmVersion()).toBe('v3.13.3')
|
expect(await run.getLatestHelmVersion()).toBe('v3.13.3')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('getValidVersion() - return version with v prepended', () => {
|
|
||||||
expect(run.getValidVersion('3.8.0')).toBe('v3.8.0')
|
|
||||||
})
|
|
||||||
|
|
||||||
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<Buffer<ArrayBufferLike>>,
|
'file1' as unknown as fs.Dirent,
|
||||||
'file2' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'file2' as unknown as fs.Dirent,
|
||||||
'folder1' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'folder1' as unknown as fs.Dirent,
|
||||||
'folder2' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
'folder2' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder1'))
|
if (file == path.join('mainFolder', 'folder1'))
|
||||||
return [
|
return [
|
||||||
'file11' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'file11' as unknown as fs.Dirent,
|
||||||
'file12' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
'file12' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder2'))
|
if (file == path.join('mainFolder', 'folder2'))
|
||||||
return [
|
return [
|
||||||
'file21' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'file21' as unknown as fs.Dirent,
|
||||||
'file22' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
'file22' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(core, 'debug').mockImplementation()
|
jest.spyOn(core, 'debug').mockImplementation()
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
@@ -134,22 +139,21 @@ 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<Buffer<ArrayBufferLike>>,
|
'file1' as unknown as fs.Dirent,
|
||||||
'file2' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'file2' as unknown as fs.Dirent,
|
||||||
'folder1' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'folder1' as unknown as fs.Dirent,
|
||||||
'folder2' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
'folder2' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder1'))
|
if (file == path.join('mainFolder', 'folder1'))
|
||||||
return [
|
return [
|
||||||
'file11' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'file11' as unknown as fs.Dirent,
|
||||||
'file12' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
'file12' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
if (file == path.join('mainFolder', 'folder2'))
|
if (file == path.join('mainFolder', 'folder2'))
|
||||||
return [
|
return [
|
||||||
'file21' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>,
|
'file21' as unknown as fs.Dirent,
|
||||||
'file22' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
'file22' as unknown as fs.Dirent
|
||||||
]
|
]
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(core, 'debug').mockImplementation()
|
jest.spyOn(core, 'debug').mockImplementation()
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
@@ -166,16 +170,14 @@ 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')
|
if (file == 'mainFolder') return ['helm.exe' as unknown as fs.Dirent]
|
||||||
return ['helm.exe' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>]
|
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
const isDirectory =
|
const isDirectory =
|
||||||
(file as string).indexOf('folder') == -1 ? false : true
|
(file as string).indexOf('folder') == -1 ? false : true
|
||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
})
|
})
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
expect(run.findHelm('mainFolder')).toBe(
|
expect(run.findHelm('mainFolder')).toBe(
|
||||||
path.join('mainFolder', 'helm.exe')
|
path.join('mainFolder', 'helm.exe')
|
||||||
@@ -186,13 +188,11 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => {
|
||||||
if (file == 'mainFolder') return []
|
if (file == 'mainFolder') return []
|
||||||
return []
|
|
||||||
})
|
})
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
return {isDirectory: () => true} as fs.Stats
|
return {isDirectory: () => true} as fs.Stats
|
||||||
})
|
})
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
expect(() => run.findHelm('mainFolder')).toThrow(
|
expect(() => run.findHelm('mainFolder')).toThrow(
|
||||||
'Helm executable not found in path mainFolder'
|
'Helm executable not found in path mainFolder'
|
||||||
)
|
)
|
||||||
@@ -203,22 +203,24 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
||||||
const response = JSON.stringify([{tag_name: 'v4.0.0'}])
|
const response = JSON.stringify([{tag_name: 'v4.0.0'}])
|
||||||
jest.spyOn(fs, 'readFileSync').mockReturnValue(response)
|
jest.spyOn(fs, 'readFileSync').mockReturnValue(response)
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest.spyOn(toolCache, 'extractZip').mockResolvedValue('extractedPath')
|
jest
|
||||||
|
.spyOn(toolCache, 'extractZip')
|
||||||
|
.mockResolvedValue('pathToUnzippedHelm')
|
||||||
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
||||||
jest
|
jest
|
||||||
.spyOn(fs, 'readdirSync')
|
.spyOn(fs, 'readdirSync')
|
||||||
.mockImplementation((file, _) => [
|
.mockImplementation((file, _) => ['helm.exe' as unknown as fs.Dirent])
|
||||||
'helm.exe' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
|
||||||
])
|
|
||||||
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
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(await run.downloadHelm(downloadBaseURL, 'v4.0.0')).toBe(
|
const baseURL = 'https://test.tld'
|
||||||
|
|
||||||
|
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')
|
||||||
@@ -238,35 +240,26 @@ describe('run.ts', () => {
|
|||||||
jest.spyOn(toolCache, 'downloadTool').mockImplementation(async () => {
|
jest.spyOn(toolCache, 'downloadTool').mockImplementation(async () => {
|
||||||
throw 'Unable to download'
|
throw 'Unable to download'
|
||||||
})
|
})
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
|
|
||||||
const downloadUrl = 'https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
const baseURL = 'https://test.tld'
|
||||||
await expect(run.downloadHelm(downloadBaseURL, 'v3.2.1')).rejects.toThrow(
|
|
||||||
`Failed to download Helm from location ${downloadUrl}`
|
await expect(run.downloadHelm(baseURL, 'v3.2.1')).rejects.toThrow(
|
||||||
|
'Failed to download Helm from location https://test.tld/helm-v3.2.1-windows-amd64.zip'
|
||||||
)
|
)
|
||||||
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
expect(toolCache.find).toHaveBeenCalledWith('helm', 'v3.2.1')
|
||||||
expect(toolCache.downloadTool).toHaveBeenCalledWith(`${downloadUrl}`)
|
expect(toolCache.downloadTool).toHaveBeenCalledWith(
|
||||||
|
'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(fs, 'chmodSync').mockImplementation(() => {})
|
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
||||||
jest
|
|
||||||
.spyOn(fs, 'readdirSync')
|
|
||||||
.mockReturnValue([
|
|
||||||
'helm.exe' as unknown as fs.Dirent<Buffer<ArrayBufferLike>>
|
|
||||||
])
|
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
|
||||||
const isDirectory =
|
|
||||||
(file as string).indexOf('folder') == -1 ? false : true
|
|
||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
|
||||||
})
|
|
||||||
|
|
||||||
expect(await run.downloadHelm(downloadBaseURL, 'v3.2.1')).toBe(
|
const baseURL = 'https://test.tld'
|
||||||
|
|
||||||
|
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')
|
||||||
@@ -279,11 +272,12 @@ describe('run.ts', () => {
|
|||||||
test('downloadHelm() - throw error is helm is not found in path', async () => {
|
test('downloadHelm() - throw error is helm is not found in path', async () => {
|
||||||
jest.spyOn(toolCache, 'find').mockReturnValue('')
|
jest.spyOn(toolCache, 'find').mockReturnValue('')
|
||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
||||||
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
|
||||||
jest.spyOn(toolCache, 'downloadTool').mockResolvedValue('pathToTool')
|
|
||||||
jest.spyOn(toolCache, 'extractZip').mockResolvedValue('extractedPath')
|
|
||||||
jest.spyOn(os, 'platform').mockReturnValue('win32')
|
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation()
|
jest.spyOn(fs, 'chmodSync').mockImplementation()
|
||||||
|
jest
|
||||||
|
.spyOn(toolCache, 'extractZip')
|
||||||
|
.mockResolvedValue('pathToUnzippedHelm')
|
||||||
|
jest.spyOn(toolCache, 'cacheDir').mockResolvedValue('pathToCachedDir')
|
||||||
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => [])
|
jest.spyOn(fs, 'readdirSync').mockImplementation((file, _) => [])
|
||||||
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
jest.spyOn(fs, 'statSync').mockImplementation((file) => {
|
||||||
const isDirectory =
|
const isDirectory =
|
||||||
@@ -291,7 +285,9 @@ describe('run.ts', () => {
|
|||||||
return {isDirectory: () => isDirectory} as fs.Stats
|
return {isDirectory: () => isDirectory} as fs.Stats
|
||||||
})
|
})
|
||||||
|
|
||||||
await expect(run.downloadHelm(downloadBaseURL, 'v3.2.1')).rejects.toThrow(
|
const baseURL = 'https://test.tld'
|
||||||
|
|
||||||
|
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')
|
||||||
|
|||||||
63
src/run.ts
63
src/run.ts
@@ -1,4 +1,5 @@
|
|||||||
// Copyright (c) Microsoft Corporation.
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
// Licensed under the MIT license.
|
// Licensed under the MIT license.
|
||||||
|
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
@@ -25,7 +26,7 @@ export async function run() {
|
|||||||
|
|
||||||
const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})
|
const downloadBaseURL = core.getInput('downloadBaseURL', {required: false})
|
||||||
|
|
||||||
core.startGroup(`Installing ${version}`)
|
core.startGroup(`Downloading ${version}`)
|
||||||
const cachedPath = await downloadHelm(downloadBaseURL, version)
|
const cachedPath = await downloadHelm(downloadBaseURL, version)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
@@ -60,24 +61,41 @@ export async function getLatestHelmVersion(): Promise<string> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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'
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getExecutableExtension(): string {
|
export function getExecutableExtension(): string {
|
||||||
return os.platform() === 'win32' ? '.exe' : ''
|
if (os.type().match(/^Win/)) {
|
||||||
|
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 urlPath = `helm-${version}-${getPlatform()}-${getArch()}.${getArchiveExtension()}`
|
const arch = os.arch()
|
||||||
|
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()
|
||||||
}
|
}
|
||||||
@@ -87,10 +105,7 @@ 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(
|
||||||
@@ -106,13 +121,9 @@ export async function downloadHelm(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fs.chmodSync(helmDownloadPath, '777')
|
fs.chmodSync(helmDownloadPath, '777')
|
||||||
const extractedPath =
|
const unzipedHelmPath = await toolCache.extractZip(helmDownloadPath)
|
||||||
getPlatform() === 'windows'
|
|
||||||
? await toolCache.extractZip(helmDownloadPath)
|
|
||||||
: await toolCache.extractTar(helmDownloadPath)
|
|
||||||
|
|
||||||
cachedToolpath = await toolCache.cacheDir(
|
cachedToolpath = await toolCache.cacheDir(
|
||||||
extractedPath,
|
unzipedHelmPath,
|
||||||
helmToolName,
|
helmToolName,
|
||||||
version
|
version
|
||||||
)
|
)
|
||||||
@@ -157,3 +168,5 @@ export var walkSync = function (dir, filelist, fileToFind) {
|
|||||||
})
|
})
|
||||||
return filelist
|
return filelist
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run().catch(core.setFailed)
|
||||||
|
|||||||
Reference in New Issue
Block a user