in index.js [163:245]
async function createCodeDeployDeployment(codedeploy, clusterName, service, taskDefArn, waitForService, waitForMinutes) {
core.debug('Updating AppSpec file with new task definition ARN');
let codeDeployAppSpecFile = core.getInput('codedeploy-appspec', { required : false });
codeDeployAppSpecFile = codeDeployAppSpecFile ? codeDeployAppSpecFile : 'appspec.yaml';
let codeDeployApp = core.getInput('codedeploy-application', { required: false });
codeDeployApp = codeDeployApp ? codeDeployApp : `AppECS-${clusterName}-${service}`;
let codeDeployGroup = core.getInput('codedeploy-deployment-group', { required: false });
codeDeployGroup = codeDeployGroup ? codeDeployGroup : `DgpECS-${clusterName}-${service}`;
let codeDeployDescription = core.getInput('codedeploy-deployment-description', { required: false });
let deploymentGroupDetails = await codedeploy.getDeploymentGroup({
applicationName: codeDeployApp,
deploymentGroupName: codeDeployGroup
}).promise();
deploymentGroupDetails = deploymentGroupDetails.deploymentGroupInfo;
// Insert the task def ARN into the appspec file
const appSpecPath = path.isAbsolute(codeDeployAppSpecFile) ?
codeDeployAppSpecFile :
path.join(process.env.GITHUB_WORKSPACE, codeDeployAppSpecFile);
const fileContents = fs.readFileSync(appSpecPath, 'utf8');
const appSpecContents = yaml.parse(fileContents);
for (var resource of findAppSpecValue(appSpecContents, 'resources')) {
for (var name in resource) {
const resourceContents = resource[name];
const properties = findAppSpecValue(resourceContents, 'properties');
const taskDefKey = findAppSpecKey(properties, 'taskDefinition');
properties[taskDefKey] = taskDefArn;
}
}
const appSpecString = JSON.stringify(appSpecContents);
const appSpecHash = crypto.createHash('sha256').update(appSpecString).digest('hex');
// Start the deployment with the updated appspec contents
core.debug('Starting CodeDeploy deployment');
let deploymentParams = {
applicationName: codeDeployApp,
deploymentGroupName: codeDeployGroup,
revision: {
revisionType: 'AppSpecContent',
appSpecContent: {
content: appSpecString,
sha256: appSpecHash
}
}
};
// If it hasn't been set then we don't even want to pass it to the api call to maintain previous behaviour.
if (codeDeployDescription) {
deploymentParams.description = codeDeployDescription
}
const createDeployResponse = await codedeploy.createDeployment(deploymentParams).promise();
core.setOutput('codedeploy-deployment-id', createDeployResponse.deploymentId);
core.info(`Deployment started. Watch this deployment's progress in the AWS CodeDeploy console: https://console.aws.amazon.com/codesuite/codedeploy/deployments/${createDeployResponse.deploymentId}?region=${aws.config.region}`);
// Wait for deployment to complete
if (waitForService && waitForService.toLowerCase() === 'true') {
// Determine wait time
const deployReadyWaitMin = deploymentGroupDetails.blueGreenDeploymentConfiguration.deploymentReadyOption.waitTimeInMinutes;
const terminationWaitMin = deploymentGroupDetails.blueGreenDeploymentConfiguration.terminateBlueInstancesOnDeploymentSuccess.terminationWaitTimeInMinutes;
let totalWaitMin = deployReadyWaitMin + terminationWaitMin + waitForMinutes;
if (totalWaitMin > MAX_WAIT_MINUTES) {
totalWaitMin = MAX_WAIT_MINUTES;
}
const maxAttempts = (totalWaitMin * 60) / WAIT_DEFAULT_DELAY_SEC;
core.debug(`Waiting for the deployment to complete. Will wait for ${totalWaitMin} minutes`);
await codedeploy.waitFor('deploymentSuccessful', {
deploymentId: createDeployResponse.deploymentId,
$waiter: {
delay: WAIT_DEFAULT_DELAY_SEC,
maxAttempts: maxAttempts
}
}).promise();
} else {
core.debug('Not waiting for the deployment to complete');
}
}