これはなに

GitHubで設定できるブランチ保護のルールについて調べたときのメモ。
前提

ここでは、Target branchesにmainを指定した場合の、各設定の意味を説明する。
そのため、本稿のmainは任意のブランチ名に変更できる。
ルールセット

Restrict creations(作成の制限)

Only allow users with bypass permission to create matching refs.
この設定を有効にすると、バイパス権限を持つユーザー以外の、mainブランチ/タグの作成を禁止できる。
通常mainブランチは最初に作成されるため、mainブランチの作成を禁止することはないだろう。main-*のようなパターンを指定すると、意味のある設定になる。
Restrict updates(更新の制限)

Only allow users with bypass permission to update matching refs.
この設定を有効にすると、バイパス権限を持つユーザー以外の、mainブランチ/タグの更新を禁止できる。バイパス権限を持つユーザーは、Bypass listで指定する。この「更新」はプッシュに限らず、リベースやマージなども含まれる。
たとえば、もしBypass listに誰も指定しなければ、mainブランチ/タグの更新をすべて禁止にできる。
別の例として、リポジトリのadmin権限を自分しか持っていない場合、ルールのBypass listにRepository adminを指定してこの設定を有効にする。すると、自分だけがmainブランチを更新できるようになる。
Restrict deletions(削除の制限)

Only allow users with bypass permissions to delete matching refs.
この設定を有効にすると、バイパス権限を持つユーザー以外の、mainブランチ/タグの削除を禁止できる。この設定はデフォルトで有効になっている。
とくにmainブランチの場合は、誤ったmainブランチの削除を防ぐためにも、この設定は有効にしておくべきである。
Require linear history(直線状の履歴必須)

