この記事はMicroAd (マイクロアド) Advent Calendar 2020 - Qiitaの6日目の記事です。
前書き
この記事では、自分の所属しているチームが主に開発しているGitHub
1リポジトリに関してBranch protection rule
の運用ルールを作った話についてまとめます。
背景
弊チームでは元々Branch protection rule
をなんとなくで運用していましたが、rebase
等の操作に伴って外したプロテクションの戻し忘れが発生したり、手伝いに入って貰った別チームから「うちは個別のBranch protection rule
で運用したい」といった要望が出たため、正式に運用ルールを整えることにしました。
設定した運用ルール
運用ルールは最終的に以下のような形になりました2。
- よく使う名前のブランチは包括的にプロテクションをかけておく(これらのルールは編集禁止)
master
release
-
*_feature
(個別の案件系ブランチ)
- 特殊な操作・運用が必要な場合、個別のブランチに関するプロテクションを立て、そちらで制約を緩める
- 不要になったプロテクションはなる早で削除する
これらのプロテクションを入れると以下のようになります3。
以下に機能面での解説をします。
正規表現を用いたプロテクション
弊チームでは、個別の案件系ブランチには${案件の識別番号}_feature
という名前を付けています。
これらのブランチは並行で複数存在するため、基本的なプロテクションはワイルドカード構文を用いて行うこととしました。
これによって、feature
ブランチを作る度に一々プロテクションを作る必要が無くなります。
個別のブランチプロテクション
正規表現を用いたプロテクションは、より具体的な名前のプロテクションで上書きすることができます。
例えば、hoge_feature
という名前のブランチに対してhoge_feature
と*_feature
というプロテクションが有った場合は前者が優先的に適用されます。
つまり、*_feature
プロテクション内でforce push
が禁止されていても、hoge_feature
内でforce push
を許可することで、hoge_feature
へのforce push
を可能にするようなこともできます。
これによってチームごとにプロテクションルールを設定したり、個別のブランチに対する操作の間だけ制約を緩めるようなことができます。
今回の運用ルール制定前は全体へのプロテクションを弄って制約を緩めるようなこともしていましたが、戻し忘れた際の影響が大きいということで、必要になった場合だけ個別に立ててすぐ消すという運用に落ち着きました。
おまけ
feature
ブランチに実際に設定しているBranch protection rule
を載せます。
主に設定していること
- マージ前に1人以上のレビュー必須
-
CI
(テストとlint
)の成功必須- このリポジトリには2種類の
CI
が設定されていて、feature
ではチェックを付けている片方のみ動かしているため、チェックは動かしている方にだけ付けています
- このリポジトリには2種類の
- マージ前の
rebase
必須 - 管理者にもルールを適用
-
push
禁止(force push
だけでなくブランチへのpush
そのものを禁止)
終わりに
今回はBranch protection rule
の運用ルールを作った話に関してまとめました。
合わせてBranch protection rule
そのものも整備しましたが、色々な事故のリスクが減って良かったです。
明日は@taka_maenishiによる「PySpark
でarray<struct>
のフィールドを操作する」記事です。