Githubブランチ保護のススメ「「Branch protection rules」
はじめに
個人でコードを書くときに、ブランチの保護などをしっかり設定などをしていなかったので、
今回ブランチ保護に関する設定をしてみました。
まず最初にやりたかったことは、mainに対して直接pushの禁止です。
個人開発の際では、直接pushを避けてはいますが、
やろうと思えば、直接pushができてしまうので、設定をします。
想定としては、mainから開発ブランチを切って、そのブランチでPRを作り、
mainブランチにマージする一般的な開発の流れを想定して、設定します。
また、レビュワーなどおらず1人での開発の想定します。
設定手順
まずGithubの設定したいレポジトリを選択し、
一番右側の「Settings」を選択します。
するとレポジトリの設定が表示されるので、
「Code and automation」の「Branches」を選びます。
すると、「Branch protection rules」が出るので、右側にある「Add rule」を選択します。
Branch protection rulesの設定
次に設定項目が出ます。
最初に「Branch name pattern」に「main」を選択します。
その下に「Protect matching branches」があります。
ここで詳細なブランチ保護設定ができます。
設定項目は下記になります。
-
Require a pull request before merging(一致するブランチを保護)
- 一致するブランチに対して以下の保護ルールを適用します。
上記をチェックすると、オプションが表示されますが、
今回は、個人開発を想定しているので、レビュワーなどはいないため、未チェックにします。
レビュワーがいる場合は、状況に合わせてチェックした方が良いでしょう。
- 一致するブランチに対して以下の保護ルールを適用します。
-
Require status checks to pass before merging (マージ前にプルリクエストを必須にする)
- 有効にすると、すべてのコミットは保護されていないブランチで作成され、プルリクエストを通じてのみ保護されたブランチにマージすることができます。
-
Require status checks to pass before merging(マージ前にステータスチェックの合格を必須にする)
- どのステータスチェックがブランチにマージする前に合格する必要があるかを選択します。有効にすると、コミットはまず別のブランチにプッシュされ、ステータスチェックが合格した後に、保護されたブランチにマージまたは直接プッシュする必要があります。
status checksに合格した場合に、マージができるという設定です。今回は、status checksは作成していないので、チェックをつけていません。
- どのステータスチェックがブランチにマージする前に合格する必要があるかを選択します。有効にすると、コミットはまず別のブランチにプッシュされ、ステータスチェックが合格した後に、保護されたブランチにマージまたは直接プッシュする必要があります。
-
Require conversation resolution before merging(マージ前に会話の解決を必須にする)
- 有効にすると、保護されたブランチにプルリクエストをマージする前に、すべてのコードレビューで発生した会話が解決されている必要があります。
上記に関しても個人開発では、不要だと思われます。
- 有効にすると、保護されたブランチにプルリクエストをマージする前に、すべてのコードレビューで発生した会話が解決されている必要があります。
-
Require signed commits(署名付きコミットを必須にする)
- 一致するブランチにプッシュされるすべてのコミットは、検証済みの署名が必要です。
デジタル署名をしなければコミットできないようです。ここは設定しなくても良いでしょう。
- 一致するブランチにプッシュされるすべてのコミットは、検証済みの署名が必要です。
-
Require linear history (線形履歴を必須にする)
- マージコミットを禁止し、リニア(直線的)な履歴を維持します。
マージコミットを禁止できるようです。今回に関してはそこまで重要ではないと思っているので、これも設定はしません。
- マージコミットを禁止し、リニア(直線的)な履歴を維持します。
-
Require deployments to succeed before merging(マージ前にデプロイの成功を必須にする)
- どの環境へのデプロイが成功する必要があるかを選択します。有効にすると、指定された環境へのデプロイが成功するまでブランチをマージできません。
ここに関しては、自分の場合ではvercelにデプロイしているため、preview環境でのデプロイの成功すれば許可する設定を足しています。
- どの環境へのデプロイが成功する必要があるかを選択します。有効にすると、指定された環境へのデプロイが成功するまでブランチをマージできません。
-
Lock branch(ブランチをロックする)
- このブランチは読み取り専用になります。ユーザーはこのブランチに直接プッシュできません。
Lock branchを設定すると、mainブランチが、読み取り専用になるので、pushやPRでのマージなどができなくなります。
これを設定して、PRを出すと、「Cannot change this locked branch」と表示されるので、
今回では設定しません。
- このブランチは読み取り専用になります。ユーザーはこのブランチに直接プッシュできません。
-
Do not allow bypassing the above settings(上記設定のバイパスを許可しない)
- 上記の設定は、管理者や「ブランチ保護のバイパス」権限を持つカスタムロールにも適用されます。
これを設定することで管理者などに対しても適用できるため、今回のレポジトリの管理者は自分なので、この設定を付けます。
- 上記の設定は、管理者や「ブランチ保護のバイパス」権限を持つカスタムロールにも適用されます。
最終的に自分が設定したのは、
- Require a pull request before merging
- Require deployments to succeed before merging
- Do not allow bypassing the above settings
です。
あくまで一例なので、状況に合わせて変更してみて下さい。
設定した結果
実際にmainに対してpushしようとしてみます。
すると、「error: GH006: Protected branch update failed for refs/heads/main.」
と表示され、mainブランチに対してのpushは許可されません。
これで設定を完了できました。
もしmainブランチに反映したい場合は、開発ブランチを切り、そこからPRを出して、マージする必要があります。
また、Vercelでのデプロイが失敗した場合、PRがマージできなくなります。
こうすることで、より安全なブランチ運用ができるので、まだ未設定の場合は設定してみると良いと思います。
Discussion