🚨
BitriseでPRをトリガーにしたワークフローを、任意のBaseブランチの場合はCompareブランチを確認して処理する方法
背景
git-flowなどを使用している場合、mainブランチやdevelopブランチへのマージは特定のブランチのみに制限したいと考えると思います。基本的には運用でカバーできると思いますが、うっかりmainやdevelop向けにPRを作成してBaseブランチの確認が漏れた場合、特定のブランチ以外がマージされてしまうといったことが起こり得ます。運用で頑張るのには限界がある為、CI側で弾くというアプローチを取ったので紹介します。
前提
PRを作成した際にUnit TestやLintなどを実行するワークフローが走るように、Bitrise側のトリガーを設定しています。
方法
方法は至ってシンプルでワークフローの最初にScriptを追加して、BaseブランチとCompareブランチを確認するだけです。
環境変数
Bitriseには環境変数が用意されており
- BITRISEIO_GIT_BRANCH_DEST(Baseブランチ)
- BITRISE_GIT_BRANCH(Compareブランチ)
上記を使用することでブランチ名を取得することが出来ます。
スクリプトの内容
mainブランチへのマージをreleaseブランチとhotfixブランチのみに限定する場合
#!/usr/bin/env bash
if [ "$BITRISEIO_GIT_BRANCH_DEST" = "main" ] && [[ "$BITRISE_GIT_BRANCH" != release/* ]] && [[ "$BITRISE_GIT_BRANCH" != hotfix/* ]]; then
echo "mainへのPRはrelease OR hotfixブランチのみ受け付けます"
exit 1
fi
処理の内容は書いてある通りなんですが
- BITRISEIO_GIT_BRANCH_DESTでBaseブランチを取得して、mainブランチかどうか比較
- (mainブランチだった場合)BITRISE_GIT_BRANCHでCompareブランチを取得して、release/xxx or hotfix/xxxかどうか比較
- (release/xxx or hotfix/xxxでない場合)exit 1で処理を終了させる
上記のScriptによって、任意のブランチ以外は失敗するように出来ます。
まとめ
Bitriseのワークフローの最初にScriptを追加することで実現ができる。
CIが失敗している場合は、マージできないようにGitHub側で設定をすることによって運用でのカバーじゃない方法でマージされることを防ぐことが可能になります。
Discussion