はじめに
mainブランチに対してはhotfix等で変更入れることがちょくちょくあると思いますが、その時に気になるのがconflictです。
developブランチの変更をmainブランチに取り込む際、最新のmainブランチ変更を取り込むボタンはありますが、conflictの懸念は残ります。
本題
mainブランチに変更をマージした際、自動でmain←developのプルリクエストが立つよう定義しました。
具体的なフローとしては下記のようになります。
1.mainブランチに変更をマージ
2.main←developのプルリクエストが自動で作成される
3.mainブランチの変更者がプルリクエストを確認する
4.conflictの有無を確認・解消して承認
5.自動でdevelopに最新の内容が取り込まれる
実際のci.ymlは下記のようになりました。
name: reflect-main-to-develop
on:
workflow_dispatch:
pull_request:
types: [closed]
branches:
- main
jobs:
reflect-main-to-develop:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: main
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ <GitHub App ID> }}
private-key: ${{ <GitHub Appのアクセスキー> }}
- name: Check for differences between main and develop
id: diff-check
run: |
git fetch --all
if git diff --quiet origin/main origin/develop; then
echo "has_diff=false" >> $GITHUB_ENV
else
echo "has_diff=true" >> $GITHUB_ENV
fi
- name: Check for Existing PR
if: ${{ env.has_diff == 'true' }}
id: check-pr
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
PR_LIST=$(gh pr list --base develop --head main --json number --jq '.[]')
echo "PR List Output: $PR_LIST"
if [ -n "$PR_LIST" ]; then
echo "An existing PR has been found."
echo "pr_exists=true" >> $GITHUB_ENV
PR_NUMBER=$(echo $PR_LIST | jq -r '.number')
echo "existing_pr_number=$PR_NUMBER" >> $GITHUB_ENV
else
echo "No existing PR found."
echo "pr_exists=false" >> $GITHUB_ENV
fi
- name: Update Existing PR
if: ${{ env.has_diff == 'true' && env.pr_exists == 'true' }}
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git checkout develop
git merge origin/main --no-ff -m "Merge changes from main into develop"
git push origin develop
gh pr comment ${{ env.existing_pr_number }} --body "mainの変更を既存PRに反映しました。"
- name: Create Pull Request main2develop
if: ${{ env.has_diff == 'true' && env.pr_exists == 'false' }}
id: create-pr
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
PULL_REQUEST_URI=$(gh pr create -B develop -t 'develop <= main' -b "mainへの修正をdevelopにマージ" --label other --reviewer <レビュワーの名前>)
echo "::set-output name=pull_request_uri::$PULL_REQUEST_URI"
- name: Enable Auto Merge
if: ${{ env.has_diff == 'true' && env.pr_exists == 'false' }}
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
gh pr merge ${{ steps.create-pr.outputs.pull_request_uri }} --auto --merge
定義しておくことで、mainブランチに変更がマージされる度にプルリクエストが作成されます。
また、レビューを承認することで自動でマージが実行されるようになっています!便利!
終わりに
これでconflictの恐怖から解放されますね!レビューも楽々でございます!
それではみなさん楽しい開発ライフを!