developマージ時にリリース一覧込みのリリースPRを作成

## 概要
リリース時に、リリース対象の洗い出しが大変なため自動で作りたいと思った。
developにPRがマージされるタイミングで
- develop to mainのPRがなければ
→PR作成とdevelopにマージしたPRのタイトルとリンクをbodyに入れる
- develop to mainのPRがあれば
既存PRのbodyにdevelopにマージしたPRのタイトルとリンクをbodyに追記

使用イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380959/c029fb41-4ef5-a531-3b98-8d7d2ab129bd.png)



## ワークフロー定義ファイル作成
下記のようにyamlファイルを配置する
`./.github/workflows/pr_to_main_on_develop_merge.yaml`
``` pr_to_main_on_develop_merge.yaml
name: Automate and Update Release PR

on:
  pull_request:
    types: [closed]
    branches:
      - develop

jobs:
  createOrUpdateReleasePR:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup GitHub CLI
        run: |
          if gh --version; then
            echo "GitHub CLI is already installed."
          else
            sudo apt update
            sudo apt install gh
          fi

      - name: Create or Update PR to Main
        env:
          GITHUB_TOKEN: ${{ secrets.CREATE_RELEASE_PR_TOKEN }}
        run: |
          PR_TITLE="${{ github.event.pull_request.title }}"
          PR_URL="${{ github.event.pull_request.html_url }}"

          # 既存のPRを検索
          existing_pr=$(gh pr list --base main --head develop --state open --json number --jq '.[0].number')

          if [ -z "$existing_pr" ]; then
            description=$(printf "PRs for Release:\n- [$PR_TITLE]($PR_URL)")
            # 新しいPRを作成し、説明にマージされたPRの情報を含める
            gh pr create --base main --head develop --title "Release PR from Develop to Main" --body "$description"
          else
            # 既存のPRの説明を取得
            existing_description=$(gh pr view $existing_pr --json body -q .body)
            # 既存のPRの説明を更新
            updated_description=$(printf "$existing_description\n- [$PR_TITLE]($PR_URL)")
            gh pr edit $existing_pr --body "$updated_description"
          fi
```


## 個人アクセストークン（PAT）の生成：
1. GitHubにログイン：まずGitHubにログインします。
1. 設定にアクセス：右上のプロフィール画像をクリックし、「Settings」を選択します。
1. Developer settingsに進む：画面の左側のメニューから「Developer settings」を選択します。
1. Personal access tokensに移動：「Personal access tokens」セクションを選択します。
1. 新しいトークンを生成：「Generate new token」ボタンをクリックします。
1. トークンの設定：
トークンに名前を付けます（例：「CREATE_RELEASE_PR_TOKEN」）。
必要なスコープ（権限）を選択します。通常、「repo」スコープが適切です。
「Generate token」をクリックしてトークンを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380959/c963cbe4-cfb8-a93b-9412-c45e6c01e286.png)
1. トークンをコピー：
生成されたトークンをコピーします。これは一度しか表示されないので、安全な場所に保存してください。

## GitHubリポジトリにトークンを追加：
1. リポジトリの設定にアクセス：GitHubで対象のリポジトリに移動し、「Settings」タブをクリックします。
1. Secretsに移動：左側のメニューから「Secrets」セクションを選択します。
1. 新しいシークレットを追加：「New repository secret」をクリックします。
1. シークレットの詳細を入力：
「Name」フィールドには、シークレットの名前を入力します（例：「CREATE_RELEASE_PR_TOKEN」）。
「Value」フィールドには、先ほどコピーしたトークンの値をペーストします。
「Add secret」をクリックしてシークレットを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380959/e6c3ce71-be37-7f16-8cf0-bb48c4a3d77a.png)


## 設定完了
この後に、developにPRがマージされるとリリースPRが作成されると思います。


## 試行錯誤したこと
### 毎回対象のPRを全て取得するアプローチ
PRのbodyを間違って消してしまったりすることを考慮して、対象のPRを毎度一から取得する方法がよさそうと考えました。
しかし[こちら](https://cli.github.com/manual/gh_pr_list)を確認したところ、下記ができそうになかったため膨大なPRを取得する可能性があると思ったため断念しました。
・mainの最新コミット以降の、PRマージを取得すること
・日時でフィルターをかけて取得

labelで取得すればできなくはなさそうであるが
- developにマージする時にlabelつけて
- mainにマージする時にlabel消す

をする必要がありGitHub Actionsが増えるし、label運用方法を周知したりすることが面倒そうなので諦めました。