mirror of
https://github.com/Azure/k8s-deploy.git
synced 2026-06-23 13:09:27 +08:00
d89c89ba4e
* Add missing API switch for GHES (#200) * Vidya reddy/prettier code (#203) * switch none deployment strategy to basic (#204) * switch none deployment strategy to basic * update readme * update deployment strategy fallthrough logic * comment fixed * add disclaimer for basic strategy only supporting deploy action * Hari/beautify logs (#206) * Logging changes for deploy * Logging Changes with group * format check changes * Add ncc build to build script (#208) Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com> * Logging Changes for Promote, Reject actions (#207) * add clean function (#211) * Added Traffic split annotations (#215) * Added Traffic split annotations * traffic split - blueGreen deployment * traffic split - canary deployment * Traffic split annotations - canary deployment * updated Readme and action.yml * Traffic split - canary deployment * clean code * Clean code * Clean code * Create annotation object * Updated Readme and action.yml * Spelling correction Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com> * Swap annotation key to actions.github.com prefix (#216) * Private Cluster functionality (#214) * Fixed Blue/Green Strategy Ingress Route-Method Glitch (#217) * Added some tests, not sure what else to try but gonna think of more examples * forgot some files * reverted package-lock.json * Added empty dir test * Cleaned up some extra spaces * Add node modules and compiled JavaScript from main * forgot to actually include functionality * removed unnecessary files * Update .gitignore * Update .gitignore * Update .gitignore * thx david * renamed searchFilesRec * integrations test fix * added examples to README * added note about depth * added additional note * removed ticks * changed version string * removed conflict on readme * Added tests for bluegreen helper and resolved issue with ingress not being read correctly, still have to figure out why new services aren't showing up * resolved services name issue * looks functional, beginning refactor now * refactored deploy methods for type error * Removed refactor comments * prettier * implemented Oliver's feedback * prettier * added optional chaining operator * removed refactor comment Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MacBook-Pro.local> Co-authored-by: Oliver King <oking3@uncc.edu> Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MBP.lan> * Blue/Green Refactor (#229) * fresh new branch * Added coverage to gitignore Signed-off-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MBP.lan> * reverted package-lock.json Signed-off-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MBP.lan> Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MBP.lan> * consider slashes while cleaning labels (#231) fix prettier format check errors * Fix README.md typo (#235) * Bump @actions/core from 1.9.0 to 1.9.1 (#233) 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 permissions to README.md (#236) * Add permissions to README.md * remove space * prettier * remove extra changes * fix spacing * Add the bug report and feature request form (#237) * Added the bug report and feature request form * updated the url * Fix issue form (#238) * Fix description about baseline-and-canary-replicas (#241) * Resolved issue with Canary deploy (#247) * Added support message (#249) * Deploy with Manifests from URLs (#251) * added functionality, need to add/modify existing tests * added tests * updated readme * prettier * Fix private cluster kubectl exit code bug (#252) * add private cluster exitCode check * add proper output * Added Integration Tests, Resolved Bugs With Annotations (#255) * First commit - made manifests for test deployments, made manifests for i tests for other deployment strategies * broke down blue/green * added latest tags to test manifests for new tags * remade tester * ready to test bgi * using all but first index of argv * careless error with dicts * added test to namespace * realized i was silencing error * indexing containers * keyerror * logging bc python errors are weird * expected still string * parsed args behaving weirdly * test seems to be working now, applying changes to other YAMLs now * blue/green ready to test * oops * oops * Added additional labels to check * hyphen * Added our annotations * lol * added our labels to services too * nonetype issue' * nonetype issue' * narrowing down parameter * fixed annotations issue with promote * adding debhug statement to figure out why services aren't getting annotations * this should fix annotations issue for service * not sure why this wasn't caught by intellisense * should be fixed with removing comma but adding logs in case * added linkerd install * verification * upgraded kubernetes version * removing crds * proxy option * Added smi extension * logging service * smi svcs also getting labeled now * matching ts type * not sure where stable service is going * remaining svc and deployment should match * keeping stable service and ts object * updated tests to reflect keeping ts object * no green svc after promote * duh * lol * canary work * canary test ready * logging for ing, filename for canary * changed ingress svc key and returning svc files from smi canary deployment * ts name * forgot about baseline in first deploy * * * * * smi canary should annotate, fixed cleanup * typescript issue plus percentage * forgot to type extra method * removed cleaned up objects from annotate list * logging because services aren't getting removed * moving to try/catch strategy of annotation since deletion can fail silently/with warnings * moved label to individual * removing canary service check after promote * pod ready for testing * set weights to 1000 * selectors * * * percentage * * * typing * mixed up pod and smi * fixed tests * prettier * forgot to remove canary * cleanup * Added oliver's feedback + more cleanup * ncc as dev dependency * npx * going back to global ncc install bc npm is being weird * prettier * removed unnecessary post step * new commit with all changes (#258) * Fixing Ubuntu Runner Issue (#259) * changed ubuntu runner * changed minikube action * Version formatting * nonedriveR * update kube version * installing conntrack' * updated other actions * update bg ingress api version * prettify * updated ingress backend for new api version * Added path type * prettify * Add skip tls flag (#260) * Add node modules and compiled JavaScript from main Signed-off-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MBP.lan> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: nv35 <76777923+nv35@users.noreply.github.com> Co-authored-by: Vidya <59590642+Vidya2606@users.noreply.github.com> Co-authored-by: David Gamero <david340804@gmail.com> Co-authored-by: Hariharan Subramanian <105889062+hsubramanianaks@users.noreply.github.com> Co-authored-by: Vidya Reddy <vidyareddy@microsoft.com> Co-authored-by: Oliver King <oking3@uncc.edu> Co-authored-by: Marcus-Hines <marcus.chris.hines@gmail.com> Co-authored-by: Jaiveer Katariya <35347859+jaiveerk@users.noreply.github.com> Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MacBook-Pro.local> Co-authored-by: Jaiveer Katariya <jaiveerkatariya@Jaiveers-MBP.lan> Co-authored-by: Alexander Bartsch <alex@dashlabs.de> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Kenta Nakase <parroty@users.noreply.github.com> Co-authored-by: Asa Gayle <azmatch.gayle@gmail.com>
179 lines
5.2 KiB
TypeScript
179 lines
5.2 KiB
TypeScript
import {Kubectl} from './kubectl'
|
|
import * as minimist from 'minimist'
|
|
import {ExecOptions, ExecOutput, getExecOutput} from '@actions/exec'
|
|
import * as core from '@actions/core'
|
|
import * as os from 'os'
|
|
import * as fs from 'fs'
|
|
import * as path from 'path'
|
|
|
|
export class PrivateKubectl extends Kubectl {
|
|
protected async execute(args: string[], silent: boolean = false) {
|
|
args = args.concat(this.getExecuteFlags())
|
|
|
|
args.unshift('kubectl')
|
|
let kubectlCmd = args.join(' ')
|
|
let addFileFlag = false
|
|
let eo = <ExecOptions>{
|
|
silent: true,
|
|
failOnStdErr: false,
|
|
ignoreReturnCode: true
|
|
}
|
|
|
|
if (this.containsFilenames(kubectlCmd)) {
|
|
// For private clusters, files will referenced solely by their basename
|
|
kubectlCmd = this.replaceFilnamesWithBasenames(kubectlCmd)
|
|
addFileFlag = true
|
|
}
|
|
|
|
if (this.resourceGroup === '') {
|
|
throw Error('Resource group must be specified for private cluster')
|
|
}
|
|
if (this.name === '') {
|
|
throw Error('Cluster name must be specified for private cluster')
|
|
}
|
|
|
|
const privateClusterArgs = [
|
|
'aks',
|
|
'command',
|
|
'invoke',
|
|
'--resource-group',
|
|
this.resourceGroup,
|
|
'--name',
|
|
this.name,
|
|
'--command',
|
|
`${kubectlCmd}`
|
|
]
|
|
|
|
if (addFileFlag) {
|
|
const filenames = this.extractFilesnames(kubectlCmd).split(' ')
|
|
|
|
const tempDirectory =
|
|
process.env['runner.tempDirectory'] || os.tmpdir() + '/manifests'
|
|
eo.cwd = tempDirectory
|
|
privateClusterArgs.push(...['--file', '.'])
|
|
|
|
let filenamesArr = filenames[0].split(',')
|
|
for (let index = 0; index < filenamesArr.length; index++) {
|
|
const file = filenamesArr[index]
|
|
|
|
if (!file) {
|
|
continue
|
|
}
|
|
this.moveFileToTempManifestDir(file)
|
|
}
|
|
}
|
|
|
|
core.debug(
|
|
`private cluster Kubectl run with invoke command: ${kubectlCmd}`
|
|
)
|
|
|
|
const allArgs = [...privateClusterArgs, '-o', 'json']
|
|
core.debug(`full form of az command: az ${allArgs.join(' ')}`)
|
|
const runOutput = await getExecOutput('az', allArgs, eo)
|
|
core.debug(
|
|
`from kubectl private cluster command got run output ${JSON.stringify(
|
|
runOutput
|
|
)}`
|
|
)
|
|
const runObj: {logs: string; exitCode: number} = JSON.parse(
|
|
runOutput.stdout
|
|
)
|
|
if (!silent) core.info(runObj.logs)
|
|
if (runOutput.exitCode !== 0 && runObj.exitCode !== 0) {
|
|
throw Error(`failed private cluster Kubectl command: ${kubectlCmd}`)
|
|
}
|
|
|
|
return {
|
|
exitCode: runObj.exitCode,
|
|
stdout: runObj.logs,
|
|
stderr: ''
|
|
} as ExecOutput
|
|
}
|
|
|
|
private replaceFilnamesWithBasenames(kubectlCmd: string) {
|
|
let exFilenames = this.extractFilesnames(kubectlCmd)
|
|
let filenames = exFilenames.split(' ')
|
|
let filenamesArr = filenames[0].split(',')
|
|
|
|
for (let index = 0; index < filenamesArr.length; index++) {
|
|
filenamesArr[index] = path.basename(filenamesArr[index])
|
|
}
|
|
|
|
let baseFilenames = filenamesArr.join()
|
|
|
|
let result = kubectlCmd.replace(exFilenames, baseFilenames)
|
|
return result
|
|
}
|
|
|
|
public extractFilesnames(strToParse: string) {
|
|
const fileNames: string[] = []
|
|
const argv = minimist(strToParse.split(' '))
|
|
const fArg = 'f'
|
|
const filenameArg = 'filename'
|
|
|
|
fileNames.push(...this.extractFilesFromMinimist(argv, fArg))
|
|
fileNames.push(...this.extractFilesFromMinimist(argv, filenameArg))
|
|
|
|
return fileNames.join(' ')
|
|
}
|
|
|
|
private extractFilesFromMinimist(argv, arg: string): string[] {
|
|
if (!argv[arg]) {
|
|
return []
|
|
}
|
|
const toReturn: string[] = []
|
|
if (typeof argv[arg] === 'string') {
|
|
toReturn.push(...argv[arg].split(','))
|
|
} else {
|
|
for (const value of argv[arg] as string[]) {
|
|
toReturn.push(...value.split(','))
|
|
}
|
|
}
|
|
|
|
return toReturn
|
|
}
|
|
|
|
private containsFilenames(str: string) {
|
|
return str.includes('-f ') || str.includes('filename ')
|
|
}
|
|
|
|
private createTempManifestsDirectory() {
|
|
const manifestsDir = '/tmp/manifests'
|
|
if (!fs.existsSync('/tmp/manifests')) {
|
|
fs.mkdirSync('/tmp/manifests', {recursive: true})
|
|
}
|
|
}
|
|
|
|
private moveFileToTempManifestDir(file: string) {
|
|
this.createTempManifestsDirectory()
|
|
if (!fs.existsSync('/tmp/' + file)) {
|
|
core.debug(
|
|
'/tmp/' +
|
|
file +
|
|
' does not exist, and therefore cannot be moved to the manifest directory'
|
|
)
|
|
}
|
|
|
|
fs.copyFile('/tmp/' + file, '/tmp/manifests/' + file, function (err) {
|
|
if (err) {
|
|
core.debug(
|
|
'Could not rename ' +
|
|
'/tmp/' +
|
|
file +
|
|
' to ' +
|
|
'/tmp/manifests/' +
|
|
file +
|
|
' ERROR: ' +
|
|
err
|
|
)
|
|
return
|
|
}
|
|
core.debug(
|
|
"Successfully moved file '" +
|
|
file +
|
|
"' from /tmp to /tmp/manifest directory"
|
|
)
|
|
})
|
|
}
|
|
}
|