lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

AWS CodeBuildでGitHub Webhookイベントをフィルタリングする

概要

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イベントのフィルタリング設定から読んでください。

目次

参考サイト様

環境構成

蛇足な気もしますが全体構成を軽く紹介しておきます。

VuePressを使用した静的Webサイト(ミニブログ的な)をAWS CloudFront + S3でホスティングしていて
CI環境としてGitHubへのPush検知でAWS CodeBuildが実行され自動ビルド&デプロイと言う感じです。

f:id:HM_Atlas:20190413220021p:plain

CodeBuildの開始イベントをフィルタリング

CodeBuild側でWebhookイベントのフィルタリングを実施して無駄なビルド&デプロイの実行を抑止します。

前提

現状は、CodeBuild側でWebhookのPUSHイベントのみを検知するように設定しています。
想定ではmasterブランチへのPUSHのみを検知すると考えていました。
しかし、別ブランチへのPUSHもイベントとしてCodeBuild側に通知されており意図しないビルド&デプロイが大量に実行されている状況です。

目指すべき姿は、masterブランチへのPUSHにのみ反応してビルド&デプロイが実行されるようにします。
前述してしまっていますが無駄なビルドを抑止します。

(本来であればPullRequestのマージイベントを検知したかったが無理っぽかったので諦めた。)

やること&やらないこと

CodeBuildのWebhookイベントにはPUSHPULL_REQUEST_CREATEDPULL_REQUEST_UPDATEDPULL_REQUEST_REOPENEDがあります。
今回はPUSHイベントのみを使用し複合条件のフィルタリングは実施しません。
(masterへのPUSHを検知したかっただけなので設定しなかった。)

f:id:HM_Atlas:20190413220045p:plain

公式ドキュメントについて

AWS公式ドキュメントの日本語版は版数が古くWebhookフィルタリングの下りが記載されていません。
英語版を参照するようにしてください。

また、下記の回答にあるとおり各パラメータの詳細については2019/4/13現在整備されていない状況です。 (なのでGitHub Developerのドキュメントを見ながらなんとなくでやった。)

AWSのここらへんのドキュメントも見たけどあまり参考になりませんでした。

設定確認

設定を開始する前にGitHub側とCodeBuild側のWebhook設定を確認します。

GitHub側はJust the push event.に設定しています。 CodeBuild側もPUSHイベントのみ設定しています。

f:id:HM_Atlas:20190413220116p:plainf:id:HM_Atlas:20190413220120p:plain

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$を指定することでブランチを指定できました。

f:id:HM_Atlas:20190413220156p:plain

これでmaster以外のブランチをGitHubにPUSHしてもCodeBuildが走らないようになりました。

以下はすべて補足です。

CodeBuild側に飛んでくるWebhookの内容はGitHub Developerのドキュメントで確認可能です。
※1ページが長いので該当部分をセクションごとにリンクしています。

PUSHイベントの場合はrefの値を読んでるだけっぽいですね。

{
  "ref": "refs/tags/simple-tag",
  //省略
}

補足1:フィルタリング設定の複合条件について

今回は実施していませんが下記ドキュメントにサンプルがあります。

補足2:HEAD_REFBASE_REFについて

下記のStackOverflowでAWSの中の人が回答してくれていました。

雑感

AWS LambdaとLINE BOTでビルド結果通知するようにしたらバカスカ通知が飛んできて初めて気がついた笑