🚫

main→developマージを禁止する方法

2024/10/08に公開

はじめに

今回は、GitHub上でmainブランチからdevelopブランチへの誤ったマージを防止する方法について解説します。具体的には、GitHub Actionsを活用して、誤ったマージを自動的に検知し、マージをブロックするワークフローを作成します。

この方法を学ぶことで、チーム開発における事故防止や開発フローの維持に役立てることができます。

実際にこのワークフローを試したリポジトリは以下です。
https://github.com/sousquared/practice-main2develop-merge-protection

背景

チーム規模が大きくなってくると、事故防止策を図る必要性も上がってきます。
我々のチームはmainブランチが本番環境、developブランチが開発環境で、developブランチからmainブランチにマージすることで、本番環境へのデプロイが自動で走るようになっています。
しかし、過去にmain→developブランチの方向で誤ってマージをしてしまったことで、大惨事になってしまったことがあるので、このmain→developブランチのマージを禁止するワークフローを導入することにしました。

GitHub Actionsを使った解決策

GitHub Actionsを使って、特定のブランチ間でのマージを自動的に検知し、マージをブロックするワークフローを追加します。

実装手順

  1. ワークフローファイルの作成
    .github/workflows/ディレクトリに新しいYAMLファイル(例: prevent-main-to-develop.yml)を作成します。
  2. ワークフローの設定
    以下のように、プルリクエストが作成または更新されたときにトリガーされ、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
  • 条件に合致しない場合(ブランチ方向が正しい場合)は、スキップされます。

ブランチ保護設定の調整

さらに確実にするために、developブランチに対してブランチ保護設定を行います。(上記の例ではこの設定は行なっていません)

  1. ブランチ保護ルールの追加
    リポジトリの「Settings」 > 「Branches」で、developブランチに対してブランチ保護ルールを追加します。
  2. 必要な設定
  • Require status checks to pass before merging(マージ前にステータスチェックの合格を要求)
  • 上記で設定したGitHub Actionsのワークフローを必須ステータスチェックに追加

まとめ

これからGitHubを活用した開発を進める方や、チーム開発の効率化を目指す方は、ぜひブランチ保護機能を積極的に取り入れてみてください!

Discussion