🚫
main→developマージを禁止する方法
はじめに
今回は、GitHub上でmainブランチからdevelopブランチへの誤ったマージを防止する方法について解説します。具体的には、GitHub Actionsを活用して、誤ったマージを自動的に検知し、マージをブロックするワークフローを作成します。
この方法を学ぶことで、チーム開発における事故防止や開発フローの維持に役立てることができます。
実際にこのワークフローを試したリポジトリは以下です。
背景
チーム規模が大きくなってくると、事故防止策を図る必要性も上がってきます。
我々のチームはmainブランチが本番環境、developブランチが開発環境で、developブランチからmainブランチにマージすることで、本番環境へのデプロイが自動で走るようになっています。
しかし、過去にmain→developブランチの方向で誤ってマージをしてしまったことで、大惨事になってしまったことがあるので、このmain→developブランチのマージを禁止するワークフローを導入することにしました。
GitHub Actionsを使った解決策
GitHub Actionsを使って、特定のブランチ間でのマージを自動的に検知し、マージをブロックするワークフローを追加します。
実装手順
- ワークフローファイルの作成
.github/workflows/
ディレクトリに新しいYAMLファイル(例:prevent-main-to-develop.yml
)を作成します。 - ワークフローの設定
以下のように、プルリクエストが作成または更新されたときにトリガーされ、mainブランチからdevelopブランチへのPRを検知したらチェックを失敗させます。name: Prevent Merging from Main to Develop on: pull_request: branches: - develop jobs: check-merge-direction: if: ${{ github.base_ref == 'develop' && github.head_ref == 'main' }} runs-on: ubuntu-latest steps: - name: Fail if merging from main to develop run: | echo "Merging from 'main' to 'develop' is not allowed." exit 1
ワークフローの動作
- pull_requestイベントで、PRが開かれたときや更新されたときにトリガーします。
- github.base.refでPRのマージ先ブランチを取得します。
- github.head.refでPRのマージ元ブランチを取得します。
- 条件に合致しない場合(ブランチ方向が正しい場合)、ステップをスキップします。
- これによりジョブは実行されず、ランナー時間を節約できます。
- 条件に合致した場合(main→developのPR)、ステップを失敗(exit 1)させます。
マージのブロック
動作イメージ
-
実際に、mainブランチからdevelopブランチへのPRを作成すると、以下のようにチェックが失敗します。
- ワークフローが失敗すると、PR上にチェックの失敗が表示され、ブランチ保護設定ですべてのチェックがパスしないとマージできないようにしておくことで、誤ったマージを防止します。
実際にチエックが走ったPR
- ワークフローが失敗すると、PR上にチェックの失敗が表示され、ブランチ保護設定ですべてのチェックがパスしないとマージできないようにしておくことで、誤ったマージを防止します。
-
条件に合致しない場合(ブランチ方向が正しい場合)は、スキップされます。
- これによりジョブは実行されず、ランナー時間を節約できます。
実際にチエックが走ったPR
- これによりジョブは実行されず、ランナー時間を節約できます。
ブランチ保護設定の調整
さらに確実にするために、developブランチに対してブランチ保護設定を行います。(上記の例ではこの設定は行なっていません)
- ブランチ保護ルールの追加
リポジトリの「Settings」 > 「Branches」で、developブランチに対してブランチ保護ルールを追加します。 - 必要な設定
- Require status checks to pass before merging(マージ前にステータスチェックの合格を要求)
- 上記で設定したGitHub Actionsのワークフローを必須ステータスチェックに追加
まとめ
これからGitHubを活用した開発を進める方や、チーム開発の効率化を目指す方は、ぜひブランチ保護機能を積極的に取り入れてみてください!
Discussion