Jenkins と Bitbucket のブランチ指定入り Push 連携がうまくいかなかったのでやり方を変えた

Jenkins の Declarative Pipeline ジョブを使って、Bitbucket リポジトリをポーリングし、「ビルドするブランチ」を develop ブランチに指定したジョブを作っていたのだが、どうも feature ブランチに対する Push 時にもこのジョブが反応して、feature ブランチのコミットを対象に作業してしまう。

「ビルドするブランチ」でブランチを絞るだけではダメなのか?よく分からん!となったので、実行するシェルスクリプト側で Git のブランチ名を見て判定してやることにした。

Jenkins が Bitbucket への Push をトリガーにジョブを実行する際、内部的には以下のようにコミット ID を指定してチェックアウトしている。

git checkout -f 722f178e0dca1c17d4233aa1936180d92bdd9fc7

このようにチェックアウトされると、git branch でブランチ名を確認できないので、違う方法でブランチ名を判定する必要がある。

最初に見つけたのは git rev-parse --abbrev-ref HEAD というコード。コレを条件文に当てはめたらどうかと試してみた。

[ $(git rev-parse --abbrev-ref HEAD) = 'develop' ] && echo OK || echo NG

しかしコレだと、上述のようなコミット ID でチェックアウトした時は HEAD という文字列しか取れないので、develop というブランチ名とイコールにならず失敗。

次に見つけたのは、git log からブランチ名を拾う、git log -1 --pretty=%d HEAD というやり方。コレが上手く行った。

[[ `echo $(git log -1 --pretty=%d HEAD) | grep 'develop'` ]] && echo OK || echo NG

コレなら (HEAD, origin/develop) という文字列が取れるので develop を含むかどうかでチェックができる。

実際は以下のようにすることで、develop ブランチへの Push 時のみ、任意のコマンドを実行できた。

[[ `echo $(git log -1 --pretty=%d HEAD) | grep 'develop'` ]] && npm run build || echo Skip Build

残念ながら、feature ブランチへの Push の時もこの Jenkins ジョブが発火してしまうので、Skip Buildecho 文のみを吐いて正常終了する無駄なジョブが混じるのだが、仕方なし。