ブランチ作成時に自動的にプルリクエストを作成する

投稿日: 2025-02-24(月)
タグ:

GitHub Actionsで記事の投稿を自動化において、PR作成については手動で行っている。 ただ、やってみるとこれも意外と手間なので、自動化することにした。

やりたいこと

  • GitHubに新しいブランチを push したタイミングで、新しいブランチから main ブランチへのPRを作成する
  • PRのタイトルは、新しいブランチのコミットメッセージ(の1行目)
  • PRはドラフトにする(作業中のブランチを把握しやすくするため)

ワークフロー

作成したワークフローは以下の通り。

name: Create draft pull requests on creating new branches

on:
  create

jobs:
  create_PR:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Create draft pull request
        env:
          GITHUB_TOKEN: ${{ github.token }}
          REPO: ${{ github.repository }}
        run: gh pr create -b main -H ${GITHUB_REF} -t "$(gh api repos/"${REPO}"/commits/"${GITHUB_SHA}" --jq '.commit.message' | head -n 1)"

create イベントはGitHub上のリポジトリに新しいGit参照(ブランチまたはタグ)が作成されたときに発生する。 このリポジトリでは現状タグを使用する想定がないため、作成されたGit参照がブランチか否かを判定する処理は入れていない。

PRのタイトルについては、 gh api コマンドでイベント発生時点のコミットからコミットメッセージを取得している。

ドラフトPRについては、 gh pr create コマンドの -d オプションが作成するPRをドラフトにする効果を持つが、これは以下のエラーにより失敗した。

pull request create failed: GraphQL: Draft pull requests are not supported in this repository. (createPullRequest)

原因は、個人アカウントのGitHub Freeプランでは、プライベートブランチでドラフトPRを作成することができないため(参考)。 ドラフトPRにより、作業中のPRがどれかわかるようにしておきたかったが、できないのであればしょうがない・・・

リポジトリのチェックアウトに必要な設定

ワークフローにおいて、リポジトリのチェックアウトを actions/checkout@v4 アクションで実行している。

プライベートリポジトリでは、GitHub Actionsでの実行を許可するアクション・ワークフローの範囲を選択する必要がある。 リポジトリの [Settings] - [Actions] - [General] の [Actions Permissions] で、以下の4つから選択する。

  1. すべてのアクション・再利用可能なワークフローを許可する
  2. アクションを無効化する
  3. 自身のリポジトリ内のアクション・再利用可能なワークフローを許可する
  4. 自身のリポジトリ内のものに加え、選択した条件にマッチするアクション・再利用可能なワークフローを許可する
    • 条件としては、「GitHubが作成したもの」「Verified Creatorが作成したもの」を選択できる

当初は3に設定していたが、以下のエラーにより失敗した。

error checking for existing pull request: GraphQL: Resource not accessible by integration (repository.pullRequests)

今回使用したいアクションは actions/checkout@v4 のみのため、GitHubが作成したアクションを追加で使用可能とするよう、上記の4で「GitHubが作成したもの」を許可する設定とした。

GitHub ActionsでPR作成するのに必要な設定

上記ワークフローでPRを作成しようとしたところ、以下のエラーにより失敗した。

pull request create failed: GraphQL: GitHub Actions is not permitted to create or approve pull requests (createPullRequest)

デフォルトでは、ワークフロー内でGitHub ActionsがPRを作成することは許可されていない(参考)。 リポジトリの [Settings] - [Actions] - [General] の [Workflow Permissions] で、「Allow GitHub Actions to create and approve pull requests」のチェックボックスをオンにする必要がある。

終わりに

新しいブランチの作成時に、自動的にPRを作成するワークフローを追加した。 そんなに複雑なワークフローではないが、プライベートリポジトリに起因する制約やハマりどころもあり、割と手間取ってしまった。 まあ、GitHub Actionsに慣れていけば、もう少しスイスイと作れるかな?

実際、このワークフローでPRを作る手間はなくなり、面倒がなくなってありがたい。 こうしたちょっとした面倒を改善する気持ちはいつでも持っていたいね。