GitHub Actionsで自動でPull Requestを作った
課題
弊社では、開発プロセスの中心として develop ブランチを使用しています。新機能開発やバグ修正が終わり、それらが一定期間のテスト(QA期間)に入るタイミングで、develop ブランチから release-v1.0.0 のような形式のリリースブランチを作成し、QA環境へデプロイします。QA期間中にバグが見つかった場合、その修正はリリースブランチ(例: release-v1.0.0)に対して行われます。
具体的なフロー例:
- 開発フェーズ: develop ブランチで新機能の開発やバグ修正を行います。
- QA準備: QA期間に入る際、develop ブランチから release-v1.0.0 といった命名規則を持つリリースブランチを作成し、QA環境にデプロイします。
- バグ修正: QA期間中にバグが発見された場合、issue_500 のようなブランチを作成して修正を行い、その後 release-v1.0.0 にマージします。
- developブランチへの反映: release-v1.0.0 ブランチに対する修正が完了したら、その変更を develop ブランチにも反映させるためのPull Requestを作成します。
この最後のステップであるリリースブランチから develop ブランチへのPull Requestの作成を人の手で行っていましたが、この作業を忘れてしまうことが課題となっています。
解決方法
releaseブランチ → developブランチへのPull Requestを自動で作成するGitHub Actionsを作成しました。
またreleaseブランチがバージョンアップで変わってしまったとしても、環境変数で設定することで、動的に動くようにしました。
name: Auto PR from release to develop
on:
push:
branches:
- 'release-v*'
jobs:
create-pr:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Get release branch name
id: get_branch
run: echo "RELEASE_BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
- name: Create PR to develop
uses: repo-sync/pull-request@v2
with:
source_branch: ${{ env.RELEASE_BRANCH_NAME }}
destination_branch: "develop"
github_token: ${{ secrets.GITHUB_TOKEN }}
pr_title: "Merge ${{ env.RELEASE_BRANCH_NAME }} into develop"
pr_body: "This PR was auto-generated to merge ${{ env.RELEASE_BRANCH_NAME }} into the develop branch."
-
Checkout: actions/checkout@v2 アクションを使って、リポジトリのコードをチェックアウトします。これにより、後続のステップでリポジトリのコードにアクセスできるようになります。
-
Get release branch name: GITHUB_REF 環境変数から現在のブランチ名を抽出し、RELEASE_BRANCH_NAME という名前の新しい環境変数に格納します。GITHUB_REF は、アクションがトリガーされたリファレンス(例:refs/heads/release-v1.0.0)を保持します。${GITHUB_REF#refs/heads/} はシェルパラメータ展開を使用して、refs/heads/ プレフィックスを削除し、純粋なブランチ名を取得します。結果は GITHUB_ENV に書き込まれ、後続のステップで使用できるようになります。
-
Create PR to develop: repo-sync/pull-request@v2 アクションを使用して、環境変数 RELEASE_BRANCH_NAME で指定されたリリースブランチから develop ブランチへのプルリクエストを作成します。このステップでは、github_token にGitHubが自動的に生成する GITHUB_TOKEN シークレットを使用して認証を行います。このトークンは、リポジトリ内での様々な操作(PRの作成など)を行うための権限を持っています。また、プルリクエストのタイトルと本文は、それぞれ pr_title と pr_body で設定されており、自動生成された内容を反映します。
参考
Discussion