28 Commits

Author SHA1 Message Date
dependabot[bot]
302477698c chore(deps): bump undici from 5.28.3 to 5.28.5
Bumps [undici](https://github.com/nodejs/undici) from 5.28.3 to 5.28.5.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.28.3...v5.28.5)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-21 23:33:35 +00:00
Aarnav Tale
91f29e07f4 fix: aws example was incorrect 2024-06-05 22:46:34 -04:00
Aarnav Tale
efb34d6cb2 fix: use npm in ci 2024-03-19 20:51:30 -04:00
Aarnav Tale
767276df48 chore: v1.4.0 2024-03-19 20:49:56 -04:00
Aarnav Tale
2b874f780f chore: switch to npm 2024-03-19 20:47:55 -04:00
Aarnav Tale
716cfe229d feat: clobber the actual tag releases 2024-03-19 20:44:49 -04:00
Aarnav Tale
e93dd2d865 chore: turns out i cant indent 2024-02-06 01:38:40 -05:00
Aarnav Tale
9c4bb5002a chore: fix readme typo 2024-02-02 14:31:45 -05:00
Aarnav Tale
560e7ff9e2 chore: v1.3.0 2024-02-02 14:25:00 -05:00
Aarnav Tale
9685b6d613 chore: add aws example to readme 2024-02-02 14:16:41 -05:00
Aarnav Tale
c83ced7ece feat: update to node 20 and remove undici 2024-02-02 14:03:31 -05:00
Aarnav Tale
6e8a90cd56 fix: explicitly exit on windows runners 2024-02-02 14:03:09 -05:00
Aarnav Tale
5aa0d1bacd chore: v1.2.0 2023-06-28 22:16:04 -04:00
Aarnav Tale
93d421ead9 feat: use github actions env for windows check for extra resiliency 2023-06-28 22:15:24 -04:00
Aarnav Tale
e49d06518c feat: support arch and darwin/linux properly 2023-06-28 22:14:43 -04:00
Aarnav Tale
69c8dc994c chore: add better failure message for version resolving failures on kubectl 2023-06-28 22:09:13 -04:00
Aarnav Tale
e70828b58c fix: typo in teardown error message 2023-06-28 22:07:52 -04:00
Aarnav Tale
d7c0fa7a71 chore: update packages 2023-06-28 22:06:56 -04:00
Aarnav Tale
9d3c93f137 chore: v1.1.3 2023-02-15 14:56:50 -05:00
Aarnav Tale
ce29488755 feat: use actions tool-cache 2023-02-15 14:50:20 -05:00
Aarnav Tale
f08750dda0 fix: set permission to 775 not 755 2023-02-15 14:15:14 -05:00
Aarnav Tale
a3a1ddb586 revert: "fix: chmod with 775 after install (closes #4)"
This reverts commit b413e7e15e.
2023-02-15 13:45:10 -05:00
Aarnav Tale
b413e7e15e fix: chmod with 775 after install (closes #4) 2023-02-15 13:43:16 -05:00
Aarnav Tale
43525325f3 feat: block running on win32 2023-02-15 13:33:52 -05:00
Aarnav Tale
8c4badf72a chore: v1.1.2 2023-01-25 11:18:36 -05:00
Aarnav Tale
ff8bf47b42 feat: actually execute post action 2023-01-25 11:17:31 -05:00
Aarnav Tale
4933a15eb6 chore: v1.1.1 2023-01-25 11:10:14 -05:00
Aarnav Tale
c2bec5ff29 fix: deploy branch instead of v1 branch 2023-01-25 11:10:00 -05:00
10 changed files with 8671 additions and 3729 deletions

View File

@@ -15,15 +15,15 @@ jobs:
uses: actions/checkout@v3
- name: Build latest dist/ folder
run: |
npm install -g pnpm
pnpm install --frozen-lockfile
pnpm run build
npm ci
npm run build
- name: Upload dist/ folder
run: |
git config --global user.email "<41898282+github-actions[bot]@users.noreply.github.com>"
git config --global user.name "github-actions[bot]"
git checkout --orphan v1
git checkout --orphan deploy
git add -f dist README.md LICENSE action.yaml
git commit -m "chore: create ci release ($GITHUB_SHA)"
git tag --force v1
git push -f --tags origin v1
git tag --force $GITHUB_REF_NAME
git push -f --tags origin deploy

View File

@@ -13,9 +13,8 @@ jobs:
uses: actions/checkout@v3
- name: Build latest dist/ folder
run: |
npm install -g pnpm
pnpm install --frozen-lockfile
pnpm run build
npm ci
npm run build
- name: Upload dist/ folder
run: |
git config --global user.email "<41898282+github-actions[bot]@users.noreply.github.com>"

View File

@@ -12,7 +12,7 @@ To use this action, add the following step to your GitHub Action workflow:
base64-kube-config: ${{ secrets.KUBE_CONFIG }}
```
Keep in mind that the action expects a base64 encoded string of your Kubernetes configuration. The simplest way to do that is to run `cat $HOME/.kube/config | base64` and save that output as an action secret.
Keep in mind that the action expects a base64 encoded string of your Kubernetes configuration. The simplest way to do that is to run `cat $HOME/.kube/config | base64` and save that output as an action secret. It's additionally possible to generate a config file using the `aws` CLI for EKS or any other tools with other cloud providers.
It's also possible to specify the version of the [kubectl](https://kubernetes.io/docs/reference/kubectl/) CLI to use. The current default release used by this action is the latest version.
@@ -40,3 +40,33 @@ jobs:
base64-kube-config: ${{ secrets.KUBE_CONFIG }}
- run: kubectl get pods
```
Here's an example using AWS EKS:
```yaml
name: Kubectl Action
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789100:role/my-github-actions-role
aws-region: us-east-2
- name: Generate kubeconfig
run: |
{
echo 'EKS_CREDS<<EOF'
aws eks update-kubeconfig --region us-east-2 --name my-cluster --dry-run | base64
echo EOF
} >> $GITHUB_ENV
- uses: tale/kubectl-action@v1
with:
base64-kube-config: ${{ env.EKS_CREDS }}
- run: kubectl get pods
```

View File

@@ -13,6 +13,6 @@ inputs:
description: A base64 encoded reference to your authorization file (~/.kube/config)
required: true
runs:
using: node16
using: node20
main: dist/index.js
post: dist/index.js

8565
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +1,21 @@
{
"name": "kubectl-action",
"version": "1.1.0",
"version": "1.4.0",
"scripts": {
"dev": "ncc -smw --license licenses.txt build src/main.ts",
"build": "ncc -sm --license licenses.txt build src/main.ts",
"push": "np --no-cleanup --no-publish --no-tests --message 'chore: v%s'"
},
"dependencies": {
"@actions/core": "^1.10.0",
"undici": "^5.16.0"
"@actions/core": "^1.10.1",
"@actions/tool-cache": "^2.0.1"
},
"devDependencies": {
"@types/node": "^18.11.18",
"@vercel/ncc": "^0.36.0",
"eslint": "^8.32.0",
"eslint-config-tale": "^1.0.15",
"np": "^7.6.3",
"typescript": "^4.9.4"
"@types/node": "^20.11.30",
"@vercel/ncc": "^0.38.1",
"eslint": "^8.57.0",
"eslint-config-tale": "^1.0.16",
"np": "^9.2.0",
"typescript": "^5.4.2"
}
}

3630
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,24 @@
import { env, exit, platform } from 'node:process'
import { debug, getState, setFailed } from '@actions/core'
import { setupKubeconfig } from 'login'
import { installKubectl } from 'setup'
import { teardown } from 'teardown'
const post = Boolean(getState('isPost'))
if (env.RUNNER_OS === 'Windows' || platform === 'win32') {
setFailed('kubectl-action does not support Windows')
exit(1)
}
if (!post) {
if (getState('kubectl-path')) {
debug('Running post kubectl-action setup')
teardown()
// eslint-disable-next-line unicorn/prefer-top-level-await
.catch(error => {
setFailed('Failed to teardown kubectl (this is a bug in kubectl-action): ')
debug(JSON.stringify(error))
})
} else {
debug('Running kubectl-action setup')
// eslint-disable-next-line no-async-promise-executor
new Promise(async () => {

View File

@@ -1,11 +1,9 @@
import { createHash, randomUUID } from 'node:crypto'
import { mkdir, writeFile } from 'node:fs/promises'
import { join } from 'node:path'
import { env, stdout } from 'node:process'
import { clearLine, cursorTo } from 'node:readline'
import { chmod } from 'node:fs/promises'
import { dirname, join } from 'node:path'
import { env } from 'node:process'
import { addPath, debug, getInput, saveState, setFailed, warning } from '@actions/core'
import { fetch } from 'undici'
import { addPath, debug, getInput, setFailed } from '@actions/core'
import { cacheFile, downloadTool, find } from '@actions/tool-cache'
export async function installKubectl() {
debug('Running kubectl-action installKubectl()')
@@ -29,19 +27,16 @@ export async function installKubectl() {
}
console.log(`Installing kubectl version ${version}`)
const kubectl = await downloadKubectl(version)
if (!kubectl) {
return
try {
const path = await fetchKubectl(version)
await chmod(path, '775')
addPath(dirname(path))
debug(`kubectl ${version} installed and cached at ${path}`)
} catch {
debug('Failed to download kubectl from dl.k8s.io')
setFailed('Failed to download kubectl from dl.k8s.io\nPlease check the version you specified is valid')
}
const path = join(env.RUNNER_TEMP, randomUUID())
await mkdir(path, { recursive: true })
saveState('kubectl-path', path)
console.log(`Installing kubectl to ${path}`)
await writeFile(join(path, 'kubectl'), kubectl)
addPath(path)
}
// Fetches the latest kubectl version from the Kubernetes release server
@@ -57,62 +52,34 @@ async function fetchLatestVersion() {
}
// Downloads the kubectl binary from the Kubernetes release server
// Also runs a checksum verification on the downloaded binary
async function downloadKubectl(version: string) {
const url = `https://dl.k8s.io/release/${version}/bin/linux/amd64/kubectl`
const hashUrl = `${url}.sha256`
// If already downloaded, returns the path to the cached binary
async function fetchKubectl(version: string) {
const cachedPath = find('kubectl', version)
// Cached path is a directory containing the kubectl binary
if (cachedPath) {
debug(`kubectl ${version} already installed`)
return join(cachedPath, 'kubectl')
}
const url = `https://dl.k8s.io/release/${version}/bin/${retrieveRunnerMetadata()}/kubectl`
console.log(`Downloading kubectl (${url})`)
debug(`Downloading kubectl checksum (${hashUrl})`)
const hashResponse = await fetch(hashUrl)
if (!hashResponse.ok) {
debug(`Failed to download kubectl checksum with status ${hashResponse.status}`)
warning(`Skipping checksum verification for kubectl ${version}`)
}
const hash = hashResponse.ok ? await hashResponse.text() : ''
const response = await fetch(url)
if (!response.ok || !response.body) {
debug(`Failed to download kubectl with status ${response.status}`)
setFailed(`Failed to download kubectl with status ${response.status}`)
return
}
const hashStream = createHash('sha256')
const { body, headers } = response
const size = Number(headers.get('content-length'))
debug(`Downloaded kubectl (${size} bytes)`)
let downloaded = 0
let progressed = 0
const buffer = Buffer.alloc(size)
for await (const chunk of body as AsyncIterable<Buffer>) {
buffer.write(chunk.toString('binary'), downloaded, 'binary')
hashStream.update(chunk)
downloaded += chunk.length
if (Math.floor((downloaded / size) * 80) > progressed) {
clearLine(stdout, 0)
cursorTo(stdout, 0)
progressed++
stdout.write(`[${'='.repeat(progressed)}>${' '.repeat(80 - progressed)}]`)
}
}
clearLine(stdout, 0)
cursorTo(stdout, 0)
console.log(`[${'='.repeat(80)}]`)
const hashSum = hashStream.digest('hex')
if (hashResponse.ok && hashSum !== hash) {
debug(`Checksum verification failed for kubectl ${version}`)
setFailed(`Checksum verification failed for kubectl ${version}`)
return
}
return buffer
const downloadPath = await downloadTool(url)
const toolPath = await cacheFile(downloadPath, 'kubectl', 'kubectl', version)
return join(toolPath, 'kubectl')
}
// Gets the proper architecture and OS for the current platform
// This doesn't use node functions, but instead CI variables provided by GitHub
function retrieveRunnerMetadata() {
// Currently we don't support win32 platforms anyways
const runnerSystem = env.RUNNER_OS === 'Linux' ? 'linux' : 'darwin'
const runnerArch = env.RUNNER_ARCH?.toLowerCase()
if (runnerArch?.includes('arm')) {
return `${runnerSystem}/arm64`
}
return `${runnerSystem}/amd64`
}

View File

@@ -4,10 +4,7 @@ import { debug, getState } from '@actions/core'
export async function teardown() {
debug('Running kubectl-action teardown()')
console.log('Removing kubectl and kubeconfig')
const path = getState('kubectl-path')
await rm(path, { recursive: true, force: true })
console.log('Removing kubeconfig')
const configPath = getState('kubeconfig-path')
await rm(configPath, { recursive: true, force: true })