Prevent merge commits from being pushed to matching refs.
この設定を有効にすると、mainブランチ/タグへのマージコミットを禁止できる。
言い換えれば、mainブランチ/タグへマージする際に、Squash and mergeあるいはRebase and mergeの使用を強制できる。
この設定はチームの方針による。個人的には、この設定はmainブランチには使わず、feature/*ブランチなどに使う。
Require deployments to succeed(デプロイ成功必須)

Choose which environments must be successfully deployed to before refs can be pushed into a ref that matches this rule.
この設定を有効にすると、mainブランチ/タグへのプッシュを許可する前に、指定した環境へのデプロイ成功を必須にできる。
mainブランチをどこかにデプロイしているなら、この設定を有効にしておくとよい。
Require signed commits(署名済みコミット必須)

Commits pushed to matching refs must have verified signatures.
この設定を有効にすると、mainブランチ/タグへのプッシュを許可する前に、署名済みコミットを要求できる。
自分が署名済みコミットを使っているなら、この設定を有効にしておくと、なりすましなどを防げる。
Require a pull request before merging(マージ前のプルリクエストの必須)

Require all commits be made to a non-target branch and submitted via a pull request before they can be merged.
この設定を有効にすると、mainブランチ/タグへのプッシュを許可する前に、プルリクエストを要求できる。
複数人で開発する場合、mainブランチへの直接のプッシュを禁止できるため、この設定は有効にしておくべきである。
この設定には追加設定がある。
Required approvals

The number of approving reviews that are required before a pull request can be merged.
この設定は、プルリクエストをマージするために必要な承認レビューの数を指定できる。
この値を1以上にすると、たとえ自分がプルリクエストを作成していても、他の人にレビューしてもらう必要がある。
この設定を1以上にすると、リポジトリの管理者ですらマージの際にレビューを受けなければならなくなってしまう。しかも、自分自身をレビュワーにはできない。
そのため、自分ひとりしかリポジトリを更新しないなら、この設定は0にしなければならない。
Dismiss stale pull request approvals when new commits are pushed

New, reviewable commits pushed will dismiss previous pull request review approvals.
この設定を有効にすると、新しいコミットがプッシュされたときに、古いプルリクエストの承認レビューが無効になる。言い換えれば、一度承認されたプルリクエストに対して新しくコミットがプッシュされた場合、再度のレビューと承認を強制できる。
特に理由がなければ、この設定は有効にしておくとよい。
Require review from specific teams

A collection of reviewers and associated file patterns. Each reviewer has a list of file patterns which determine the files that reviewer is required to review.
この設定を有効にすると、特定のファイルや特定の拡張子のファイルに対して、特定のチームによるレビューを強制できる。
一部のファイルに対して特定のチームのレビューを強制したい場合に便利である。
Require review from Code Owners

Require an approving review in pull requests that modify files that have a designated code owner.
この設定を有効にすると、指定したコードオーナーによるレビューを強制できる。
コードオーナーは、CODEOWNERSファイルで指定する。
CODEOWNERSファイルを作成して自分を指定し、この設定を有効にしておくと、自分はプルリクエストを承認無しでマージでき、他の人にはコードオーナー(すなわち自分)によるレビューを強制できる。
そのため、他人のプルリクエストを受け付けるけれど、自分のプルリクエストは自分でマージしたい場合に便利である。
Require approval of the most recent reviewable push

Whether the most recent reviewable push must be approved by someone other than the person who pushed it.
この設定を有効にすると、プルリクエストをマージする前に、最後にプッシュした人以外の誰かによる承認を強制できる。つまり、自己承認を防げる。
大規模な開発の場合は有効にすると良さそう。
Require conversation resolution before merging

All conversations on code must be resolved before a pull request can be merged.
この設定を有効にすると、プルリクエストをマージする前に、すべてのコードに関する会話(コメント)を解決する必要がある。よって、プルリクエストへのコメントの見逃しを防げる。
この設定は、プルリクエストの品質を向上させるため、有効にしておくとよい。
Automatically request Copilot code review

Request Copilot code review for new pull requests automatically if the author has access to Copilot code review.
この設定を有効にすると、Copilot Code Reviewを利用している場合、プルリクエストの作成時に自動的にCopilot Code Reviewを要求できる。
Copilot Code Reviewを利用しているなら、この設定を有効にしておくとよい。
Allowed merge methods

When merging pull requests, you can allow any combination of merge commits, squashing, or rebasing. At least one option must be enabled.
プルリクエストのマージ方法を強制できる。
Merge commits、Squash merging、Rebase mergingのいずれかを有効にする必要がある。複数有効にもできる。
この設定はチームの方針による。個人的には、mainブランチはMerge commitsのみを有効にすることが多い。ブランチのコミットの粒度が雑な場合は、Squash mergingのみを有効にするとよい。
Require status checks to pass(ステータスチェックのパスの強制)

Choose which status checks must pass before the ref is updated. When enabled, commits must first be pushed to another ref where the checks pass.
この設定を有効にすると、mainブランチ/タグへのプッシュを許可する前に、指定したステータスチェックのパスを強制できる。
つまり、必須CI/CDの通過を要求できる。
Status checks that are requiredに、必須にしたいステータスチェックを追加する。
この設定には追加設定がある。
Require branches to be up to date before merging

Whether pull requests targeting a matching branch must be tested with the latest code. This setting will not take effect unless at least one status check is enabled.
この設定を有効にすると、プルリクエストに対して、最新のコードによるテストを要求できる。
特別な理由がない限り、この設定は有効にしておくとよい。
Do not require status checks on creation

Allow repositories and branches to be created if a check would otherwise prohibit it.
この設定を有効にすると、ブランチやリポジトリの作成時には、ステータスチェックを必須としなくなる。
ステータスチェックを通せないくらいの初期段階では有効にしてもよいだろう。
Block force pushes(強制プッシュのブロック)

Prevent users with push access from force pushing to refs.
この設定を有効にすると、mainブランチ/タグへの強制プッシュを禁止できる。この設定はデフォルトで有効になっている。
とくにmainブランチの場合は、誤ったmainブランチの強制プッシュを防ぐためにも、この設定は有効にしておくべきである。
Require code scanning results(コードスキャンの強制)

Choose which tools must provide code scanning results before the reference is updated. When configured, code scanning must be enabled and have results for both the commit and the reference being updated.
この設定を有効にすると、mainブランチ/タグへのプッシュを許可する前に、指定したコードスキャン結果の提供を強制できる。
Required tools and alert thresholdsに、必須にしたいコードスキャンツールを追加する。
CodeQLなどのコードスキャンツールを利用しているなら、この設定を有効にしておくとよさそう。
Require code quality results(コード品質結果の強制)

Choose which severity levels of code quality results should block pull request merges. When configured, a code quality analysis must be done on the pull request before the changes can be merged.
この設定を有効にすると、コード品質結果に基づいてプルリクエストのマージをブロックできる。 ブロックしたいコード品質の重大度レベルは指定できる。
これは使ったことがないのでわからないが、コード品質を自動で分析してもらえるという点では有用そう。
Automatically request Copilot code review(自動的にCopilotコードレビューを要求)

Request Copilot code review for new pull requests automatically if the author has access to Copilot code review and their premium requests quota has not reached the limit.
この設定を有効にすると、Copilot Code Reviewを利用している場合、プルリクエストの作成時に自動的にCopilot Code Reviewを要求できる。
この設定には追加設定がある。
Review new pushes

Copilot automatically reviews each new push to the pull request.
この設定を有効にすると、プルリクエストへの新しいプッシュごとにCopilotが自動でレビューする。
個人的にはプッシュごとにレビューを回す必要はないため、この設定は無効にしている。
Review draft pull requests

Copilot automatically reviews draft pull requests before they are marked as ready for review.
この設定を有効にすると、Copilotがドラフトのプルリクエストを自動でレビューする。
これは開発方針によるが、プルリクエストごとにCopilotによるレビューを回したいなら、この設定は有効にしておくとよい。


