クローズしたPRのブランチをGitHub Actionsで自動的に削除する

GitHub で PR のクローズ時にブランチを自動削除するワークフローを作成しました。この記事ではそのワークフローを紹介します。

GitHub で開発していると、PR をマージせずにクローズする機会は多いと思います。この時、クローズした PR のブランチは自動的に削除されません。ブランチを削除しないまま PR をクローズし続けると、「いざ PR を出すぞ」と push すると古いブランチと衝突してブランチを切り直す手間が増えてくるでしょう。

とはいえ、自動化が必要なほどの手間ではありません。自分の管理するレポジトリでは気づいたときに他の人の分も自分がポチポチしており、そこまで課題は感じていませんでした。しかし他レポジトリで PR のクローズ時に必ずブランチを削除することとなり、自動化を試してみました。

ワークフローの実装

以下が実際のワークフローです。

name: "ブランチ削除"
on:
  pull_request:
    types:
      - closed

permissions:
  contents: write

jobs:
  delete-branch:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == false
    steps:
      - uses: actions/checkout@v3
      - name: delete unmerged branch
        run: |
            git push origin --delete "${{ github.head_ref }}"

delete-branch-if-closed/.github/workflows/actions.yml at main · no-yan/delete-branch-if-closed · GitHub

シンプルですが、PR のマージ時に起動させない部分だけはわかりにくいかもしれません。

このワークフローは PR がクローズされた時に起動します。正確にいうと、PR をマージせずクローズした時と、PR をマージした時にも起動します*1。今回の要件でマージ時にブランチを削除する必要はないため、ジョブが起動しないように設定しています。

on:
  pull_request:
    types:
      - closed
jobs:
  delete-branch:
    if: github.event.pull_request.merged == false

GitHub Actions はジョブごとに課金されるため、不必要なときはジョブを起動しないことで課金額を抑えています。

まとめ

GitHub Actions でPRのクローズ時に自動でブランチを削除する方法について説明しました。こういったケースは自分なら自動化しないですが、こうして記事にしておくと役立ててくれる人がいるのかもしれませんね。

*1:PRはマージするかマージせずクローズするものというメンタルモデルがある人だと、この挙動に当惑するかもしれません