1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

develop←mainの自動化

Last updated at Posted at 2024-12-04

はじめに

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の恐怖から解放されますね!レビューも楽々でございます!
それではみなさん楽しい開発ライフを!

1
1
0

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
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?