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 Build
な echo
文のみを吐いて正常終了する無駄なジョブが混じるのだが、仕方なし。