継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

GitHub/CodeBuild/CodePipeline の CI/CD パイプラインを CDK で実装する

タダです.

CDK で CI/CD パイプラインを作る機会があったのでこの記事で構成の仕方をまとめます.

構成図

この記事での構成は以下の通りです.GitHub からコードをポーリングして CodeBuild でビルド・テスト・デプロイするためのパイプラインを CodePipeline で作ります。

f:id:sadayoshi_tada:20200223150242p:plain

なお, CDK の TypeScript プロジェクトをビルド・テスト・デプロイする工程を定義してます.動作確認はバージョン1.25.0 で確認しています.

cdk --version
1.25.0 (build 5ced526)

パイプラインの実装

CodePipline と CodeBuild のパッケージをインストールします.

npm install @aws-cdk/aws-codebuild @aws-cdk/aws-codepipeline @aws-cdk/aws-codepipeline-actions

CodeBuild と CodePipeline の組み合わせはドキュメントを参考に実装しました.

先ほど導入したパッケージをインポートして,リソースを定義していきます.CodePipeline に CodeBuild を追加する場合は,PipelineProject クラスを使います.CDK 特有の部分としてデプロイ時にcdk deployコマンドの--require-approvalオプションを入れて,手動承認プロセスを無視した自動デプロイが可能なようにしています.

import * as codebuild from '@aws-cdk/aws-codebuild';
import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';

~中略~

    const build = new codebuild.PipelineProject(this,'TestBuild',{
      buildSpec: codebuild.BuildSpec.fromObject({
        version: '0.2',
        phases: {
          install: {
            commands: [
              'npm install -g aws-cdk',
              'npm install -g typescript'
            ]
          },
          pre_build: {
            commands: 'npm i'
          },
          build: {
            commands: [
              'npm run build',
              'npm run test'
            ]
          },
          post_build: {
            commands: [
              'cdk deploy --require-approval never'
            ]
          },
        },
      }),
~中略~

次に,CodePipeline で CI/CD のステージを構成していきます.Source ステージで GitHub からコードを取得する処理を入れるのですが,aws-codepipeline-actions module を使います.oauthToken のパラメーターで GitHub の OAuth トークンを指定しているのですが,確認できているのは現状直書きしています.トークンはマネージドサービスの SecretManager に格納するようにしたい...また,GitHubソースコードをポーリングするために triger のパラメーター GitHubTrigger.POLL で指定しています.

    const pipeline = new codepipeline.Pipeline(this,'TestPipeline',{
      stages:[
      {
        stageName: 'Source',
        actions: [
          new codepipeline_actions.GitHubSourceAction({
          actionName: 'GitHub',
          owner: 'ユーザー名',
          repo: 'リポジトリ名',
          branch: 'ブランチ名',
          oauthToken: new cdk.SecretValue('トークン'),
          trigger: codepipeline_actions.GitHubTrigger.POLL,
          output: sourceOutput
        })
        ]
      },

Build ステージでは CodeBuild の振る舞いを定義します.こちらは,ドキュメントの定義にのっとり設定しました.

      {
        stageName: 'Build',
          actions: [
            new codepipeline_actions.CodeBuildAction({
              actionName: 'CDK_Build',
              project: build,
              input: sourceOutput,
              outputs: [cdkBuildOutput],
            })
          ]
        },
      ],
    });
  }
}

以上の定義をデプロイすると次のパイプラインが出来上がります.これで GitHub の所定ブランチが更新されると自動で CI/CD を実行する構成ができました.

f:id:sadayoshi_tada:20200223145327p:plain

まとめ

GitHub/CodeBuild/CodePipeline を使った CI/CD パイプラインを CDK で作ってみました.シンプルな作りとなっているため,今後 buildspec.yamlの処理をブラッシュアップしてそれをまたブログにしていきたいと思います.

関連ドキュメント

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com