LoginSignup
0
Organization

【GitHub Actions】ブランチ間に差分が有った時に同期pull requestを発行する(baseブランチは新しく作成する)

やること

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

実行すると以下のようなPRが発行されます。
スクリーンショット 2023-05-17 23.47.24.png

解説

Count changes

このステップでは、ブランチ間の差分をカウントしています。
コメントの通り、これが0より大きい(= 差分が有る)場合のみPRを発行しています。

これをやっている理由は、develop -> qaのマージを行う都度、差分が無いのにPRが発行されることを防ぐためです。

一応同じようなことができるアクションも有るようでしたが、サンプルでは内部的な実績の有ったこの方法を利用しています。

Create sync branch

このステップでは、単純なgit操作でブランチ作成とプッシュを行なっています。
ここで、サンプルでは-C--force-create)オプションを利用しているため、既にブランチが存在する場合更新する挙動になります。

Create sync pull request

最後がPR発行部です。
ここではgit-pr-release-actionを利用しています。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0