テック技報最新号へ →
コード

GitHub Actions: tagpr の plan / apply モードで「タグを打つ前にテストと承認」を挟む

tagpr v1.22.0 で実験的な mode: plan / mode: apply が入った。リリース PR をマージしてもすぐタグを打たず、マージされたコミットをテストし、保護された environment の承認を通ってからタグを打てる。

@songmu · 投稿 2026-11-03
#github-actions#release#tagpr#ci

使う場面

tagpr(リリース PR を自動で作り、マージされたらタグを打つツール)を使っていて、「マージ後のコミットでもう一度テストしたい」「タグを打つ(=リリースが走る)前に人の承認を入れたい」とき。従来の既定(auto)は、マージを検出した時点でタグを打つ。

やり方

ジョブを 3 つに分ける。

  1. plan: mode: plan で tagpr を動かす。リリース PR の作成・更新はいつも通り行い、マージ済みのリリース PR を見つけたときだけ、タグを打たずに plan 出力(JSON)を出す。JSON には tag(予定のタグ)、commit_sha(マージされたコミット)、base_tag、pull_request_number などが入る。
  2. test-release: plan が空でないときだけ動かし、fromJSON(needs.plan.outputs.plan).commit_sha をチェックアウトしてテストする。
  3. apply: テストが成功したら、承認が必要な environment(例: release)の中で mode: apply を動かし、plan に plan ジョブの出力をそのまま渡す。tagpr はリポジトリの状態と照らし合わせて確認してからタグを打つ。
yaml
jobs:
  plan:
    runs-on: ubuntu-latest
    outputs:
      plan: ${{ steps.plan.outputs.plan }}
    steps:
    - uses: actions/checkout@v6
    - id: plan
      uses: Songmu/tagpr@v1
      with:
        mode: plan
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  test-release:
    needs: plan
    if: needs.plan.outputs.plan != ''
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6
      with:
        ref: ${{ fromJSON(needs.plan.outputs.plan).commit_sha }}
    - run: go test ./...

  apply:
    needs: [plan, test-release]
    if: needs.plan.outputs.plan != '' && needs.test-release.result == 'success'
    runs-on: ubuntu-latest
    environment: release   # ここで承認待ちになる
    steps:
    - uses: actions/checkout@v6
    - uses: Songmu/tagpr@v1
      with:
        mode: apply
        plan: ${{ needs.plan.outputs.plan }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

(上は流れが分かるように縮めたもの。公式ガイドの完全な例は GitHub App のトークンを使い、permissions も細かく指定している。)

注意点

  • 実験的機能。 plan / apply モードと JSON の形式は今後変わる可能性があると README に明記されている。
  • 承認待ちの間に main が進んでもよいが、対象のコミットはリリースブランチの祖先である必要がある。
  • 公式ガイドの例は concurrency に cancel-in-progress: false を指定し、承認待ちの実行を残したまま、後から来た main への push を 1 つの待ち行列にまとめている。
  • GITHUB_TOKEN で打ったタグは別のワークフローを起動しない。タグをきっかけに別のリリースワークフローを動かすなら GitHub App のトークンを使う(README の説明)。公式例が apply ジョブの中でトークンを作っているのは、承認後に初めてトークンが発行されるようにするため。
  • tagpr をモノレポで使う設定は GitHub Actions: actions/labeler でディレクトリ別ラベルを付け、モノレポのリリースノートを絞る(tagpr) を参照。

出典

X の元の投稿を開く