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
    • これを有効にすると、プルリクエストをマージするまでの承認者の人数を設定できる
    • しかし、自分一人だけしか作業しない場合は、この項目を無効のままにする。自分自身が出したプルリクエストは自分自身で承認できないので、マージ作業が止まってしまう(下図ではチェックが入っているが空欄にする
  • Dismiss stale pull request approvals when new commits are pushed
    • これを有効にすると、1度承認したブランチに新しいコミットがなされた場合に、その承認を取り消す
  • Require review from Code Owner
    • これを有効にすると、コードオーナー(ここでは、つまり自分)のレビューが必須になる

Checked1

Require approvalsが無効、Require review from Code Ownerが有効のリポジトリにプルリクエストを出したときの様子

コードオーナーレビューが必須

実はこのままだと、管理者アカウント(ここでは、つまり自分)は全てのルールを貫通します。そのため、下の方にある「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
    • 「*」とするとプロジェクト内の全ファイルがレビュー対象になる
    • 「kokodake/*」等とすると「kokodake/」以下が対象になる
  5. commitしてリポジトリにpush
    • この時点で、ブランチを切らずにmainブランチでCODEOWNERSを作成し、かつプロテクションルールをすでに設定しているとpushがエラーになる
    • そのときは、一旦、プロテクションルールを削除するか、「Do not allow bypassing the above settings」を無効にする。これで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に失敗します。