在CDK部署的CodePipeline中获取源构件新增CodeBuild阶段的方法
实现方案
你之前手动调用buildPipeline()属于底层逃逸用法,会提前固化流水线配置,导致后续无法使用CDK Pipelines提供的高阶API(比如addStage添加应用部署阶段),也会丢失CDK自动管理依赖、构件传递的能力。
正确的实现不需要操作底层的CodePipeline资源,直接使用CDK Pipelines提供的高阶抽象即可:
import * as cdk from "@aws-cdk/core"; import { CodePipeline, ShellStep, CodePipelineSource, CodeBuildStep // 新增导入 } from "@aws-cdk/pipelines"; import * as codebuild from "@aws-cdk/aws-codebuild"; export class PipelineStack extends cdk.Stack { public readonly source: cdk.CfnOutput constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const source = CodePipelineSource.connection("someuser/somerepo", "master", { connectionArn: "arn:aws:codestar-connections:us-east-1:REDACTED:connection/REDACTED" }); const synthShellStep = new ShellStep("Synth", { input: source, commands: [ "cd infrastructure", "npm run ci", "npm run build", "npx cdk synth" ], primaryOutputDirectory: "infrastructure/cdk.out" }); const pipeline = new CodePipeline(this, "Pipeline", { pipelineName: "FancyPipeline", synth: synthShellStep }); // 新增Docker构建阶段,官方推荐写法 pipeline.addWave("DockerBuildStage", { post: [ new CodeBuildStep("DockerBuild", { input: source, buildEnvironment: { privileged: true }, env: { AWS_DEFAULT_REGION: this.region, AWS_ACCOUNT_ID: this.account, IMAGE_REPO_NAME: "somereponame", IMAGE_TAG: "latest" }, // 直接读取源码根目录下的buildspec.yml buildSpec: codebuild.BuildSpec.fromSourceFilename("buildspec.yml") }) ] }); // 后续可以正常调用addStage添加部署阶段,不会有任何问题 // pipeline.addStage(/* 你的部署阶段 */) } }
关键说明
- 你之前定义的
source是CodePipelineSource实例,可以直接作为任意Step的输入,CDK会自动处理构件传递和依赖顺序,不需要手动获取底层的Artifact对象。 addWave()方法用于在流水线中添加无部署动作的自定义阶段,你可以根据需要调整步骤在pre/post数组中的位置来控制阶段执行顺序。- 如果你需要把构建阶段放在Synth之前、或者UpdatePipeline之前,可以分别把步骤配置到
CodePipeline构造的preSynth、codeBuildDefaults等参数中。
内容的提问来源于stack exchange,提问作者Kujira Juunigou
相关产品推荐
相关产品推荐

