You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:06:05