GitHub Agentic Workflows と通常の workflow を連携させたい

🖊
note

Agentic Workflows で何かしらの処理をした後に、その成果物に対してさらに GHA を動かしたいようなケースがある。わかりやすいところで言えば、Agentic Workflows でコードを変更したらテストが動いてほしいが、デフォルトでは Bot になるので、push をトリガーにする GHA (や外部サービス) が起動しない。

先にオチを書いておくと、2026/03/08 時点では用途にハマるものがなくて専用のユーザーの PAT を使い、通常のユーザーとして各種 Workflow などがトリガーされるようにした。

safe-outputs.dispatch-workflow

safe-outputs に次のようにすると、指定した workflow がトリガーできるようになる:

safe-outputs:
  dispatch-workflow:
    workflows: [test, lint]
    max: 2

prompt から必要に合わせて呼び出す、safe-outputs は許可リストで、指定したら必ず呼び出させるようなものではないので注意。

Dispatch both `test` and `lint` workflows using the `dispatch-workflow` safe output,
passing the PR branch name as `ref` input.

ref としてブランチ名を渡しているが、 create-pull-request の場合に safe-outputs の処理内で branch にランダムな suffix が追加されるため、この名前はそのまま使えずこれをヒントにブランチを特定したりする必要があった。

reusable workflow

workflow_on を使って reusable workflow として統合する形式で、今回やりたいことにはマッチしていそう。ドキュメントを読む限りでは needs.[job].outputs から issue や pr の情報が取れそうなのだが、現状これが取れなくてワークアラウンド的に途中に特定する job を挟んでいる。

name: Orchestrator

on:
  push:
    branches: [main]

jobs:
  run-agent:
    uses: ./.github/workflows/agent-task.lock.yml
    secrets: inherit

  find-pr:
    needs: run-agent
    runs-on: ubuntu-latest
    outputs:
      ref: ${{ steps.find.outputs.ref }}
    steps:
      - id: find
        run: |
          ref=$(gh pr list --repo "$GITHUB_REPOSITORY" --label documentation --state open --json headRefName --jq '.[0].headRefName // empty')
          echo "ref=$ref" >> $GITHUB_OUTPUT
        env:
          GH_TOKEN: ${{ github.token }}

  test:
    needs: find-pr
    if: needs.find-pr.outputs.ref != ''
    uses: ./.github/workflows/test.yml
    with:
      ref: ${{ needs.find-pr.outputs.ref }}

  lint:
    needs: find-pr
    if: needs.find-pr.outputs.ref != ''
    uses: ./.github/workflows/lint.yml
    with:
      ref: ${{ needs.find-pr.outputs.ref }}

Claude Code にコードを読んでもらった感じは以下の PR で対応が入っているが、出力される lock がそれを使うようになっていないんだとか、一旦できることがなさそうで修正待ちかという感じ。

この方法で branch に対してテストを走らせたりすることができるが、workflow が実行されるのはこの場合は main ブランチでなので、 commit や PR でテストを pass したことにはならない。

safe-outputs.github-token

そもそも Bot にしないというアプローチで、ユーザーが作ることになるので元々設定されている workflow が全部そのまま動く。

safe-outputs:
  github-token: ${{ secrets.USER_GH_TOKEN }}

output 毎に個別に設定することもできるが、自分が試したときはうまくいかなくて全体に設定してしまった。CodeRabbit が Bot だとデフォルトでは動かないみたいな話もあって、プライベートリポジトリに関してだけいえばこれで一旦良いかなとなった。

yaakai.to