Compare commits

...

4 commits

Author SHA1 Message Date
github-actions[bot]
901a10e89e
v3 new release (#78)
* Bump ansi-regex from 5.0.0 to 5.0.1 (#56)

Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Vidya reddy prettier (#58)

* upgraded to Node16

* Enforce Prettier

* code fix

* jest version change and prettify code

Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com>

* Upgraded the ncc version (#61)

Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com>

* Update README example to v3 (#60)

* Bump @actions/core from 1.9.0 to 1.9.1 (#63)

Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.9.0 to 1.9.1.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

---
updated-dependencies:
- dependency-name: "@actions/core"
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add the issue report and feature request form (#64)

* syntax error fixes (#66)

* added support message (#67)

* Bump @actions/core (#68)

to address https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

* Bump decode-uri-component from 0.2.0 to 0.2.2 (#73)

Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases)
- [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: decode-uri-component
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* change uri (#77)

* Add node modules and compiled JavaScript from main

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Vidya Reddy <59590642+Vidya2606@users.noreply.github.com>
Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com>
Co-authored-by: Oliver King <olivermerkleyking@gmail.com>
Co-authored-by: Asa Gayle <azmatch.gayle@gmail.com>
Co-authored-by: Sumner Warren <sumner.warren@gmail.com>
Co-authored-by: Oliver King <oking3@uncc.edu>
2023-01-09 13:58:02 -05:00
github-actions[bot]
e1be5e75ed
v3 new release (#72)
* Bump ansi-regex from 5.0.0 to 5.0.1 (#56)

Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Vidya reddy prettier (#58)

* upgraded to Node16

* Enforce Prettier

* code fix

* jest version change and prettify code

Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com>

* Upgraded the ncc version (#61)

Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com>

* Update README example to v3 (#60)

* Bump @actions/core from 1.9.0 to 1.9.1 (#63)

Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.9.0 to 1.9.1.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

---
updated-dependencies:
- dependency-name: "@actions/core"
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add the issue report and feature request form (#64)

* syntax error fixes (#66)

* added support message (#67)

* Bump @actions/core (#68)

to address https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

* Add node modules and compiled JavaScript from main

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Vidya Reddy <59590642+Vidya2606@users.noreply.github.com>
Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com>
Co-authored-by: Oliver King <olivermerkleyking@gmail.com>
Co-authored-by: Asa Gayle <azmatch.gayle@gmail.com>
Co-authored-by: Sumner Warren <sumner.warren@gmail.com>
Co-authored-by: Oliver King <oking3@uncc.edu>
2022-12-05 13:21:32 -05:00
Oliver King
b196533533
Delete node_modules directory (#71) 2022-12-05 12:02:40 -05:00
github-actions[bot]
7f7e5ba5ea
Add node modules and compiled JavaScript from main (#57)
Co-authored-by: Oliver King <oking3@uncc.edu>
2022-06-21 12:18:30 -04:00
25 changed files with 19037 additions and 11301 deletions

View file

@ -4,7 +4,4 @@ about: Create a report to help us improve
title: '' title: ''
labels: need-to-triage labels: need-to-triage
assignees: '@aksatlanta' assignees: '@aksatlanta'
--- ---

View file

@ -0,0 +1,36 @@
name: Bug Report
description: File a bug report specifying all inputs you provided for the action, we will respond to this thread with any questions.
title: 'Bug: '
labels: ['bug', 'triage']
assignees: '@Azure/aks-atlanta'
body:
- type: textarea
id: What-happened
attributes:
label: What happened?
description: Tell us what happened and how is it different from the expected?
placeholder: Tell us what you see!
validations:
required: true
- type: checkboxes
id: Version
attributes:
label: Version
options:
- label: I am using the latest version
required: true
- type: input
id: Runner
attributes:
label: Runner
description: What runner are you using?
placeholder: Mention the runner info (self-hosted, operating system)
validations:
required: true
- type: textarea
id: Logs
attributes:
label: Relevant log output
description: Run in debug mode for the most verbose logs. Please feel free to attach a screenshot of the logs
validations:
required: true

6
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,6 @@
blank_issues_enabled: false
contact_links:
- name: GitHub Action "setup-kubectl" Support
url: https://github.com/Azure/setup-kubectl
security: https://github.com/Azure/setup-kubectl/blob/main/SECURITY.md
about: Please ask and answer questions here.

View file

@ -0,0 +1,13 @@
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

View file

@ -1,30 +1,30 @@
name: setting-default-labels name: setting-default-labels
on: on:
schedule: schedule:
- cron: "0 0/3 * * *" - cron: '0 0/3 * * *'
jobs: jobs:
label-issues: label-issues:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v3 - uses: actions/stale@v3
name: Setting issue as idle name: Setting issue as idle
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is idle because it has been open for 14 days with no activity.' stale-issue-message: 'This issue is idle because it has been open for 14 days with no activity.'
stale-issue-label: 'idle' stale-issue-label: 'idle'
days-before-stale: 14 days-before-stale: 14
days-before-close: -1 days-before-close: -1
operations-per-run: 100 operations-per-run: 100
exempt-issue-labels: 'backlog' exempt-issue-labels: 'backlog'
- uses: actions/stale@v3 - uses: actions/stale@v3
name: Setting PR as idle name: Setting PR as idle
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-pr-message: 'This PR is idle because it has been open for 14 days with no activity.' stale-pr-message: 'This PR is idle because it has been open for 14 days with no activity.'
stale-pr-label: 'idle' stale-pr-label: 'idle'
days-before-stale: 14 days-before-stale: 14
days-before-close: -1 days-before-close: -1
operations-per-run: 100 operations-per-run: 100

View file

@ -1,49 +1,49 @@
name: Integration test for setup-kubectl name: Integration test for setup-kubectl
on: # rebuild any PRs and main branch changes on: # rebuild any PRs and main branch changes
pull_request: pull_request:
branches: branches:
- main - main
- "releases/*" - 'releases/*'
push: push:
branches: branches:
- main - main
- "releases/*" - 'releases/*'
jobs: jobs:
run-integration-test: run-integration-test:
name: Validate release and master branch name: Validate release and master branch
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
KUBECONFIG: /home/runner/.kube/config KUBECONFIG: /home/runner/.kube/config
PR_BASE_REF: ${{ github.event.pull_request.base.ref }} PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
name: Checkout from PR branch name: Checkout from PR branch
- id: action-npm-build - id: action-npm-build
name: npm install and build name: npm install and build
run: | run: |
echo $PR_BASE_REF echo $PR_BASE_REF
if [[ $PR_BASE_REF != releases/* ]]; then if [[ $PR_BASE_REF != releases/* ]]; then
npm install npm install
npm run build npm run build
fi fi
- uses: actions/setup-python@v2 - uses: actions/setup-python@v2
name: Install Python name: Install Python
with: with:
python-version: "3.x" python-version: '3.x'
- name: Install requests library - name: Install requests library
run: pip install requests run: pip install requests
- name: Validate kubectl setup - name: Validate kubectl setup
run: python test/validate-kubectl.py !v1.15.1 run: python test/validate-kubectl.py latest
- name: Setup kubectl - name: Setup kubectl
uses: ./ uses: ./
with: with:
version: "v1.15.1" version: 'v1.15.1'
- name: Validate kubectl setup - name: Validate kubectl setup
run: python test/validate-kubectl.py 'v1.15.1' run: python test/validate-kubectl.py 'v1.15.1'

18
.github/workflows/prettify-code.yml vendored Normal file
View file

@ -0,0 +1,18 @@
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@v2
- name: Enforce Prettier
uses: actionsx/prettier@v2
with:
args: --check .

View file

@ -1,14 +1,14 @@
name: Create release PR name: Create release PR
on: on:
workflow_dispatch: workflow_dispatch:
inputs: inputs:
release: release:
description: "Define release version (ex: v1, v2, v3)" description: 'Define release version (ex: v1, v2, v3)'
required: true required: true
jobs: jobs:
release-pr: release-pr:
uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main
with: with:
release: ${{ github.event.inputs.release }} release: ${{ github.event.inputs.release }}

View file

@ -1,10 +1,10 @@
name: Tag and create release draft name: Tag and create release draft
on: on:
push: push:
branches: branches:
- releases/* - releases/*
jobs: jobs:
tag-and-release: tag-and-release:
uses: OliverMKing/javascript-release-workflow/.github/workflows/tag-and-release.yml@main uses: OliverMKing/javascript-release-workflow/.github/workflows/tag-and-release.yml@main

View file

@ -1,21 +1,21 @@
name: "Run unit tests." name: 'Run unit tests.'
on: # rebuild any PRs and main branch changes on: # rebuild any PRs and main branch changes
pull_request: pull_request:
branches: branches:
- main - main
- 'releases/*' - 'releases/*'
push: push:
branches: branches:
- main - main
- 'releases/*' - 'releases/*'
jobs: 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@v1 - uses: actions/checkout@v1
- name: Build and run L0 tests. - name: Build and run L0 tests.
run: | run: |
npm install npm install
npm test npm test

1
.gitignore vendored
View file

@ -330,4 +330,3 @@ ASALocalRun/
node_modules node_modules
# Transpiled JS # Transpiled JS
lib/

4
.prettierignore Normal file
View file

@ -0,0 +1,4 @@
# dependencies
/node_modules
coverage
/lib

8
.prettierrc.json Normal file
View file

@ -0,0 +1,8 @@
{
"trailingComma": "none",
"bracketSpacing": false,
"semi": false,
"tabWidth": 3,
"singleQuote": true,
"printWidth": 80
}

View file

@ -1,9 +1,9 @@
# Microsoft Open Source Code of Conduct # Microsoft Open Source Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
Resources: Resources:
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns

View file

@ -1,26 +1,32 @@
# Setup Kubectl # Setup Kubectl
#### Sample workflow to install a specific version of kubectl binary on the runner.
#### Sample workflow to install a specific version of kubectl binary on the runner.
Acceptable values are latest or any semantic version string like `v1.15.0`. Use this action in workflow to define which version of kubectl will be used.
Acceptable values are latest or any semantic version string like `v1.15.0`. Use this action in workflow to define which version of kubectl will be used.
```yaml
- uses: azure/setup-kubectl@v2.0 ```yaml
with: - uses: azure/setup-kubectl@v3
version: '<version>' # default is latest stable with:
id: install version: '<version>' # default is latest stable
``` id: install
Refer to the action metadata file for details about all the inputs https://github.com/Azure/setup-kubectl/blob/main/action.yml ```
# Contributing Refer to the action metadata file for details about all the inputs https://github.com/Azure/setup-kubectl/blob/main/action.yml
This project welcomes contributions and suggestions. Most contributions require you to agree to a # Contributing
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. 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
When you submit a pull request, a CLA bot will automatically determine whether you need to provide the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
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. 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
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). provided by the bot. You will only need to do this once across all repos using our CLA.
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. 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-kubectl 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-kubectl/issues), and if your issue isn't already represented please [open a new one](https://github.com/Azure/setup-kubectl/issues/new/choose). The project maintainers will respond to the best of their abilities.

View file

@ -1,35 +1,35 @@
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.1 BLOCK --> <!-- BEGIN MICROSOFT SECURITY.MD V0.0.1 BLOCK -->
## Security ## 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/). 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. 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 ## Reporting Security Issues
**Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center at [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://technet.microsoft.com/en-us/security/dn606155). **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center at [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://technet.microsoft.com/en-us/security/dn606155).
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). 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: Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) - Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
* Full paths of source file(s) related to the manifestation of the issue - Full paths of source file(s) related to the manifestation of the issue
* The location of the affected source code (tag/branch/commit or direct URL) - The location of the affected source code (tag/branch/commit or direct URL)
* Any special configuration required to reproduce the issue - Any special configuration required to reproduce the issue
* Step-by-step instructions to reproduce the issue - Step-by-step instructions to reproduce the issue
* Proof-of-concept or exploit code (if possible) - Proof-of-concept or exploit code (if possible)
* Impact of the issue, including how an attacker might exploit the issue - Impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly. This information will help us triage your report more quickly.
## Preferred Languages ## Preferred Languages
We prefer all communications to be in English. We prefer all communications to be in English.
## Policy ## Policy
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd).
<!-- END MICROSOFT SECURITY.MD BLOCK --> <!-- END MICROSOFT SECURITY.MD BLOCK -->

View file

@ -1,15 +1,15 @@
name: "Kubectl tool installer" name: 'Kubectl tool installer'
description: "Install a specific version of kubectl binary. Acceptable values are latest or any semantic version string like 1.15.0" description: 'Install a specific version of kubectl binary. Acceptable values are latest or any semantic version string like 1.15.0'
inputs: inputs:
version: version:
description: "Version of kubectl" description: 'Version of kubectl'
required: true required: true
default: "latest" default: 'latest'
outputs: outputs:
kubectl-path: kubectl-path:
description: "Path to the cached kubectl binary" description: 'Path to the cached kubectl binary'
branding: branding:
color: "blue" color: 'blue'
runs: runs:
using: "node16" using: 'node16'
main: "lib/index.js" main: 'lib/index.js'

View file

@ -1,18 +1,18 @@
module.exports = { module.exports = {
clearMocks: true, clearMocks: true,
moduleFileExtensions: ['js', 'ts'], moduleFileExtensions: ['js', 'ts'],
testEnvironment: 'node', testEnvironment: 'node',
testMatch: ['**/*.test.ts'], testMatch: ['**/*.test.ts'],
transform: { transform: {
'^.+\\.ts$': 'ts-jest' '^.+\\.ts$': 'ts-jest'
}, },
verbose: true, verbose: true,
coverageThreshold: { coverageThreshold: {
"global": { global: {
"branches": 0, branches: 0,
"functions": 14, functions: 14,
"lines": 27, lines: 27,
"statements": 27 statements: 27
} }
} }
} }

7442
lib/index.js Normal file

File diff suppressed because it is too large Load diff

21774
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,31 +1,34 @@
{ {
"name": "setup-kubectl-action", "name": "setup-kubectl-action",
"version": "0.0.0", "version": "0.0.0",
"private": true, "private": true,
"main": "lib/index.js", "main": "lib/index.js",
"scripts": { "scripts": {
"build": "ncc build src/run.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 .",
"keywords": [ "format-check": "prettier --check ."
"actions", },
"node", "keywords": [
"setup" "actions",
], "node",
"author": "GitHub", "setup"
"license": "MIT", ],
"dependencies": { "author": "GitHub",
"@actions/core": "^1.2.6", "license": "MIT",
"@actions/exec": "^1.0.0", "dependencies": {
"@actions/tool-cache": "^1.0.0" "@actions/core": "^1.10.0",
}, "@actions/exec": "^1.0.0",
"devDependencies": { "@actions/tool-cache": "^1.0.0"
"@types/node": "^12.0.4", },
"@vercel/ncc": "^0.33.1", "devDependencies": {
"jest": "^26.0.1", "@types/jest": "^26.0.0",
"@types/jest": "^26.0.1", "@types/node": "^12.0.4",
"ts-jest": "^26.0.1", "@vercel/ncc": "^0.34.0",
"typescript": "3.9.2" "jest": "^26.0.1",
} "prettier": "2.7.1",
} "ts-jest": "^26.0.0",
"typescript": "3.9.2"
}
}

View file

@ -1,31 +1,31 @@
import * as os from 'os'; import * as os from 'os'
import * as util from 'util'; import * as util from 'util'
export function getKubectlArch(): string { export function getKubectlArch(): string {
const arch = os.arch(); const arch = os.arch()
if (arch === 'x64') { if (arch === 'x64') {
return 'amd64'; return 'amd64'
} }
return arch; return arch
} }
export function getkubectlDownloadURL(version: string, arch: string): string { export function getkubectlDownloadURL(version: string, arch: string): string {
switch (os.type()) { switch (os.type()) {
case 'Linux': case 'Linux':
return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/linux/%s/kubectl', version, arch); return `https://dl.k8s.io/release/${version}/bin/linux/${arch}/kubectl`
case 'Darwin': case 'Darwin':
return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/darwin/%s/kubectl', version, arch); return `https://dl.k8s.io/release/${version}/bin/darwin/${arch}/kubectl`
case 'Windows_NT': case 'Windows_NT':
default: default:
return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/windows/%s/kubectl.exe', version, arch); return `https://dl.k8s.io/release/${version}/bin/windows/${arch}/kubectl.exe`
} }
} }
export function getExecutableExtension(): string { export function getExecutableExtension(): string {
if (os.type().match(/^Win/)) { if (os.type().match(/^Win/)) {
return '.exe'; return '.exe'
} }
return ''; return ''
} }

View file

@ -1,183 +1,235 @@
import * as run from './run' import * as run from './run'
import { getkubectlDownloadURL, getKubectlArch, getExecutableExtension } from './helpers'; import {
import * as os from 'os'; getkubectlDownloadURL,
import * as toolCache from '@actions/tool-cache'; getKubectlArch,
import * as fs from 'fs'; getExecutableExtension
import * as path from 'path'; } from './helpers'
import * as core from '@actions/core'; import * as os from 'os'
import * as util from 'util'; import * as toolCache from '@actions/tool-cache'
import * as fs from 'fs'
import * as path from 'path'
import * as core from '@actions/core'
import * as util from 'util'
describe('Testing all functions in run file.', () => { describe('Testing all functions in run file.', () => {
test('getExecutableExtension() - return .exe when os is Windows', () => { test('getExecutableExtension() - return .exe when os is Windows', () => {
jest.spyOn(os, 'type').mockReturnValue('Windows_NT'); jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
expect(getExecutableExtension()).toBe('.exe'); expect(getExecutableExtension()).toBe('.exe')
expect(os.type).toBeCalled(); expect(os.type).toBeCalled()
}); })
test('getExecutableExtension() - return empty string for non-windows OS', () => { test('getExecutableExtension() - return empty string for non-windows OS', () => {
jest.spyOn(os, 'type').mockReturnValue('Darwin'); jest.spyOn(os, 'type').mockReturnValue('Darwin')
expect(getExecutableExtension()).toBe(''); expect(getExecutableExtension()).toBe('')
expect(os.type).toBeCalled(); expect(os.type).toBeCalled()
}); })
test.each([ test.each([
['arm', 'arm'], ['arm', 'arm'],
['arm64', 'arm64'], ['arm64', 'arm64'],
['x64', 'amd64'] ['x64', 'amd64']
])("getKubectlArch() - return on %s os arch %s kubectl arch", (osArch, kubectlArch) => { ])(
jest.spyOn(os, 'arch').mockReturnValue(osArch); 'getKubectlArch() - return on %s os arch %s kubectl arch',
(osArch, kubectlArch) => {
jest.spyOn(os, 'arch').mockReturnValue(osArch)
expect(getKubectlArch()).toBe(kubectlArch); expect(getKubectlArch()).toBe(kubectlArch)
expect(os.arch).toBeCalled(); expect(os.arch).toBeCalled()
}); }
)
test.each([ test.each([['arm'], ['arm64'], ['amd64']])(
['arm'], 'getkubectlDownloadURL() - return the URL to download %s kubectl for Linux',
['arm64'], (arch) => {
['amd64'] jest.spyOn(os, 'type').mockReturnValue('Linux')
])('getkubectlDownloadURL() - return the URL to download %s kubectl for Linux', (arch) => { const kubectlLinuxUrl = util.format(
jest.spyOn(os, 'type').mockReturnValue('Linux'); 'https://dl.k8s.io/release/v1.15.0/bin/linux/%s/kubectl',
const kubectlLinuxUrl = util.format('https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/%s/kubectl', arch); arch
)
expect(getkubectlDownloadURL('v1.15.0', arch)).toBe(kubectlLinuxUrl); expect(getkubectlDownloadURL('v1.15.0', arch)).toBe(kubectlLinuxUrl)
expect(os.type).toBeCalled(); expect(os.type).toBeCalled()
}); }
)
test.each([ test.each([['arm'], ['arm64'], ['amd64']])(
['arm'], 'getkubectlDownloadURL() - return the URL to download %s kubectl for Darwin',
['arm64'], (arch) => {
['amd64'] jest.spyOn(os, 'type').mockReturnValue('Darwin')
])('getkubectlDownloadURL() - return the URL to download %s kubectl for Darwin', (arch) => { const kubectlDarwinUrl = util.format(
jest.spyOn(os, 'type').mockReturnValue('Darwin'); 'https://dl.k8s.io/release/v1.15.0/bin/darwin/%s/kubectl',
const kubectlDarwinUrl = util.format('https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/darwin/%s/kubectl', arch); arch
)
expect(getkubectlDownloadURL('v1.15.0', arch)).toBe(kubectlDarwinUrl); expect(getkubectlDownloadURL('v1.15.0', arch)).toBe(kubectlDarwinUrl)
expect(os.type).toBeCalled(); expect(os.type).toBeCalled()
}); }
)
test.each([ test.each([['arm'], ['arm64'], ['amd64']])(
['arm'], 'getkubectlDownloadURL() - return the URL to download %s kubectl for Windows',
['arm64'], (arch) => {
['amd64'] jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
])('getkubectlDownloadURL() - return the URL to download %s kubectl for Windows', (arch) => {
jest.spyOn(os, 'type').mockReturnValue('Windows_NT');
const kubectlWindowsUrl = util.format('https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/windows/%s/kubectl.exe', arch); const kubectlWindowsUrl = util.format(
expect(getkubectlDownloadURL('v1.15.0', arch)).toBe(kubectlWindowsUrl); 'https://dl.k8s.io/release/v1.15.0/bin/windows/%s/kubectl.exe',
expect(os.type).toBeCalled(); arch
}); )
expect(getkubectlDownloadURL('v1.15.0', arch)).toBe(kubectlWindowsUrl)
expect(os.type).toBeCalled()
}
)
test('getStableKubectlVersion() - download stable version file, read version and return it', async () => { test('getStableKubectlVersion() - download stable version file, read version and return it', async () => {
jest.spyOn(toolCache, 'downloadTool').mockReturnValue(Promise.resolve('pathToTool')); jest
jest.spyOn(fs, 'readFileSync').mockReturnValue('v1.20.4'); .spyOn(toolCache, 'downloadTool')
.mockReturnValue(Promise.resolve('pathToTool'))
jest.spyOn(fs, 'readFileSync').mockReturnValue('v1.20.4')
expect(await run.getStableKubectlVersion()).toBe('v1.20.4'); expect(await run.getStableKubectlVersion()).toBe('v1.20.4')
expect(toolCache.downloadTool).toBeCalled(); expect(toolCache.downloadTool).toBeCalled()
expect(fs.readFileSync).toBeCalledWith('pathToTool', 'utf8'); expect(fs.readFileSync).toBeCalledWith('pathToTool', 'utf8')
}); })
test('getStableKubectlVersion() - return default v1.15.0 if version read is empty', async () => { test('getStableKubectlVersion() - return default v1.15.0 if version read is empty', async () => {
jest.spyOn(toolCache, 'downloadTool').mockReturnValue(Promise.resolve('pathToTool')); jest
jest.spyOn(fs, 'readFileSync').mockReturnValue(''); .spyOn(toolCache, 'downloadTool')
.mockReturnValue(Promise.resolve('pathToTool'))
jest.spyOn(fs, 'readFileSync').mockReturnValue('')
expect(await run.getStableKubectlVersion()).toBe('v1.15.0'); expect(await run.getStableKubectlVersion()).toBe('v1.15.0')
expect(toolCache.downloadTool).toBeCalled(); expect(toolCache.downloadTool).toBeCalled()
expect(fs.readFileSync).toBeCalledWith('pathToTool', 'utf8'); expect(fs.readFileSync).toBeCalledWith('pathToTool', 'utf8')
}); })
test('getStableKubectlVersion() - return default v1.15.0 if unable to download file', async () => { test('getStableKubectlVersion() - return default v1.15.0 if unable to download file', async () => {
jest.spyOn(toolCache, 'downloadTool').mockRejectedValue('Unable to download.'); jest
.spyOn(toolCache, 'downloadTool')
.mockRejectedValue('Unable to download.')
expect(await run.getStableKubectlVersion()).toBe('v1.15.0'); expect(await run.getStableKubectlVersion()).toBe('v1.15.0')
expect(toolCache.downloadTool).toBeCalled(); expect(toolCache.downloadTool).toBeCalled()
}); })
test('downloadKubectl() - download kubectl, add it to toolCache and return path to it', async () => { test('downloadKubectl() - download kubectl, add it to toolCache and return path to it', async () => {
jest.spyOn(toolCache, 'find').mockReturnValue(''); jest.spyOn(toolCache, 'find').mockReturnValue('')
jest.spyOn(toolCache, 'downloadTool').mockReturnValue(Promise.resolve('pathToTool')); jest
jest.spyOn(toolCache, 'cacheFile').mockReturnValue(Promise.resolve('pathToCachedTool')); .spyOn(toolCache, 'downloadTool')
jest.spyOn(os, 'type').mockReturnValue('Windows_NT'); .mockReturnValue(Promise.resolve('pathToTool'))
jest.spyOn(fs, 'chmodSync').mockImplementation(() => { }); jest
.spyOn(toolCache, 'cacheFile')
.mockReturnValue(Promise.resolve('pathToCachedTool'))
jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
expect(await run.downloadKubectl('v1.15.0')).toBe(path.join('pathToCachedTool', 'kubectl.exe')); expect(await run.downloadKubectl('v1.15.0')).toBe(
expect(toolCache.find).toBeCalledWith('kubectl', 'v1.15.0'); path.join('pathToCachedTool', 'kubectl.exe')
expect(toolCache.downloadTool).toBeCalled(); )
expect(toolCache.cacheFile).toBeCalled(); expect(toolCache.find).toBeCalledWith('kubectl', 'v1.15.0')
expect(os.type).toBeCalled(); expect(toolCache.downloadTool).toBeCalled()
expect(fs.chmodSync).toBeCalledWith(path.join('pathToCachedTool', 'kubectl.exe'), '775'); expect(toolCache.cacheFile).toBeCalled()
}); expect(os.type).toBeCalled()
expect(fs.chmodSync).toBeCalledWith(
path.join('pathToCachedTool', 'kubectl.exe'),
'775'
)
})
test('downloadKubectl() - throw DownloadKubectlFailed error when unable to download kubectl', async () => { test('downloadKubectl() - throw DownloadKubectlFailed error when unable to download kubectl', async () => {
jest.spyOn(toolCache, 'find').mockReturnValue(''); jest.spyOn(toolCache, 'find').mockReturnValue('')
jest.spyOn(toolCache, 'downloadTool').mockRejectedValue('Unable to download kubectl.'); jest
.spyOn(toolCache, 'downloadTool')
.mockRejectedValue('Unable to download kubectl.')
await expect(run.downloadKubectl('v1.15.0')).rejects.toThrow('DownloadKubectlFailed'); await expect(run.downloadKubectl('v1.15.0')).rejects.toThrow(
expect(toolCache.find).toBeCalledWith('kubectl', 'v1.15.0'); 'DownloadKubectlFailed'
expect(toolCache.downloadTool).toBeCalled(); )
}); expect(toolCache.find).toBeCalledWith('kubectl', 'v1.15.0')
expect(toolCache.downloadTool).toBeCalled()
})
test('downloadKubectl() - throw kubectl not found error when receive 404 response', async () => { test('downloadKubectl() - throw kubectl not found error when receive 404 response', async () => {
const kubectlVersion = 'v1.15.0' const kubectlVersion = 'v1.15.0'
const arch = 'arm128'; const arch = 'arm128'
jest.spyOn(os, 'arch').mockReturnValue(arch); jest.spyOn(os, 'arch').mockReturnValue(arch)
jest.spyOn(toolCache, 'find').mockReturnValue(''); jest.spyOn(toolCache, 'find').mockReturnValue('')
jest.spyOn(toolCache, 'downloadTool').mockImplementation(_ => { jest.spyOn(toolCache, 'downloadTool').mockImplementation((_) => {
throw new toolCache.HTTPError(404); throw new toolCache.HTTPError(404)
}); })
await expect(run.downloadKubectl(kubectlVersion)).rejects await expect(run.downloadKubectl(kubectlVersion)).rejects.toThrow(
.toThrow(util.format("Kubectl '%s' for '%s' arch not found.", kubectlVersion, arch)); util.format(
expect(os.arch).toBeCalled(); "Kubectl '%s' for '%s' arch not found.",
expect(toolCache.find).toBeCalledWith('kubectl', kubectlVersion); kubectlVersion,
expect(toolCache.downloadTool).toBeCalled(); arch
}); )
)
expect(os.arch).toBeCalled()
expect(toolCache.find).toBeCalledWith('kubectl', kubectlVersion)
expect(toolCache.downloadTool).toBeCalled()
})
test('downloadKubectl() - return path to existing cache of kubectl', async () => { test('downloadKubectl() - return path to existing cache of kubectl', async () => {
jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedTool'); jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedTool')
jest.spyOn(os, 'type').mockReturnValue('Windows_NT'); jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
jest.spyOn(fs, 'chmodSync').mockImplementation(() => { }); jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
jest.spyOn(toolCache, 'downloadTool'); jest.spyOn(toolCache, 'downloadTool')
expect(await run.downloadKubectl('v1.15.0')).toBe(path.join('pathToCachedTool', 'kubectl.exe')); expect(await run.downloadKubectl('v1.15.0')).toBe(
expect(toolCache.find).toBeCalledWith('kubectl', 'v1.15.0'); path.join('pathToCachedTool', 'kubectl.exe')
expect(os.type).toBeCalled(); )
expect(fs.chmodSync).toBeCalledWith(path.join('pathToCachedTool', 'kubectl.exe'), '775'); expect(toolCache.find).toBeCalledWith('kubectl', 'v1.15.0')
expect(toolCache.downloadTool).not.toBeCalled(); expect(os.type).toBeCalled()
}); expect(fs.chmodSync).toBeCalledWith(
path.join('pathToCachedTool', 'kubectl.exe'),
'775'
)
expect(toolCache.downloadTool).not.toBeCalled()
})
test('run() - download specified version and set output', async () => { test('run() - download specified version and set output', async () => {
jest.spyOn(core, 'getInput').mockReturnValue('v1.15.5'); jest.spyOn(core, 'getInput').mockReturnValue('v1.15.5')
jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedTool'); jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedTool')
jest.spyOn(os, 'type').mockReturnValue('Windows_NT'); jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
jest.spyOn(fs, 'chmodSync').mockImplementation(); jest.spyOn(fs, 'chmodSync').mockImplementation()
jest.spyOn(core, 'addPath').mockImplementation(); jest.spyOn(core, 'addPath').mockImplementation()
jest.spyOn(console, 'log').mockImplementation(); jest.spyOn(console, 'log').mockImplementation()
jest.spyOn(core, 'setOutput').mockImplementation(); jest.spyOn(core, 'setOutput').mockImplementation()
expect(await run.run()).toBeUndefined(); expect(await run.run()).toBeUndefined()
expect(core.getInput).toBeCalledWith('version', { 'required': true }); expect(core.getInput).toBeCalledWith('version', {required: true})
expect(core.addPath).toBeCalledWith('pathToCachedTool'); expect(core.addPath).toBeCalledWith('pathToCachedTool')
expect(core.setOutput).toBeCalledWith('kubectl-path', path.join('pathToCachedTool', 'kubectl.exe')); expect(core.setOutput).toBeCalledWith(
}); 'kubectl-path',
path.join('pathToCachedTool', 'kubectl.exe')
)
})
test('run() - get latest version, download it and set output', async () => { test('run() - get latest version, download it and set output', async () => {
jest.spyOn(core, 'getInput').mockReturnValue('latest'); jest.spyOn(core, 'getInput').mockReturnValue('latest')
jest.spyOn(toolCache, 'downloadTool').mockReturnValue(Promise.resolve('pathToTool')); jest
jest.spyOn(fs, 'readFileSync').mockReturnValue('v1.20.4'); .spyOn(toolCache, 'downloadTool')
jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedTool'); .mockReturnValue(Promise.resolve('pathToTool'))
jest.spyOn(os, 'type').mockReturnValue('Windows_NT'); jest.spyOn(fs, 'readFileSync').mockReturnValue('v1.20.4')
jest.spyOn(fs, 'chmodSync').mockImplementation(); jest.spyOn(toolCache, 'find').mockReturnValue('pathToCachedTool')
jest.spyOn(core, 'addPath').mockImplementation(); jest.spyOn(os, 'type').mockReturnValue('Windows_NT')
jest.spyOn(console, 'log').mockImplementation(); jest.spyOn(fs, 'chmodSync').mockImplementation()
jest.spyOn(core, 'setOutput').mockImplementation(); jest.spyOn(core, 'addPath').mockImplementation()
jest.spyOn(console, 'log').mockImplementation()
jest.spyOn(core, 'setOutput').mockImplementation()
expect(await run.run()).toBeUndefined(); expect(await run.run()).toBeUndefined()
expect(toolCache.downloadTool).toBeCalledWith('https://storage.googleapis.com/kubernetes-release/release/stable.txt'); expect(toolCache.downloadTool).toBeCalledWith(
expect(core.getInput).toBeCalledWith('version', { 'required': true }); 'https://storage.googleapis.com/kubernetes-release/release/stable.txt'
expect(core.addPath).toBeCalledWith('pathToCachedTool'); )
expect(core.setOutput).toBeCalledWith('kubectl-path', path.join('pathToCachedTool', 'kubectl.exe')); expect(core.getInput).toBeCalledWith('version', {required: true})
}); expect(core.addPath).toBeCalledWith('pathToCachedTool')
}); expect(core.setOutput).toBeCalledWith(
'kubectl-path',
path.join('pathToCachedTool', 'kubectl.exe')
)
})
})

View file

@ -1,64 +1,93 @@
import * as path from 'path'; import * as path from 'path'
import * as util from 'util'; import * as util from 'util'
import * as fs from 'fs'; import * as fs from 'fs'
import * as toolCache from '@actions/tool-cache'; import * as toolCache from '@actions/tool-cache'
import * as core from '@actions/core'; import * as core from '@actions/core'
import { getkubectlDownloadURL, getKubectlArch, getExecutableExtension } from './helpers'; import {
getkubectlDownloadURL,
const kubectlToolName = 'kubectl'; getKubectlArch,
const stableKubectlVersion = 'v1.15.0'; getExecutableExtension
const stableVersionUrl = 'https://storage.googleapis.com/kubernetes-release/release/stable.txt'; } from './helpers'
export async function run() { const kubectlToolName = 'kubectl'
let version = core.getInput('version', { 'required': true }); const stableKubectlVersion = 'v1.15.0'
if (version.toLocaleLowerCase() === 'latest') { const stableVersionUrl =
version = await getStableKubectlVersion(); 'https://storage.googleapis.com/kubernetes-release/release/stable.txt'
}
const cachedPath = await downloadKubectl(version); export async function run() {
let version = core.getInput('version', {required: true})
core.addPath(path.dirname(cachedPath)); if (version.toLocaleLowerCase() === 'latest') {
version = await getStableKubectlVersion()
core.debug(`Kubectl tool version: '${version}' has been cached at ${cachedPath}`); }
core.setOutput('kubectl-path', cachedPath); const cachedPath = await downloadKubectl(version)
}
core.addPath(path.dirname(cachedPath))
export async function getStableKubectlVersion(): Promise<string> {
return toolCache.downloadTool(stableVersionUrl).then((downloadPath) => { core.debug(
let version = fs.readFileSync(downloadPath, 'utf8').toString().trim(); `Kubectl tool version: '${version}' has been cached at ${cachedPath}`
if (!version) { )
version = stableKubectlVersion; core.setOutput('kubectl-path', cachedPath)
} }
return version;
}, (error) => { export async function getStableKubectlVersion(): Promise<string> {
core.debug(error); return toolCache.downloadTool(stableVersionUrl).then(
core.warning('GetStableVersionFailed'); (downloadPath) => {
return stableKubectlVersion; let version = fs.readFileSync(downloadPath, 'utf8').toString().trim()
}); if (!version) {
} version = stableKubectlVersion
}
export async function downloadKubectl(version: string): Promise<string> { return version
let cachedToolpath = toolCache.find(kubectlToolName, version); },
let kubectlDownloadPath = ''; (error) => {
const arch = getKubectlArch(); core.debug(error)
if (!cachedToolpath) { core.warning('GetStableVersionFailed')
try { return stableKubectlVersion
kubectlDownloadPath = await toolCache.downloadTool(getkubectlDownloadURL(version, arch)); }
} catch (exception) { )
if (exception instanceof toolCache.HTTPError && exception.httpStatusCode === 404) { }
throw new Error(util.format("Kubectl '%s' for '%s' arch not found.", version, arch));
} else { export async function downloadKubectl(version: string): Promise<string> {
throw new Error('DownloadKubectlFailed'); let cachedToolpath = toolCache.find(kubectlToolName, version)
} let kubectlDownloadPath = ''
} const arch = getKubectlArch()
if (!cachedToolpath) {
cachedToolpath = await toolCache.cacheFile(kubectlDownloadPath, kubectlToolName + getExecutableExtension(), kubectlToolName, version); try {
} kubectlDownloadPath = await toolCache.downloadTool(
getkubectlDownloadURL(version, arch)
const kubectlPath = path.join(cachedToolpath, kubectlToolName + getExecutableExtension()); )
fs.chmodSync(kubectlPath, '775'); } catch (exception) {
return kubectlPath; if (
} exception instanceof toolCache.HTTPError &&
exception.httpStatusCode === 404
run().catch(core.setFailed); ) {
throw new Error(
util.format(
"Kubectl '%s' for '%s' arch not found.",
version,
arch
)
)
} else {
throw new Error('DownloadKubectlFailed')
}
}
cachedToolpath = await toolCache.cacheFile(
kubectlDownloadPath,
kubectlToolName + getExecutableExtension(),
kubectlToolName,
version
)
}
const kubectlPath = path.join(
cachedToolpath,
kubectlToolName + getExecutableExtension()
)
fs.chmodSync(kubectlPath, '775')
return kubectlPath
}
run().catch(core.setFailed)

View file

@ -1,10 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES6", "target": "ES6",
"module": "commonjs" "module": "commonjs"
}, },
"exclude": [ "exclude": ["node_modules", "test"]
"node_modules", }
"test"
]
}