GitHub Actionsでブランチ戦略をチェックをする
モチベーション
現在携わっているプロジェクトではフロントエンド、バックエンド、インフラのコードをそれぞれ別の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
の条件を変更するなど、応用の余地はあるように思います。各チームのブランチ戦略に合わせて改良してみてください。
制限
main
→ staging
というブランチ戦略に違反していないプルリクエストを作った後に、 main
→ production
というブランチ戦略に違反しているプルリクエストを作った場合、両方のステータスが失敗になってしまいます。
「同じコミットのCIのステータスは共有される」という仕様なのでしょうか?あまり頻繁に起きないケースだと思うので気にしないことにします。
Discussion