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