Branch protection rule でブランチを保護する

2023-05-19

はじめに

こんにちは。株式会社 Belong で SRE をしている shigwata です。

今回は、 GitHub の Branch protection rule について紹介します。

Branch protection rule とは、ブランチに対して設定できるルールのことです。例えば、master ブランチに対して、プルリクエストを必須にしたり、master ブランチにマージする際に、CI が通ることを必須にしたりすることができます。

Branch protection rule の設定

Branch protection rule の設定は、Github のドキュメントに従って設定します。

リポジトリの Settings から Branches を選択し、Add branch protection rule から設定ができます。

branch_protection_rules

Branch name pattern

保護ルールを適用するブランチを指定します。例えば、 master ブランチに対して設定したい場合は、 master と入力します。また、 release から始まるブランチを保護するには、fnmatch 構文release/* という パターンを指定することで設定できます。

Protect matching branches

現在、設定できる保護ルールは下記です。

  • Require a pull request before merging(マージ前に Pull Request レビュー必須)
    • Require approvals(マージ前に必要な承認回数)
    • Dismiss stale pull request approvals when new commits are pushed(新しいコミットがプッシュされたときに古い pull request 承認を却下する)
    • Require review from Code Owners(コードオーナーからのレビューが必要)
    • Restrict who can dismiss pull request reviews(pull request レビューを却下できるユーザーを制限)
    • Allow specified actors to bypass required pull requests(指定したアクターが必須 pull request をバイパスすることを許可)
    • Require approval of the most recent reviewable push(最新のレビュー可能なプッシュを要求する)
  • Require status checks to pass before merging(マージ前にステータスチェック必須)
    • Require branches to be up to date before merging(マージする前にブランチを最新の状態にする必要がある)
  • Require conversation resolution before merging(マージ前に会話の解決必須)
  • Require signed commits(署名済みコミット必須)
  • Require linear history(直線状の履歴必須)
  • Require merge queue(マージ キュー必須)
    • Merge method
    • Build concurrency
    • Merge limits
    • Only merge non-failing pull requests
    • Status check timeout
  • Require deployments to succeed before merging(マージの前にデプロイが成功する必要がある)
  • Lock branch(ブランチをロックする)
  • Do not allow bypassing the above settings(上の設定のバイパスを許可しない)
  • Restrict who can push to matching branches(一致するブランチにプッシュできるユーザを制限)
    • Restrict pushes that create matching branches(一致するブランチを作成するプッシュを制限する)
  • Allow force pushes(フォースプッシュを許可)
  • Allow deletions(削除を許可)

設定例

development ブランチを保護する設定例はこちらです。

belong-inc settings

設定内容

主な設定内容は下記です。

  • マージ前に 1 人以上のレビューが必要
    • レビューされていないコードのマージを防ぎます
  • 新しいコミットがプッシュされたときに古いプルリクエストの承認を却下
    • 承認後に不要なコミットが混ざるのを防ぎます
  • コードオーナーからのレビューが必要
    • CODEOWNERS ファイルを用意することでコードの責任者を指定できます
  • ブランチが最新の状態でステータスチェックに合格する必要がある
  • 管理者もルールに従う必要がある

このような設定をリポジトリ作成時に手動設定するのは大変なので、GitHub CLI を使ってコマンドを用意しています。

おわりに

Branch protection rule を設定することで、レビューされていないコードのマージを防ぐことができ、安全にブランチを運用することができます。ぜひ、設定してみてください。

現在、パブリックベータとして、Repository Rules が提供されています。Branch protection rule をより柔軟な設定ができるようになる後継機能となるようです。こちらも調査し試したいと思います。

弊社 Belong では一緒にサービスを育てるエンジニアを募集しています。 もし弊社に興味を持っていただけたら https://entrancebook.belonginc.dev/ をご覧いただけたら幸いです。