CodeBuildのWebhookイベントでPULL_REQUEST_MERGEDを指定するとPRのブランチで処理が開始する
- 前置き
- 本題
- PULL_REQUEST_MERGEDでCodeBuildを起動するときPullRequestのブランチでCodeBuildが起動してしまう
- GitHubのイベントでCodeBuildを起動するときマージされたmainブランチ上で処理をしたい場合どうすればいいか
前置き
GitHubのWebhookを使うとPullRequestがマージされたときにAWSのCodeBuildを起動できる。
CodeBuild側でどんなイベントで起動するのかを指定できる。
下記イベントを選択できる
- PUSH
- PULL_REQUEST_CREATED
- PULL_REQUEST_UPDATED
- PULL_REQUEST_REOPENED
- PULL_REQUEST_MERGED
設定画面はこんな感じ

ちなみにGitHubのWebhookにはPULL_REQUEST_MERGEDというイベントは存在しない。これはGitHubから通知される情報を組み合わせてCodeBuild側がPullRequestがマージされたと判断している。
GitHubのイベントとCodeBuildのイベントの対応表は下記リンクに書いてある。
GitHubから通知される情報は下記リンクに書いてある。
GitHubが通知したイベントの履歴はリポジトリのSettings->Webhooksから見れる。
本題
PULL_REQUEST_MERGEDでCodeBuildを起動するときPullRequestのブランチでCodeBuildが起動してしまう
GitHubのイベントでCodeBuildを起動するとき、CodeBuildには起動時に自動でGitHub上のコードがダウンロードされる。
GitHubのPullRequestがマージされたらマージされたmainブランチをCodeBuildで処理したい場合、PULL_REQUEST_MERGEDを選択したくなる。しかしPULL_REQUEST_MERGEDでCodeBuildを起動するとPullRequestのブランチでCodeBuildが起動する。
PULL_REQUEST_MERGEDで起動したCodeBuildのビルド履歴。ソースバージョンがpr/10になっている。これはNo10のPRのソースであることを意味している。

このときマージしたPRはこれ
AWSのユーザーガイドにもちゃんと書いてある。
Webhook プルリクエストイベントによりトリガーされた GitHub または GitHub Enterprise Server ビルドの場合、pr/pull-request-number です。
GitHubのイベントでCodeBuildを起動するときマージされたmainブランチ上で処理をしたい場合どうすればいいか
1. CodeBuildのbuildspecでgit checkout mainを実行する
CodeBuildの起動イベントはPULL_REQUEST_MERGEDを指定する。PullRequstのブランチで処理が開始するが、buildspecのどこかのフェーズにgit checkout mainを書いてmainブランチに切り替える。
このとき切り替わったmainブランチはPullRequstがマージされた最新のmainブランチになっている。
2. CodeBuildの起動イベントにPUSHを指定する
CodeBuildの起動イベントでPULL_REQUEST_MERGEDではなくPUSHを指定する。
GitHubでPullRequstを作ってからマージされるまでにGitHubからCodeBuildに下記のイベントが通知される。
pull_request.openedpull_request.closedpush

CodeBuildのPULL_REQUEST_MERGEDはpull_request.closedに対応している。PUSHを指定するとpushのタイミングでCodeBuildが起動する。このときCodeBuild上にダウンロードされるコードはPullRequstがマージされた最新のmainブランチになっている。
この設定ではmainブランチに直接プッシュしたときにもCodeBuildが起動するので、PullRequstがマージされたときだけCodeBuildを起動したい場合はmainブランチへの直接のプッシュを禁止する設定をしたほうがよさそう。