Githubリポジトリでブランチのプロテクトを有効にする

Githubリポジトリで、mainブランチへ直接pushできないようにします。

Githubリポジトリを見に行くと「あんたのmainブランチ、守られてないよ?」と言ったメッセージが以前から出ていたものの、何もせずに放置していたのですが、そろそろプロテクトを掛けようかな?と思い立ちました。

mainブランチへの直接pushを僕はやってしまいがちなのですが、ちゃんと作業ブランチを切ろうよとは常々思っているところでして。

Your main branch isn't protected

あなたのmainブランチは守られてないよメッセージ

プロテクションルールの公式ドキュメント

こちらになります

https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/managing-a-branch-protection-rule

プロテクションルールはどうしたか?

mainブランチにプロテクションを設定する前に、まずプロテクションルールを決めます。ルールはいくつか用意されており、その中から好きなルールを選んで適用させていくのですが、今回は次のルールを適用することにしました。

  1. mainブランチへ直接pushすることを禁止する
  2. コミットの適用は必ずプルリクエストにする
  3. プルリクエストの承認は一人だけにする
  4. 管理者権限のアカウントにもルールを適用する

プロテクションルールはどうやって作ったか?

ルールを作るために、Settings > Code and automation > Branches > Branch protection rulesと進み、Add branch protection ruleボタンを押します。

Branch protection rules

表示されたページで、Branch name patternに「main」と入力します。今回はmainブランチに対してルールを適用するので「main」と入力しますが、他のブランチにも適用する場合は正規表現のような形でブランチ名を入力します。

(例:productで始まるブランチ全てに適用する場合:product*)

次に、Protect matching branchesにある以下の項目にチェックを付けて有効にします。

  • Require a pull request before merging
    • これを有効にすると、コミットをマージするにはプルリクエストが必須になる
  • Require approvals
    • これを有効にすると、プルリクエストをマージするまでの承認者の人数を設定できる。ここでは自分一人だけしか作業をしないので1とした
  • Dismiss stale pull request approvals when new commits are pushed
    • これを有効にすると、1度承認したブランチに新しいコミットがなされた場合に、その承認を取り消す
  • Require review from Code Owner
    • これを有効にすると、コードオーナー(ここでは、つまり自分)のレビューが必須になる

Checked1

実はこのままだと、管理者アカウント(ここでは、つまり自分)は全てのルールを貫通します。そのため、下の方にある「Do not allow bypassing the above settings」にもチェックを付けて有効にします。これで、管理者アカウントにもプロテクションルールが適用されるようになります。

Checked2

そして、Createボタンを押してプロテクションルールを作成します。これでmainブランチに対してルールが適用されます。

しかし、最後にもう一つ作業だけがあります。コードオーナーの設定です。

コードオーナーの設定は、CODEOWNERSファイルを作成・編集してブランチに追加すればOKです。以下の手順で行います。

  1. 修正用のブランチを切る(例:add-codeowners-file)
  2. .githubフォルダ(ドットgithubフォルダ)をプロジェクトのルートに作る
  3. .githubにCODEOWNERSを作成
  4. CODEOWNERSを開いて「* @your-github-account」を入力して保存して閉じる
    • 例:* @imyme
  5. commitしてリポジトリにpush
    • この時点で、ブランチを切らずにmainブランチでCODEOWNERSを作成し、かつプロテクションルールをすでに設定しているとpushがエラーになります
    • そのときは、プロテクションルールを一旦削除してmainブランチに直接pushして、その後に再びプロテクションルールを設定してください

mainブランチのまま作業すると。。。

XXXX@XX  ~/RubyScripts/MyProject on main

$ ls -al

drwxr-xr-x  .git

-rw-r--r--   README.md

-rw-r--r--   my.rb

$ mkdir .github

$ vi .github/CODEOWNERS

    * @imyme <-入力

$ ls -al .github

-rw-r--r--  CODEOWNERS

$ git add -A

$ git commit -m "Add a owners file"

$ git push origin main

(中略)

remote: error: GH006: Protected branch update failed for refs/heads/main.

remote: error: At least 1 approving review is required by reviewers with write access.

To github.com:XXXXX/MyProject.git

! [remote rejected] main -> main (protected branch hook declined)

error: failed to push some refs to 'github.com:XXXXX/MyProject.git'

 

エラーが出て、mainブランチのpushに失敗します。

奇しくもプロテクションルールの確認ができました。