mirror of
https://github.com/Azure/k8s-deploy.git
synced 2026-06-21 10:39:26 +08:00
e9693a7cdd
* 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
86 lines
3.1 KiB
TypeScript
86 lines
3.1 KiB
TypeScript
import {Kubectl} from '../../types/kubectl'
|
|
import * as core from '@actions/core'
|
|
import * as fs from 'fs'
|
|
import * as yaml from 'js-yaml'
|
|
|
|
import * as fileHelper from '../../utilities/fileUtils'
|
|
import * as canaryDeploymentHelper from './canaryHelper'
|
|
import {isDeploymentEntity} from '../../types/kubernetesTypes'
|
|
import {getReplicaCount} from '../../utilities/manifestUpdateUtils'
|
|
import {DeployResult} from '../../types/deployResult'
|
|
|
|
export async function deployPodCanary(
|
|
filePaths: string[],
|
|
kubectl: Kubectl,
|
|
onlyDeployStable: boolean = false
|
|
): Promise<DeployResult> {
|
|
const newObjectsList = []
|
|
const percentage = parseInt(core.getInput('percentage', {required: true}))
|
|
|
|
if (percentage < 0 || percentage > 100)
|
|
throw Error('Percentage must be between 0 and 100')
|
|
|
|
for (const filePath of filePaths) {
|
|
const fileContents = fs.readFileSync(filePath).toString()
|
|
const parsedYaml = yaml.safeLoadAll(fileContents)
|
|
for (const inputObject of parsedYaml) {
|
|
const name = inputObject.metadata.name
|
|
const kind = inputObject.kind
|
|
|
|
if (!onlyDeployStable && isDeploymentEntity(kind)) {
|
|
core.debug('Calculating replica count for canary')
|
|
const canaryReplicaCount = calculateReplicaCountForCanary(
|
|
inputObject,
|
|
percentage
|
|
)
|
|
core.debug('Replica count is ' + canaryReplicaCount)
|
|
|
|
const newCanaryObject = canaryDeploymentHelper.getNewCanaryResource(
|
|
inputObject,
|
|
canaryReplicaCount
|
|
)
|
|
newObjectsList.push(newCanaryObject)
|
|
|
|
// if there's already a stable object, deploy baseline as well
|
|
const stableObject = await canaryDeploymentHelper.fetchResource(
|
|
kubectl,
|
|
kind,
|
|
name
|
|
)
|
|
if (stableObject) {
|
|
core.debug(
|
|
`Stable object found for ${kind} ${name}. Creating baseline objects`
|
|
)
|
|
const newBaselineObject =
|
|
canaryDeploymentHelper.getNewBaselineResource(
|
|
stableObject,
|
|
canaryReplicaCount
|
|
)
|
|
core.debug(
|
|
'New baseline object: ' + JSON.stringify(newBaselineObject)
|
|
)
|
|
newObjectsList.push(newBaselineObject)
|
|
}
|
|
} else {
|
|
// deploy non deployment entity or regular deployments for promote as they are
|
|
newObjectsList.push(inputObject)
|
|
}
|
|
}
|
|
}
|
|
|
|
core.debug('New objects list: ' + JSON.stringify(newObjectsList))
|
|
const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList)
|
|
const forceDeployment = core.getInput('force').toLowerCase() === 'true'
|
|
|
|
const execResult = await kubectl.apply(manifestFiles, forceDeployment)
|
|
return {execResult, manifestFiles}
|
|
}
|
|
|
|
export function calculateReplicaCountForCanary(
|
|
inputObject: any,
|
|
percentage: number
|
|
) {
|
|
const inputReplicaCount = getReplicaCount(inputObject)
|
|
return Math.max(1, Math.round((inputReplicaCount * percentage) / 100))
|
|
}
|