やること
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
を利用しています。