in packages/@aws-cdk/toolkit-lib/lib/api/deployments/deploy-stack.ts [400:465]
private async changeSetDeployment(deploymentMethod: ChangeSetDeploymentMethod): Promise<DeployStackResult> {
const changeSetName = deploymentMethod.changeSetName ?? 'cdk-deploy-change-set';
const execute = deploymentMethod.execute ?? true;
const importExistingResources = deploymentMethod.importExistingResources ?? false;
const changeSetDescription = await this.createChangeSet(changeSetName, execute, importExistingResources);
await this.updateTerminationProtection();
if (changeSetHasNoChanges(changeSetDescription)) {
await this.ioHelper.notify(IO.DEFAULT_TOOLKIT_DEBUG.msg(format('No changes are to be performed on %s.', this.stackName)));
if (execute) {
await this.ioHelper.notify(IO.DEFAULT_TOOLKIT_DEBUG.msg(format('Deleting empty change set %s', changeSetDescription.ChangeSetId)));
await this.cfn.deleteChangeSet({
StackName: this.stackName,
ChangeSetName: changeSetName,
});
}
if (this.options.forceDeployment) {
await this.ioHelper.notify(IO.DEFAULT_TOOLKIT_WARN.msg(
[
'You used the --force flag, but CloudFormation reported that the deployment would not make any changes.',
'According to CloudFormation, all resources are already up-to-date with the state in your CDK app.',
'',
'You cannot use the --force flag to get rid of changes you made in the console. Try using',
'CloudFormation drift detection instead: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html',
].join('\n'),
));
}
return {
type: 'did-deploy-stack',
noOp: true,
outputs: this.cloudFormationStack.outputs,
stackArn: changeSetDescription.StackId!,
};
}
if (!execute) {
await this.ioHelper.notify(IO.DEFAULT_TOOLKIT_INFO.msg(format(
'Changeset %s created and waiting in review for manual execution (--no-execute)',
changeSetDescription.ChangeSetId,
)));
return {
type: 'did-deploy-stack',
noOp: false,
outputs: this.cloudFormationStack.outputs,
stackArn: changeSetDescription.StackId!,
};
}
// If there are replacements in the changeset, check the rollback flag and stack status
const replacement = hasReplacement(changeSetDescription);
const isPausedFailState = this.cloudFormationStack.stackStatus.isRollbackable;
const rollback = this.options.rollback ?? true;
if (isPausedFailState && replacement) {
return { type: 'failpaused-need-rollback-first', reason: 'replacement', status: this.cloudFormationStack.stackStatus.name };
}
if (isPausedFailState && rollback) {
return { type: 'failpaused-need-rollback-first', reason: 'not-norollback', status: this.cloudFormationStack.stackStatus.name };
}
if (!rollback && replacement) {
return { type: 'replacement-requires-rollback' };
}
return this.executeChangeSet(changeSetDescription);
}