develop←mainの自動化


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