hookを使ってるとリポジトリへpushしてすぐにjenkinsをビルドできて便利だけど、どのブランチにpushしてもhook URLが呼ばれてちょっと不便。
例えばdevelopブランチにpushされた時だけ、hookでdevelopのビルドジョブを実行する、みたいな事がやりたくて調べてみた。
やり方
自前のgitリポジトリだと.git/hooksで特定ブランチへのpush時だけhookする設定が書けるけど、Githubでは同じような事ができないので
Jenkins側で受け取ったhookがどのブランチへのpushによるものかを判定してみる。手順は以下のとおり。
hook受取り用ジョブの作成
ビルドジョブとは別でGithubからhookを受け取る専用のジョブを用意しておく。
ジョブはパラメータ付きビルドにしておき、下のように payload
という名前でパラメータを受け取れるようにする。デフォルト値は適当に。
このpayload
を設定しておくと、Githubからジョブのhook URLが叩かれた際に送られてくるJSONが受け取れる。中身はこんな感じで、pushされたブランチ名やcommit IDなどが含まれている。
[
{
"ref":"refs/heads/develop",
"after":"44c877612fe7187f6167ef01f465b96a5868e82b",
"before":"4acbee81fc4f2b0e2dc8cdf962294d8619ca18eb",
"created":false,
"deleted":false,
"forced":false,
"compare":"https://github.com/organization-name/project-name/compare/4acbee81fc4f...44c877612fe7",
"commits":[
{
"id":"5dea536624b8b74599d2ef6efc612e37998bb3e0",
...
詳細はこちらで。Post-Receive Hooks · GitHub Help
これでhook受取りジョブ側でブランチの情報を得られるようになったので、次はこのJSONでビルドジョブを回すかどうかを判定する。
Run Condition Pluginの導入
payloadで渡されたJSONの内容をチェックするためにこのプラグインを入れておく。
例えば受け取ったhookがdevelop
ブランチへのpushによるものかどうか判定したければ、ビルド手順の追加
→Conditional step (single)
で以下のような設定を入れる。
この設定ではpayload
の中身に"refs/heads/develop"の文字列が含まれるか正規表現で判定する。
次にBuilder
のTrigger/call builds…
でビルドジョブ名を指定しておくと、正規表現でdevelopへのpushと判定した時のみビルドを走らせることができる。またdevelop以外へのpushによるhookを無視したければ、高度な設定
から判定失敗時は何もしないように設定する。最終形は下のような感じ。
これでdevelopへpushした際のhookを受け取った時のみビルドジョブが呼び出され、それ以外は何も起こらないようになる。