GitHub Actionsでプルリクエストを作成する方法

GitHub Actions のワークフローを用いて、プルリクエスト作成工程を自動化する方法をまとめました。

はじめに

記事の存在意義

この記事を読み終わった後に、GitHub Actions のワークフローを経由で、プルリクエストを作成できるようになっていること。

記事を推したい読者様

任意のユースケースにおけるプルリクエストを作成する工程を、GitHub Actions を用いて自動化しようとしている人。

汎用的な作成方法

テストパス時やビルド・デプロイ完了時にプルリクエストを作成したり、追加でコミットをプッシュさせてからプルリクエストを作成したりなど、様々なユースケースに対応できる汎用的な方法です。
これは、万能 Action であるactions/github-scriptを用いる方法と、GitHub CLI のコマンドを用いる方法の二つがあります。

万能 Action を使う

actions/github-scriptは、GitHub でやりたいことをほぼ何でもできる万能 Action です。ゆえに、これを使えば大抵のユースケースに対応できます。しかし、それを実現するためのある程度の知識や技能が要求されることが唯一の難点です。

実装例

ブランチへのコミットプッシュ、または、プルリクエストの何らかのイベントで、プルリクエストを作成する実装例です。
なお、actions/github-scriptでプルリクエストを作成する場合、base や head のパラメータに指定する値は、ブランチの名前でなければいけません。
よって、値が refs から始まるgithub.refを使うことはできず、push イベントはgithub.ref_nameを、pull_request イベントはgithub.event.pull_request.head.refgithub.head_refでも可)を使う必要があります。
そのため、実装例ではgithub.event_nameに合わせて、プルリクエストの head となるブランチの名前の取得方法を変えています。イベントを固定できる場合は、実装例のようにする必要はありませんので、留意してください。

actions/github-script を用いる方法
jobs: raise_pull_request: runs-on: ubuntu-latest permissions: pull-requests: write contents: read steps: - name: Get a pull request head ref id: pull_request_head run: | case "${{ github.event_name }}" in "pull_request") echo "ref=${{ github.event.pull_request.head.ref }}" >> GITHUB_OUTPUT ;; "push") echo "ref=${{ github.ref_name }}" >> $GITHUB_OUTPUT ;; *) exit 1 ;; esac - name: Create a pull request uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const headRef = '${{ steps.pull_request_head.outputs.ref }}' const createParams = { owner: context.repo.owner, repo: context.repo.repo, base: 'main', head: headRef, title: `${headRef.substring(0,1).toUpperCase()}${headRef.substring(1)}` } const { data } = await github.rest.pulls.create(createParams) return data

パラメータ解説

github.rest.pulls.createで、使用頻度の高いパラメータの一覧は、以下の通りです。

名前必須か?説明
ownerはいレポジトリのアカウント所有者。大文字と小文字は区別されません。
repo.git拡張子なしのレポジトリ名。大文字と小文字は区別されません。
head変更が実装されるブランチ名。
base変更を取り込むブランチ名。
title作成するプルリクエストの題名。
bodyいいえプルリクエストの内容。
draftプルリクエストがドラフトであるか。

コマンドだけで実現する

外部 Action の使用制限があって、actions/github-scriptを使えない場合は、GitHub CLI のコマンドを用いる方法で解決します。積極的に利用する方法ではありませんが、覚えておくとどこかで役に立つかもしれません。

実装例

こちらも、ブランチへのコミットプッシュ、または、プルリクエストの何らかのイベントで、プルリクエストを作成する実装例です。github.refに関する注意事項は同じですので、詳細は前セクションをご覧ください。

GitHub CLI のコマンドを用いる方法
jobs: raise_pull_request: runs-on: ubuntu-latest permissions: pull-requests: write contents: read steps: - name: Get a pull request head ref id: pull_request_head run: | case "${{ github.event_name }}" in "pull_request") echo "ref=${{ github.event.pull_request.head.ref }}" >> GITHUB_OUTPUT ;; "push") echo "ref=${{ github.ref_name }}" >> $GITHUB_OUTPUT ;; *) exit 1 ;; esac - name: Checkout branch uses: actions/checkout@v4 with: ref: ${{ steps.pull_request_head.outputs.ref }} - name: Create a pull request env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh pr create -B main -t "Pull request title" -a "${{ github.actor }}"

特定の場合の作成方法

Actions 上で、新規または既存のブランチに対して、ファイル追加・編集・削除などのコミットをプッシュしてから、プルリクエストを作成するユースケースの場合、actions/github-scriptではなく、peter-evans/create-pull-requestを用いることで、より簡単に実現できます。
ただし、peter-evans/create-pull-requestは、上述のユースケース以外で用いようとしても、上手く動かないことに注意が必要です。

実装例

汎用的な方法と同じく、ブランチへのコミットプッシュ、または、プルリクエストの何らかのイベントで、プルリクエストを作成する実装例です。github.refに関する注意事項は同じですので、詳細は前セクションをご覧ください。
peter-evans/create-pull-requestは、変更があるファイルが存在すれば、コミットをプッシュしてプルリクエストを作成するまでを一つのステップで実行できます。しかし、一つのコミットにすべての変更をまとめたくない場合は、含めたくない変更だけを git コマンドでコミットしておく必要があります。

peter-evans/create-pull-request を用いる方法
jobs: raise_pull_request: runs-on: ubuntu-latest permissions: pull-requests: write contents: write steps: - name: Get a pull request head ref id: pull_request_head run: | case "${{ github.event_name }}" in "pull_request") echo "ref=${{ github.event.pull_request.head.ref }}" >> GITHUB_OUTPUT ;; "push") echo "ref=${{ github.ref_name }}" >> $GITHUB_OUTPUT ;; *) exit 1 ;; esac - name: Checkout branch uses: actions/checkout@v4 with: ref: ${{ steps.pull_request_head.outputs.ref }} - name: Make changes to pull request run: date +%s > report.txt - name: Create a pull request uses: peter-evans/create-pull-request@v6 with: base: 'main' branch: ${{ steps.pull_request_head.outputs.ref }} commit-message: Update report

パラメータ解説

peter-evans/create-pull-requestで、使用頻度の高いパラメータの一覧は、以下の通りです。

名前説明
branch変更が実装されるブランチ名。
base変更を取り込むブランチ名。
title作成するプルリクエストの題名。
bodyプルリクエストの内容。
draftプルリクエストがドラフトであるか。デフォルトはfalse
labelsコンマまたは改行で区切られたラベルリスト。
assigneesコンマまたは改行で区切られた担当者リスト。
reviewersコンマまたは改行で区切られたレビュワーリスト。
milestoneプルリクエストに関連付けるマイルストーンの番号。
commit-message変更をコミットする時に使用するメッセージ。
committerコミッタの名前とメールアドレス。デフォルトはGitHub Actions Bot。

おわりに

GitHub Actions でプルリクエストを作成する方法をいくつかまとめました。
ユースケースやご自身の環境に合わせて、この記事でご紹介した方法をご活用いただければ幸いです。

参考文献

GitHub Marketplace

GitHub

GitHub Actionsでプルリクエストを作成する方法

https://blog.chaotic-notes.com/articles/create-pull-request-by-github-actions/

作者

Hiroki Sugawara

投稿日

2024-10-21

更新日

2024-10-21

ライセンス