やること
GitHub Actionsで、qaブランチに変更が有った時に、developブランチへの同期PRを発行します。
この記事で紹介する方法ではbaseブランチが新しく作成されるため、主要なブランチが保護されるという利点が有ります。
baseブランチの新規作成が不要な場合、sync-branchesアクションを利用する方が簡単です(この場合CONTENT_COMPARISON = trueでの運用がおすすめです)。
baseブランチを作成する理由
態々WFを複雑化させてまでbaseブランチを作成するやり方を採用したのは、qaブランチへの意図せぬ変更を防ぐためです。
今回紹介するWFを利用しているプロジェクトでは、基本的にdevelopブランチ(デフォルト)で検証したものをqaブランチに反映し、特別な場合だけqa -> developの反映を行う運用をしています。
ここで、不用意にUpdate branchしてしまった結果、未検証の内容がqaブランチに混入する事故がありました。
そこで、baseブランチを作成することで、誤操作が有ってもqaブランチに被害が出ないようにしています。
サンプルコード
WFのサンプルは以下の通りです。
name ~ envのセクションを適切に書き換え、リポジトリの権限設定を行えば、コピペで動きます。
注意点として、このWFはqaブランチへPRでのマージが1件以上行われていなければ失敗する(= 直コミットしたような場合に非対応の)ようでした。
name: "qa -> dev"
on:
push:
branches:
- qa
env:
FROM_BRANCH: qa
TO_BRANCH: develop
SYNC_BRANCH: sync/qa2dev # ブランチが更新された時に影響させない & update branchボタンによる事故を避けるためにFROM_BRANCHから作成するブランチの名前
jobs:
sync-branches:
runs-on: ubuntu-latest
permissions:
# ブランチを作成するので write 権限が必要
contents: write
pull-requests: write
steps:
# セットアップ
- uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ env.FROM_BRANCH }}
# Originの差分をチェック(後続で値を参照し、0 = 差分無しなら実行しない)
- name: Count changes
id: count-changes
run: echo "count=$(git diff origin/${{ env.TO_BRANCH }}...origin/${{ env.FROM_BRANCH }} --name-only | wc -l)" >> $GITHUB_OUTPUT
# ブランチ作成
- name: Create sync branch
id: create-sync-branch
if: steps.count-changes.outputs.count > 0
run: |
git config user.email "actions@github.com"
git config user.name "Github Actions"
branch=${{ env.SYNC_BRANCH }}
git switch -C $branch
git push origin $branch
# PR作成
- name: Create sync pull request
id: create-sync-pull-request
if: steps.count-changes.outputs.count > 0
uses: bakunyo/git-pr-release-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GIT_PR_RELEASE_BRANCH_STAGING: ${{ env.SYNC_BRANCH }}
GIT_PR_RELEASE_BRANCH_PRODUCTION: ${{ env.TO_BRANCH }}
TZ: Asia/Tokyo
解説
Count changes
このステップでは、ブランチ間の差分をカウントしています。
コメントの通り、これが0より大きい(= 差分が有る)場合のみPRを発行しています。
これをやっている理由は、develop -> qaのマージを行う都度、差分が無いのにPRが発行されることを防ぐためです。
一応同じようなことができるアクションも有るようでしたが、サンプルでは内部的な実績の有ったこの方法を利用しています。
Create sync branch
このステップでは、単純なgit操作でブランチ作成とプッシュを行なっています。
ここで、サンプルでは-C(--force-create)オプションを利用しているため、既にブランチが存在する場合更新する挙動になります。
Create sync pull request
最後がPR発行部です。
ここではgit-pr-release-actionを利用しています。
