概要
CodeBuildでGitHubのWebhookイベントをフィルタリングします。
少し前まではCodeBuildのbranch filter
で「masterブランチだけ検知する」と言ったことができてたんですが
2019/2/8のアップデートでbranch filter
が廃止され代替としてWebhook filter
が実装されました。
CodeBuild now supports webhook filter groups to specify events that trigger a build.
For more information, see Filter GitHub Webhook Events and Filter Bitbucket Webhook Events.
AWS CodeBuild User Guide Document History - AWS CodeBuild 🔗
Google翻訳大明神よるとこんな感じ。
CodeBuildは、ビルドをトリガーするイベントを指定するためのWebhookフィルタグループをサポートします。
詳細については、「GitHub Webhookイベントをフィルタする」および「Bitbucket Webhookイベントをフィルタする」を参照してください。
これを知らずにmaster以外のブランチをバカスカGitHubへPushしてたらビルドが走りまくってました…Orz
詳細には検証できていませんが自分のやりたいことはできたので記事にしておきます。
前段が長いのでやり方だけ見せろって人はCodeBuildでWebhookイベントのフィルタリング設定から読んでください。
目次
参考サイト様
- amazon web services - AWS CodeBuild Branch filter option removed - Stack Overflow 🔗
- amazon web services - What is the difference between HEAD_REF vs BASE_REF in AWS Codebuild git webhook? - Stack Overflow 🔗
- GitHub Pull Request and Webhook Filter Sample for CodeBuild #Filter GitHub Webhook Events - AWS CodeBuild 🔗
- Webhooks | GitHub Developer Guide 🔗
- Event Types & Payloads | GitHub Developer Guide 🔗
環境構成
蛇足な気もしますが全体構成を軽く紹介しておきます。
VuePressを使用した静的Webサイト(ミニブログ的な)をAWS CloudFront + S3でホスティングしていて
CI環境としてGitHubへのPush検知でAWS CodeBuildが実行され自動ビルド&デプロイと言う感じです。
CodeBuildの開始イベントをフィルタリング
CodeBuild側でWebhookイベントのフィルタリングを実施して無駄なビルド&デプロイの実行を抑止します。
前提
現状は、CodeBuild側でWebhookのPUSHイベントのみを検知するように設定しています。
想定ではmasterブランチへのPUSHのみを検知すると考えていました。
しかし、別ブランチへのPUSHもイベントとしてCodeBuild側に通知されており意図しないビルド&デプロイが大量に実行されている状況です。
目指すべき姿は、masterブランチへのPUSHにのみ反応してビルド&デプロイが実行されるようにします。
前述してしまっていますが無駄なビルドを抑止します。
(本来であればPullRequest
のマージイベントを検知したかったが無理っぽかったので諦めた。)
やること&やらないこと
CodeBuildのWebhookイベントにはPUSH
・PULL_REQUEST_CREATED
・PULL_REQUEST_UPDATED
・PULL_REQUEST_REOPENED
があります。
今回はPUSHイベントのみを使用し複合条件のフィルタリングは実施しません。
(masterへのPUSHを検知したかっただけなので設定しなかった。)
公式ドキュメントについて
AWS公式ドキュメントの日本語版は版数が古くWebhookフィルタリングの下りが記載されていません。
英語版を参照するようにしてください。
また、下記の回答にあるとおり各パラメータの詳細については2019/4/13現在整備されていない状況です。 (なのでGitHub Developerのドキュメントを見ながらなんとなくでやった。)
AWSのここらへんのドキュメントも見たけどあまり参考になりませんでした。
設定確認
設定を開始する前にGitHub側とCodeBuild側のWebhook設定を確認します。
GitHub側はJust the push event.
に設定しています。
CodeBuild側もPUSHイベントのみ設定しています。
CodeBuildでWebhookイベントのフィルタリング設定
CodeBuild側でGitHubから飛んできたWebhookイベントをフィルタリングします。
GitHub側ではWebhookのイベントごとの細かな設定ができないため、
CodeBuild側でGitHubから飛んできたWebhookイベントを起動のトリガーとするか否かを設定します。
設定箇所
CodeBuildのBuild project画面からBuild detail
タブのPrimary source webhook events
からフィルタリングの設定をします。
- Start a build under these conditions
- ビルドを開始するイベントの条件を指定します。
- Don’t start a build under these conditions
- ここで指定した条件の場合はビルドを開始しません。
上記2つを組み合わせて複合的な条件を設定することが可能みたいですが、今回は必要なかったので開始条件のみ設定しています。
ブランチを指定
GitHubから飛んできたWebhookイベントの内、masterブランチのイベントのみをビルド開始条件として設定します。
HEAD_REF
に条件として指定するブランチを指定します。
今の所、設定のリファレンスは下記のドキュメントだけっぽいです。
下記画像の様にHEAD_REF
に正規表現で^refs/heads/master$
を指定することでブランチを指定できました。
これでmaster以外のブランチをGitHubにPUSHしてもCodeBuildが走らないようになりました。
以下はすべて補足です。
CodeBuild側に飛んでくるWebhookの内容はGitHub Developerのドキュメントで確認可能です。
※1ページが長いので該当部分をセクションごとにリンクしています。
PUSHイベントの場合はref
の値を読んでるだけっぽいですね。
{
"ref": "refs/tags/simple-tag"
//省略
}
補足1:フィルタリング設定の複合条件について
今回は実施していませんが下記ドキュメントにサンプルがあります。
補足2:HEAD_REF
とBASE_REF
について
下記のStackOverflowでAWSの中の人が回答してくれていました。
雑感
AWS LambdaとLINE BOTでビルド結果通知するようにしたらバカスカ通知が飛んできて初めて気がついた笑