takuroooのブログ

勉強したこととか

CodeBuildのWebhookイベントでPULL_REQUEST_MERGEDを指定するとPRのブランチで処理が開始する

前置き

GitHubのWebhookを使うとPullRequestがマージされたときにAWSのCodeBuildを起動できる。

docs.github.com

CodeBuild側でどんなイベントで起動するのかを指定できる。
下記イベントを選択できる

  • PUSH
  • PULL_REQUEST_CREATED
  • PULL_REQUEST_UPDATED
  • PULL_REQUEST_REOPENED
  • PULL_REQUEST_MERGED

設定画面はこんな感じ

ちなみにGitHubのWebhookにはPULL_REQUEST_MERGEDというイベントは存在しない。これはGitHubから通知される情報を組み合わせてCodeBuild側がPullRequestがマージされたと判断している。
GitHubのイベントとCodeBuildのイベントの対応表は下記リンクに書いてある。

docs.aws.amazon.com

GitHubから通知される情報は下記リンクに書いてある。

docs.github.com

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はこれ

github.com

AWSのユーザーガイドにもちゃんと書いてある。

Webhook プルリクエストイベントによりトリガーされた GitHub または GitHub Enterprise Server ビルドの場合、pr/pull-request-number です。

docs.aws.amazon.com

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に下記のイベントが通知される。

  1. pull_request.opened
  2. pull_request.closed
  3. push

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