in pipelines/src/api-service-codedeploy-pipeline.ts [16:115]
constructor(parent: cdk.App, name: string, props?: cdk.StackProps) {
super(parent, name, props);
const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
pipelineName: 'reinvent-trivia-game-trivia-backend-with-codedeploy',
});
new notifications.CfnNotificationRule(this, 'PipelineNotifications', {
name: pipeline.pipelineName,
detailType: 'FULL',
resource: pipeline.pipelineArn,
eventTypeIds: [ 'codepipeline-pipeline-pipeline-execution-failed' ],
targets: [
{
targetType: 'SNS',
targetAddress: cdk.Stack.of(this).formatArn({
service: 'sns',
resource: 'reinvent-trivia-notifications'
}),
}
]
});
// Source
const githubConnection = cdk.Fn.importValue('TriviaGamePipelinesCodeStarConnection');
const sourceOutput = new codepipeline.Artifact('SourceArtifact');
const sourceAction = new actions.CodeStarConnectionsSourceAction({
actionName: 'GitHubSource',
owner: 'aws-samples',
repo: 'aws-reinvent-2019-trivia-game',
connectionArn: githubConnection,
output: sourceOutput
});
const baseImageRepo = ecr.Repository.fromRepositoryName(this, 'BaseRepo', 'reinvent-trivia-backend-base');
const baseImageOutput = new codepipeline.Artifact('BaseImage');
const dockerImageSourceAction = new actions.EcrSourceAction({
actionName: 'BaseImage',
repository: baseImageRepo,
imageTag: 'release',
output: baseImageOutput,
});
pipeline.addStage({
stageName: 'Source',
actions: [sourceAction, dockerImageSourceAction],
});
// Build
const buildProject = new codebuild.PipelineProject(this, 'BuildProject', {
buildSpec: codebuild.BuildSpec.fromSourceFilename('trivia-backend/infra/codedeploy-blue-green/buildspec.yml'),
environment: {
buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_3,
privileged: true
}
});
buildProject.addToRolePolicy(new iam.PolicyStatement({
actions: [
'cloudformation:DescribeStackResources'
],
resources: ['*']
}));
buildProject.addToRolePolicy(new iam.PolicyStatement({
actions: ["ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
resources: ["*"]
}));
const buildArtifact = new codepipeline.Artifact('BuildArtifact');
const imageDetailsArtifact = new codepipeline.Artifact('ImageDetails');
const buildAction = new actions.CodeBuildAction({
actionName: 'CodeBuild',
project: buildProject,
input: sourceOutput,
extraInputs: [baseImageOutput],
outputs: [buildArtifact, imageDetailsArtifact],
});
pipeline.addStage({
stageName: 'Build',
actions: [buildAction],
});
// Deploy
this.addDeployStage(pipeline, 'Test', buildArtifact, imageDetailsArtifact);
this.addDeployStage(pipeline, 'Prod', buildArtifact, imageDetailsArtifact);
}