mirror of
https://github.com/Azure/k8s-deploy.git
synced 2026-04-11 00:40:08 +08:00
62 lines
3.2 KiB
TypeScript
62 lines
3.2 KiB
TypeScript
'use strict';
|
|
|
|
import { Kubectl } from '../../kubectl-object-model';
|
|
import * as core from '@actions/core';
|
|
import * as fs from 'fs';
|
|
import * as yaml from 'js-yaml';
|
|
|
|
import * as TaskInputParameters from '../../input-parameters';
|
|
import * as fileHelper from '../files-helper';
|
|
import * as helper from '../resource-object-utility';
|
|
import * as canaryDeploymentHelper from './canary-deployment-helper';
|
|
|
|
export function deployPodCanary(kubectl: Kubectl, filePaths: string[]) {
|
|
const newObjectsList = [];
|
|
const percentage = parseInt(TaskInputParameters.canaryPercentage);
|
|
|
|
filePaths.forEach((filePath: string) => {
|
|
const fileContents = fs.readFileSync(filePath);
|
|
yaml.safeLoadAll(fileContents, function (inputObject) {
|
|
|
|
const name = inputObject.metadata.name;
|
|
const kind = inputObject.kind;
|
|
if (helper.isDeploymentEntity(kind)) {
|
|
core.debug('Calculating replica count for canary');
|
|
const canaryReplicaCount = calculateReplicaCountForCanary(inputObject, percentage);
|
|
core.debug('Replica count is ' + canaryReplicaCount);
|
|
|
|
// Get stable object
|
|
core.debug('Querying stable object');
|
|
const stableObject = canaryDeploymentHelper.fetchResource(kubectl, kind, name);
|
|
if (!stableObject) {
|
|
core.debug('Stable object not found. Creating only canary object');
|
|
// If stable object not found, create canary deployment.
|
|
const newCanaryObject = canaryDeploymentHelper.getNewCanaryResource(inputObject, canaryReplicaCount);
|
|
core.debug('New canary object is: ' + JSON.stringify(newCanaryObject));
|
|
newObjectsList.push(newCanaryObject);
|
|
} else {
|
|
core.debug('Stable object found. Creating canary and baseline objects');
|
|
// If canary object not found, create canary and baseline object.
|
|
const newCanaryObject = canaryDeploymentHelper.getNewCanaryResource(inputObject, canaryReplicaCount);
|
|
const newBaselineObject = canaryDeploymentHelper.getNewBaselineResource(stableObject, canaryReplicaCount);
|
|
core.debug('New canary object is: ' + JSON.stringify(newCanaryObject));
|
|
core.debug('New baseline object is: ' + JSON.stringify(newBaselineObject));
|
|
newObjectsList.push(newCanaryObject);
|
|
newObjectsList.push(newBaselineObject);
|
|
}
|
|
} else {
|
|
// Updating non deployment entity as it is.
|
|
newObjectsList.push(inputObject);
|
|
}
|
|
});
|
|
});
|
|
|
|
const manifestFiles = fileHelper.writeObjectsToFile(newObjectsList);
|
|
const result = kubectl.apply(manifestFiles, TaskInputParameters.forceDeployment);
|
|
return { 'result': result, 'newFilePaths': manifestFiles };
|
|
}
|
|
|
|
function calculateReplicaCountForCanary(inputObject: any, percentage: number) {
|
|
const inputReplicaCount = helper.getReplicaCount(inputObject);
|
|
return Math.round((inputReplicaCount * percentage) / 100);
|
|
} |