レビュ済みの変更をmasterにmergeするためにたらい回しにされたので、アンチパターンとして共有します
前提
- git flowのようにdev branchを利用している
- dev branchは複数並列で存在する
-
branch protection ruleにより、master branch, dev branchが保護されている
- Require pull request reviews before merging (レビュ必須、勝手なforce push不可)
- Dismiss stale pull request approvals when new commits are pushed (新たなコミットが追加されると再レビュが必要)
- Require branches to be up to date before merging (base branchが更新された場合、取り込まなければPRをmergeできない)
protection rule参考画像
たらい回し詳細
1: dev branch Aをmasterにmergeできない
複数の開発が並列で進行しており、いざリリースのためとあるdev branch Aをmasterにmergeしようとしたそのとき、mergeボタンが押せない状況に遭遇
参考画像
原因
master branchが進行しているため、Require branches to be up to date before mergingによりmergeできない
2: dev branch Aをupdateできない
ならばbaseをupdateすればいいじゃないと思いupdate branchボタンを押すもエラー
参考画像
原因
dev branchがRequire pull request reviews before mergingによって保護されているため、update(内部的には最新のbase branchをmergeする操作)が許可されず、エラー
3: updateしたdev branch Aをpushできない
localでdev branch Aに最新のmasterをmerge(もしくはrebase)し、それをpushするもエラー
原因
dev branchがRequire pull request reviews before mergingによって保護されているため、pushが許可されず、エラー
一旦の解決
- dev branch Aから別にbranchを切り、最新のmasterをmergeし、dev branch Aに向けたPRを作成
- CIチェック・レビュを済ませ、dev branch Aにmerge
これにより、dev branch Aはmasterにmergeできるようになる
続: たらい回しは終わらない
前述したdev branch Aとは全く異なるdev branch Bもリリースするため、masterにmergeしたいのだが・・・
masterはdev branch Aを取り込んだことにより進行しているため、mergeできない
↓
俺たちのリリース作業はまだ始まったばかりだ!
問題
厳格に保護され、 意図しない変更が混入することが防げているこの状況で何が問題なのでしょうか
私は以下のものを問題だと考えています
- CIによるチェック待ちが何度も発生する
- mergeするためにapproveするだけのレビュが何度も発生する
- dev branchが複数ある場合、それぞれをmergeするたびに、それ以外のdev branchはupdateしなければmergeできない(新規PR・CIチェック・無駄なレビュが発生する)
根本的解決策
- Require branches to be up to date before mergingの適用は慎重に検討しよう
- とっさに設定変更するために、Repositoryの権限を複数人に移譲しよう