🙆‍♀️

CDK PipelineでPushトリガーによる起動でなく、外部からのPipeline起動にする

2023/05/20に公開

CDK Pipeline

aws-cdk-lib/pipelinesを使ってCI/CDパイプラインを構築する(通称CDK Pipiline)際のチョットしたチップスの紹介です。CDK Pipelineそのものの紹介は省略します。

CDK Pipelineのイメージ(Building a Cross-account CI/CD Pipelineより拝借):

aws-cdk-lib/pipelines:
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.pipelines-readme.html

課題

ワークショップなどを参考にして、aws-cdk-lib/pipelines(CDK L2コンストラクタ)を使って実装する場合、GitHubやCodeCommitなどのリポジトリとブランチをinputと指定して、そのブランチにpushされることをトリガーにPipelineが起動するような構成になることが多いと思いまし、実際自分もそうすることが多かったです。

しかし、何かしらの理由で、ブランチへのPushをトリガーにせずに、GitHubActionsとか別のCIツールなどで何かを処理してからCodePipelineを起動したいケースもあるかと思います。

その方法を調べた際に、実現方法を見つけるのに手間取ったので、備忘録も兼ねて残しておきます。

結論: CodePipelineSourceのtriggerOnPushオプションをfalseにする

結論は公式ドキュメントを読めばわかりました!というと、そのままなのですが、CodePipeline関連のCDKリソースがいまいちわかりにくかったり、ググっても同じことをしている例は見つけられなかったりして辿り着くのに少し苦労しました。(aws-cdk-lib/pipelines と aws-cdk-lib/aws_codepipeline が似ていたりしているのが個人的には分かりにくかったです)

triggerOnPushのドキュメント:

デフォルトではtrueで必須パラメータではないので、指定しないとPushトリガーで動作します。

Type: boolean (optional, default: true)

Controls automatically starting your pipeline when a new commit is made on the configured repository and branch.

If unspecified, the default value is true, and the field does not display by default.

https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_pipelines.ConnectionSourceOptions.html#triggeronpush

コード例

CDKのドキュメントにある実装を参考にtriggerOnPushを指定すると次のようなイメージになります。

const source = CodePipelineSource.connection(
  'my-org/my-app',
  'main',
  {
    connectionArn: 'arn:aws:codestar-connections:us-east-1:222222222222:connection/7d2469ff-514a-4e4f-9003-5ca4a43cdc41',
    triggerOnPush: false,
  }
);

const pipeline = new pipelines.CodePipeline(this, 'Pipeline', {
  synth: new pipelines.ShellStep('Synth', {
    input: source,
    }),
    commands: ['npm ci','npm run build','npx cdk synth'],
  }),

  // Turn this on because the pipeline uses Docker image assets
  dockerEnabledForSelfMutation: true,
});

Pipelineの起動

AWS CLIを使って、Pipelineを起動するのが手軽な方法になります。

 aws codepipeline start-pipeline-execution --name $PIPELINE_NAME

最後に

以上が、CDK PipelineをPushトリガーでなく、外部から好きなタイミングでPipelineを起動する方法の紹介になります。

CDK PipelineはCDKでリソース管理をしている場合に、CI/CDのパイプラインもCDKで完結させることができるので、認知コストがCDKのみに集中させることができる点と、クロスアカウントのデプロイ(Stg→Prdと繋げたPipelineにする)も簡単に実現できるため好きなサービスです。

CDK Pipelineを構築する際などに役立てば幸いです。

Discussion