如何通过 CDK 禁用代码管道中的转换?

How can I disable transition in codepipeline via CDK?

我正在使用 nodejs CDK 将代码管道部署到 AWS。下面是代码:

const pipeline = new codepipeline.Pipeline(this, this.projectName, {
      pipelineName: this.projectName,
      role: this.pipelineRole,
      stages,
      artifactBucket: s3.Bucket.fromBucketName(
        this,
        'deploymentS3Bucket',
        cdk.Fn.importValue(this.s3Bucket)
      ),
    });

它在 stages 数组中定义了所有阶段。我的问题是如何在此管道的一个阶段中禁用过渡?

我尝试了以下代码:

const primaryDeployStage: codepipeline.CfnPipeline = pipeline.node.findChild('Approve') as codepipeline.CfnPipeline;
      const stageTransitionProperty: codepipeline.CfnPipeline.StageTransitionProperty = {
        reason: 'reason',
        stageName: 'stageName',
      };
      primaryDeployStage. addPropertyOverride('DisableInboundStageTransitions', stageTransitionProperty);

但显示 no such method addOverride 错误。

从 CDK v2.1 开始,codepipeline.Pipeline class 不公开此 属性,但它所构建的 Level1 CfnPipeline class 公开(github issue).

选项 1:快速而肮脏的解决方法: 进入 codepipeline.Pipeline 的实现以获取对其 CfnPipeline 的引用(这是您的方法尝试过):

// pipeline is a codepipeline.Pipeline
// DANGER - 'Resource' is the CfnPipeline construct's id, assigned in the Pipeline's constructor implementation
const cfnPipeline = pipeline.node.findChild('Resource') as codepipeline.CfnPipeline;

cfnPipeline.addPropertyOverride('DisableInboundStageTransitions', [
  {
    StageName: 'Stage2',
    Reason: 'No particular reason',
  },
]);

选项 2:实例化 Level1 CfnPipeline, which accepts a disableInboundStageTransitions 道具。

// CfnPipelineProps
disableInboundStageTransitions: [{
  reason: 'reason',
  stageName: 'stageName',
}],

编辑:说明ResourceCfnPipeline子节点的名称

我们通过将阶段名称传递给 L1 CfnPipeline 来禁用阶段转换。方法#2 通过创建一个来直接做到这一点。 但我们宁愿使用 L2 Pipeline,因为它更容易。这是方法#1,您正在采用的方法。幸运的是,我们的 pipeline 有一个名为 'Resource' 的 CfnPipeline 子节点。我们怎么知道呢?我们看在 Pipeline constructor's source code on github。 一旦我们使用 pipeline.node.findChild('Resource') 引用了 CfnPipeline,我们将禁用的阶段作为 属性 覆盖添加到它,采用与 #2 中相同的 {StageName: Reason:} 格式。