Files
k8s-deploy/src/utilities/kubectlUtils.ts
T
David Gamero 01cfe404ef Migrate to esbuild/Vitest and upgrade @actions/* to ESM-only versions (#492)
* Migrate build toolchain from ncc/Jest to esbuild/Vitest

Replace the legacy ncc/Jest/Babel build stack with a modern ESM toolchain:

Build:
- Replace @vercel/ncc with esbuild (--platform=node --target=node20 --format=esm)
- Add createRequire banner for CJS interop in ESM bundle
- Add "type": "module" to package.json
- Add tsc --noEmit typecheck script (esbuild strips types without checking)
- Add typecheck to husky pre-commit hook

Dependencies:
- Bump @actions/core@3, exec@3, io@3, tool-cache@4 (ESM-only)
- Replace jest/ts-jest/@babel/* with vitest@4

Tests:
- Convert 29 test files: jest.fn()→vi.fn(), jest.mock()→vi.mock(), jest.spyOn()→vi.spyOn()
- Fix vitest 4 compat: mockImplementation requires args, mock call tracking, await .rejects

CI:
- Update build step from ncc build → npm run build
- Update composite action to use npm run build

* Switch tsconfig to NodeNext module resolution

Change module/moduleResolution from ES2022/bundler to NodeNext/NodeNext
and target from ES2022 to ES2020.

- Add .js extensions to all relative imports across 59 source/test files
  (required by NodeNext module resolution)
- Add vitest/globals to tsconfig types array for global test API declarations
2026-02-24 11:57:56 -08:00

103 lines
2.7 KiB
TypeScript

import * as core from '@actions/core'
import {ExecOutput} from '@actions/exec'
import {Kubectl} from '../types/kubectl.js'
const NAMESPACE = 'namespace'
export function checkForErrors(
execResults: ExecOutput[],
warnIfError?: boolean
) {
let stderr = ''
execResults.forEach((result) => {
if (result?.exitCode !== 0) {
stderr += result?.stderr + ' \n'
} else if (result?.stderr) {
core.warning(result.stderr)
}
})
if (stderr.length > 0) {
if (warnIfError) {
core.warning(stderr.trim())
} else {
throw new Error(stderr.trim())
}
}
}
export async function getLastSuccessfulRunSha(
kubectl: Kubectl,
namespaceName: string,
annotationKey: string
): Promise<string> {
try {
const result = await kubectl.getResource(
NAMESPACE,
namespaceName,
false,
namespaceName
)
if (result?.stderr) {
core.warning(result.stderr)
return process.env.GITHUB_SHA
} else if (result?.stdout) {
const annotationsSet = JSON.parse(result.stdout).metadata.annotations
if (annotationsSet && annotationsSet[annotationKey]) {
return JSON.parse(annotationsSet[annotationKey].replace(/'/g, '"'))
.commit
} else {
return 'NA'
}
}
} catch (ex) {
core.warning(`Failed to get commits from cluster. ${JSON.stringify(ex)}`)
return ''
}
}
export async function annotateChildPods(
kubectl: Kubectl,
resourceType: string,
resourceName: string,
namespace: string | undefined,
annotationKeyValStr: string
): Promise<ExecOutput[]> {
let owner = resourceName
if (resourceType.toLowerCase().indexOf('deployment') > -1) {
owner = await kubectl.getNewReplicaSet(resourceName, namespace)
}
const commandExecutionResults = []
let allPods
try {
allPods = JSON.parse((await kubectl.getAllPods()).stdout)
} catch (e) {
core.debug(`Unable to parse pods: ${e}`)
}
if (allPods?.items && allPods.items?.length > 0) {
allPods.items.forEach((pod) => {
const owners = pod?.metadata?.ownerReferences
if (owners) {
for (const ownerRef of owners) {
if (ownerRef.name === owner) {
commandExecutionResults.push(
kubectl.annotate(
'pod',
pod.metadata.name,
annotationKeyValStr,
namespace
)
)
break
}
}
}
})
}
return await Promise.all(commandExecutionResults)
}