前置き
Github-flowに従うプロジェクトにおいてmasterブランチは神聖な場所であり、そこにはプルリクエスト上で以下の声を掛けられたソースコードだけが到達され得るべきであります。
- レビュワーによる***「LGTM!」***
- CIによる***「All checks have passed」***
なので、ローカルPCからmasterブランチへ直接Pushを行うなど、言語道断の所業です。
また、上記2つの声を掛けられていないにも関わらず、プルリクエストをマージすることもあってはならないのですが、人間社会というのは止事無き事情がまま起きてしまう業の深い場所ですので、
レビュワーによる 「LGTM!」- CIによる「All checks have passed」
という最低限の条件の下、可及的速やかにmasterへマージできることも、時には認めざるを得ません。
失敗
ご承知の通り、GitHubには Branch protection rule
という設定項目が存在し、これを使うとmasterブランチへの(に限らずお好きなブランチへの)コードの無秩序な流入を食い止めることが可能です。
そんな訳でRequire pull request reviews before merging
にチェックを付けます。そこにはこんな説明があります。
When enabled, all commits must be made to a non-protected branch and submitted via a pull request with the required number of approving reviews and no changes requested before it can be merged into a branch that matches this rule.
(この設定が有効な場合、全てのコミットは(ルールが適用されていない)その他のブランチに対して行った上で、該当ブランチにマージする前に、プルリクエスト経由で必要な数の承認レビューが必要です。)
やれやれ、これでmasterは守られたと思っていたのです。
(しかも、Admin権限があれば(CIの目視チェックだけは作成者に課すにしても)強制的にmasterへマージできることも経験的に知っていました)
ところがこの設定だけだと、Admin権限を持っていればローカルPCからmasterへ直接Pushができるということを最近になって知りました・・・。さすがにそれはマズいわぁ、何とかしたいわぁ、という訳で調査した結果がこの記事です。
調査
以下、GitHubのFreeプラン・Publicリポジトリで検証しましたが、Teamプランであっても雰囲気は同じだと思います(たぶん)。
調査内容としては、Branch protection rule
の設定を付けたり消したりしながら、各権限のユーザーでどういった操作が可能であるかを一つ一つ調べました。
1. デフォルトの状態
- Branch protection ruleには何も設定していない
権限 | masterへ直接Push | レビューのないプルリクからのMerge |
---|---|---|
Owner | ○ | ○ |
Collaborator | ○ | ○ |
その他 | × | x |
2. レビューを必須にした状態
masterブランチに対して、
-
Require pull request reviews before merging
にチェック
権限 | masterへ直接Push | レビューのないプルリクからのMerge |
---|---|---|
Owner | ○ (*1) | △ (*2) |
Collaborator | × | × |
3. 管理者もルールの適用対象にした状態
masterブランチに対して、
-
Require pull request reviews before merging
にチェック -
Include administrators
にチェック
権限 | masterへ直接Push | レビューのないプルリクからのMerge |
---|---|---|
Owner | × | × (*3) |
Collaborator | × | × |
結論
表をきちんと精読した人には分かったと思いますが、結論、前書きに出てきたわがままボディを満足させる設定は、探し当てることができませんでした。が〜〜〜ん。ここまで読んでいただいたにも関わらず申し訳ございません。
以下、表中の備考です。
- (*1) これだけを防ぎたかったのが今回の記事の目的です。
- (*2) Merge画面で
Use your administrator privileges to merge this pull request.
にチェックを付けるだけです。 - (*3) 止事無き事情によりこれはできて欲しい。
本当の目的
こんな設定を知ってるよ〜、を教えてください