如何在@aws-cdk/pipelines中关联ApplicationBuild阶段与流水线部署
实现方案
可以按照以下步骤完成ApplicationBuild阶段与Fargate部署环节的关联,同时实现第二个应用仓库推送触发流水线的需求:
1. 配置流水线多源触发
先将应用源码仓库作为第二个源接入流水线,配置推送自动触发规则:
import * as cdk from 'aws-cdk-lib'; import * as codepipeline from 'aws-cdk-lib/aws-codepipeline'; import * as cdkpipelines from 'aws-cdk-lib/pipelines'; // 原有CDK基础设施仓库源 const cdkRepoSource = cdkpipelines.CodePipelineSource.gitHub('你的组织/CDK仓库名', 'master'); // 新增应用源码仓库源 const appRepoSource = cdkpipelines.CodePipelineSource.gitHub('你的组织/应用仓库名', 'master', { trigger: cdkpipelines.GitHubTrigger.WEBHOOK, }); // 初始化流水线 const pipeline = new cdkpipelines.CodePipeline(this, '自变更流水线', { synth: new cdkpipelines.ShellStep('Synth', { input: cdkRepoSource, commands: ['npm ci', 'npm run build', 'npx cdk synth'], }), });
2. 调整ApplicationBuild阶段输出镜像信息
在ApplicationBuild阶段的buildspec末尾,将构建完成的镜像URI写入JSON文件作为输出制品,供后续部署阶段读取:
// 定义构建阶段输出制品,存储镜像信息 const buildOutputArtifact = new codepipeline.Artifact(); const appBuildStep = new cdkpipelines.CodeBuildStep('ApplicationBuild', { input: appRepoSource, buildEnvironment: { privileged: true, // 构建Docker镜像必须开启特权模式 }, commands: [ // 你原有buildspec中的构建、打标、推送ECR逻辑 'echo "构建完成的镜像URI为: xxx.dkr.ecr.xxx.amazonaws.com/xxx:${CODEBUILD_RESOLVED_SOURCE_VERSION}"', // 将镜像信息写入输出文件 'echo {\\"imageUri\\":\\"xxx.dkr.ecr.xxx.amazonaws.com/xxx:${CODEBUILD_RESOLVED_SOURCE_VERSION}\\"} > imageDetails.json', ], primaryOutputDirectory: '.', outputs: [buildOutputArtifact], }); // 把构建阶段加入流水线 pipeline.addStage(appBuildStep);
3. 关联构建输出与Fargate部署阶段
自定义部署Stage接收镜像URI参数,从构建输出的JSON文件中读取镜像地址注入到Fargate服务的任务定义中:
// 自定义Fargate服务部署Stage class FargateDeployStage extends cdk.Stage { constructor(scope: cdk.IConstruct, id: string, props: { imageUri: string }) { super(scope, id, props); // 你的Fargate服务Stack,接收imageUri参数更新任务定义 new FargateServiceStack(this, 'Fargate服务栈', { imageUri: props.imageUri, }); } } // 把部署阶段加入流水线,关联构建输出的镜像信息 pipeline.addStage(new FargateDeployStage(this, '生产环境部署', { imageUri: cdkpipelines.FileSet.artifact(buildOutputArtifact).readJson('imageDetails.json').imageUri, }));
注意事项
- 需给
ApplicationBuild阶段的CodeBuild角色授予ECR镜像推送权限 - 需给流水线执行角色授予ECS任务定义更新、Fargate服务滚动部署的对应权限
- 若使用CodeCommit、BitBucket等其他代码托管服务,替换对应的Source构造即可
内容的提问来源于stack exchange,提问作者sisyphushappy
相关产品推荐
相关产品推荐

