🐙

GitHub Actionsでブランチ戦略をチェックをする

2022/05/24に公開

モチベーション

現在携わっているプロジェクトではフロントエンド、バックエンド、インフラのコードをそれぞれ別のGitHubリポジトリで管理しています。ややこしいことにリポジトリごとに微妙に異なるブランチ戦略を採用しているため、普段触っているリポジトリと違うリポジトリを触る時にブランチ戦略を間違えてしまうケースが発生していました。その度にレビューで指摘するのは指摘する方もされる方も気まずいものですし、レビュワーが見逃す可能性もあります。

そこでブランチ戦略を遵守しているかを自動でチェックする仕組みを作りました。

前提

例として以下のようなブランチ戦略を考えます。

ここで、以下のようなマージはブランチ戦略に違反しているとします。

  • main ブランチから production ブランチに直接マージする
  • feature ブランチを staging ブランチに直接マージする

つまり staging ブランチは main ブランチからしかマージしたくない、 production ブランチは staging ブランチからしかマージしたくないということです。

GitHub Actions Workflow

ブランチ戦略に違反しているプルリクエストが作られた時に起動して、プルリクエストにコメントしてから失敗するワークフローを作りました。

name: Check Branch Strategy

on:
  pull_request:
    branches:
      - staging
      - production

jobs:
  staging:
    name: Check staging merge
    runs-on: ubuntu-latest
    timeout-minutes: 10
    if: github.base_ref == 'staging' && github.head_ref != 'main'
    steps:
      - name: Comment
        uses: actions/github-script@v6
        with:
          script: |
            const message = "stagingブランチはmainブランチからマージしてください"
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: message
            })
      - run: |
          exit 1

  production:
    name: Check production merge
    runs-on: ubuntu-latest
    timeout-minutes: 10
    if: github.base_ref == 'production' && github.head_ref != 'staging'
    steps:
      - name: Comment
        uses: actions/github-script@v6
        with:
          script: |
            const message = "productionブランチはstagingブランチからマージしてください"
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: message
            })
      - run: |
          exit 1

これでブランチ戦略に違反しているプルリクエストではjobが起動しCIが失敗します。

今回は考慮していませんが、「hotfixの時だけは feature ブランチから production ブランチへのマージを許可したい」という場合は hotfix から始まるブランチ名の時は起動しないように if の条件を変更するなど、応用の余地はあるように思います。各チームのブランチ戦略に合わせて改良してみてください。

制限

mainstaging というブランチ戦略に違反していないプルリクエストを作った後に、 mainproduction というブランチ戦略に違反しているプルリクエストを作った場合、両方のステータスが失敗になってしまいます。

「同じコミットのCIのステータスは共有される」という仕様なのでしょうか?あまり頻繁に起きないケースだと思うので気にしないことにします。

Discussion