Claude CodeをGitHub Actionsに組み込む実用ガイド — claude-code-action v1とheadless実行の使い分け
Claude CodeをGitHub Actionsに組み込む2つの主要パターン(anthropics/claude-code-action@v1公式アクションと、claude --bare -pによるheadless実行)の使い分け、認証、コスト試算、トラブルシューティングを実務目線でまとめます。
はじめに
Claude CodeをGitHub Actionsに組み込む方法は大きく2系統あります。本記事では両方のパターンを整理し、用途別の使い分けと、認証・コスト・トラブルシューティングの実務ノウハウを示します。
| 系統 | 何ができるか | 主な用途 |
|---|---|---|
公式アクション(anthropics/claude-code-action@v1) | PRコメント / Issue / workflow_dispatchを起点にClaude Codeセッションを起動 | コードレビュー、自動PR作成、Issue対応 |
Headless実行(claude --bare -p "...") | Bashステップ内で1ショット実行、結果を標準出力で受け取る | バッチ処理、定期スクリプト、独自workflow |
2025-08-26にv1.0がリリースされ、それ以前のv0.xの
mode:direct_prompt:allowed_tools:構文はdeprecated(後方互換は維持されますが新規はv1を推奨)。本記事はv1構文で書いています。v0.xからの移行は公式migration guide を参照。
「PRをトリガーに会話セッションを動かす」なら公式アクション、「コマンドラインの1ショット実行を定期的に回す」ならheadless、と分けると判断しやすくなります。
認証の準備(両系統共通)
GitHub ActionsからClaude Codeを呼ぶには、Claude Code OAuth TokenかAnthropic API Keyのどちらかが必要です。
Claude Code OAuth Token(Maxプラン推奨)
Maxプラン契約があれば、月額枠の中で実行できるためAPI従量課金が走りません。発行手順:
# ローカル環境で 1 回だけ実行
claude setup-token
# ブラウザで Anthropic にログイン → トークンが端末に表示されるトークンをGitHubリポジトリのSecretsに CLAUDE_CODE_OAUTH_TOKEN として登録します。
Anthropic API Key(Pro / 個人開発)
Anthropic Console でAPI keyを発行 → Secretsに ANTHROPIC_API_KEY として登録。Proプランの場合はクレジットを別途プリペイドする運用になります。
パターン1: 公式アクション(anthropics/claude-code-action@v1)
PRコメント・Issue・workflow_dispatchを起点に、Claude Codeに「PRをレビューして」「このIssueを対応して」のような自然言語指示を渡す経路です。
最小構成(v1構文)
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
prompt: |
この PR の変更を読み、コード品質と仕様準拠の観点でレビューしてください。
Must / Want / 良い点を分けてコメントしてください。
claude_args: |
--max-turns 5
--model claude-opus-4-7
use_sticky_comment: true重要なポイント:
- 認証は
claude_code_oauth_token(Maxプラン)またはanthropic_api_key(API key)。Bedrock / Vertex経由のみpermissions: id-token: writeが必要(OIDC認証用) - v1では
prompt:に指示を、claude_args:にCLI引数を渡す形式。v0.xのmode:/direct_prompt:/allowed_tools:はdeprecated claude_argsの中で--model--max-turns--allowedTools等を指定する。引数は通常のClaude Code CLIと同じuse_sticky_comment: trueで同じPRへの複数reviewが1つのコメントに集約される
よく使うイベント別の例
| イベント | 用途 | v1での起動方法 |
|---|---|---|
pull_request: [opened, synchronize] | PRレビュー自動化 | prompt: に明示指示 |
issue_comment: [created] | コメント @claude で起動 | trigger_phrase: "@claude"(prompt不要、コメント本文がそのままprompt) |
workflow_dispatch | 手動trigger(ボタン) | prompt: に指示、github.event.inputs で引数受け取り |
schedule (cron) | 定期実行(リリースノート自動生成等) | prompt: に指示、auto-detectで起動 |
v1では起動経路を mode: で分けず、トリガーイベントと prompt: / trigger_phrase: の組み合わせで自動判定されます。@claude メンションを使うIssue / PRコメント連携は trigger_phrase を指定するだけで成立します。
ガードレール
Claude Code公式アクションはエージェントが BashやWebFetchを使うため、想定外の操作を防ぐガードレールを設けるのが定石です。
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
prompt: |
...
claude_args: |
--allowedTools Bash,Edit,Read,Write,Grep,Glob
--disallowedTools WebSearch
# repository_dispatch のように外部 trigger を許す場合は allowed_bots を絞る
allowed_bots: "renovate[bot],dependabot[bot]"パターン2: Headless実行(claude --bare -p "...")
公式アクションを使わず、Bashステップ内でClaude Codeを直接呼ぶ方式です。出力をスクリプトで処理する自由度があります。
最小構成
name: Headless Claude
on:
schedule:
- cron: "0 0 * * *" # 毎日 UTC 0:00
workflow_dispatch:
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Claude Code
run: curl -fsSL https://claude.ai/install.sh | bash
- name: Run headless query
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
run: |
claude --bare -p "リポジトリの README.md を読んで、最近の変更点を 5 行でまとめて" > summary.txt
cat summary.txtclaude --bare -p の挙動:
--bare: Skills / Hooks / MCP / CLAUDE.md等の重い読み込みをスキップした最小ランタイムで起動(CIでは起動高速化)-p(--print): 1ショットで実行 → 標準出力に結果を出して終了- 標準入力からプロンプトを渡すパターンも可:
cat prompt.md | claude --bare -p
Headless実行が向く用途
| 用途 | 例 |
|---|---|
| 定期的なリポジトリ分析 | 「open Issueを読んで優先度をランキング」 |
| ドキュメント自動更新 | 「直近のcommitからCHANGELOGを更新」 |
| データ加工 | 「data/raw.json を読んで data/processed.csv に整形」 |
| 監視・通知 | 「依存パッケージのCVE情報を集約 → Slack通知」 |
会話セッションを開く必要がない、結果を標準出力で受け取る用途に最適です。
公式アクションvs Headlessの使い分け早見表
| 観点 | 公式アクション(@v1) | Headless(claude --bare -p) |
|---|---|---|
| 認証 | Secrets(Bedrock / Vertex経由のみOIDC) | Secrets |
| 起動経路 | PR / Issue / dispatch | Bashステップ内 |
| 結果受け取り | PR / Issueコメント | 標準出力 |
| 多段階セッション | ◎(Task toolでsub-agent / skill連携) | ✗(1ショット) |
| 自由度 | 中(actionのconfig範囲) | 高(Bashで何でも) |
| 学習コスト | 低 | 中(Claude Code自体に慣れが必要) |
| トークン消費の追跡 | execution-output.jsonで確認 | 自前で --json パース |
迷ったら公式アクションから始めるのが堅実です。後で「もっと自由度が欲しい」と思ったらheadlessへ降りる、という順序が多くのチームに合います。
コスト試算
GitHub Actionsのminutesはpublicリポジトリは無料、privateはplan別の枠 + 超過分 $0.008/min(Linux)。
Claude Code側のコストは:
- Maxプラン($100-200/月)経由: 月の利用枠内なら追加課金なし
- API key経由: 入出力トークン課金(Opusは高価)
サンプル試算(release-note自動生成パイプライン、1 run = 1記事):
| 項目 | 値 |
|---|---|
| 1 runのActions時間 | ~12分(Opus 4.7、最大値) |
| 1ヶ月のcron起動回数 | 4×/日 × 30日 = 120 run |
| Actions消費(public) | 0円(無料) |
| Actions消費(private、Linux) | ~12 × 120 = 1,440 min(Free枠2,000内) |
| Claude Maxプラン経由 | $100-200/月の枠内 |
実態としては「未処理0件 → skip」が大半で、検出のみで1.5分で終わるrunが多数。実消費はこの試算の半分程度になることが多い構成です。
よくあるトラブルシューティング
1. v0.xの mode: direct_prompt: allowed_tools: 構文を使うとdeprecated警告
v1.0(2025-08-26リリース)で構文が prompt: + claude_args: に変わっています。旧構文も後方互換で動きますが、@v1 環境ではdeprecation警告が出ます。新規workflowはv1構文で書き、既存は公式migration guide を参考に移行するのが堅実です。
2. ツール許可を絞りたい
claude_args: 内で --allowedTools / --disallowedTools を指定します。
claude_args: |
--allowedTools Edit,Read,Write,Grep,Glob
--disallowedTools WebSearch3. Bedrock / Vertex経由でOIDCエラー
use_bedrock: true / use_vertex: true を使う場合はOIDC認証のため permissions: id-token: write が必要です。デフォルトのAnthropic API key / OAuth token利用時は不要です。
4. Headless実行のOAuthトークンが切れる
claude setup-token で発行したトークンの有効期限が切れた場合、claude --bare -p が認証エラーで失敗します。Secretsを再発行してください。
5. ヘッドレスでSkill / Hookが走らない
--bare フラグを付けた場合の意図的な挙動です。Skill / Hookを使いたい場合は --bare を外して claude -p "..." で起動します(起動が遅くなる代わりに、CLAUDE.md / Skills / Hooksがすべて読まれる)。
まとめ
- PR / Issue / dispatch triggerは
claude-code-action@v1:prompt:+claude_args:構文で書く - 定期スクリプト / バッチは
claude --bare -p: 標準出力で結果を受け取る自由度 - Maxプラン経由なら追加課金なし: cronで日次自動化しても枠内で収まりやすい
- OIDCはBedrock / Vertex経由のときだけ必須: 通常のAPI key / OAuth tokenなら不要
- v0.xの旧構文はdeprecated: 新規workflowはv1で書く、既存はmigration guideで移行
GitHub Actionsに組み込むことで、Claude Codeを「対話セッション」から「サービスの一機能」に格上げできます。リリースノート自動生成、PRレビュー、依存パッケージ監視、CHANGELOG更新といった定期作業を任せる構成は、本記事の2系統のいずれかでカバーできます。最初は公式アクションから始め、自由度が足りなくなったらheadlessに降りる順序が、学習コストと運用コストのバランスを取りやすい現実的な進め方です。
関連:Claude Code Routinesによるクラウド自動化とHooks実例カタログを組み合わせると、PR起点の自動化が一段深まります。
関連する記事
Claude Code をもっと見る →Claude Codeでよくあるエラー10選 — 起動失敗から認証・MCP・権限まで実機で踏みやすい順に対処
Claudeを学ぶ1週間ロードマップ — 初日から実戦投入までの7日ガイド
MCPサーバを自作してClaude Codeにつなぐ — TypeScript実装の完全手順
Claude CodeのPro / Max / API従量、どれを選ぶか — コスト試算と選び方の判断ガイド
Anthropic Agent SDKでSlack常駐botを作る — 実装30分のミニチュートリアル
CursorからClaude Codeへの移行ガイド — 設定の引き継ぎから「Tab補完がない」問題までの実務手順
Agent SDK入門 — Python / TypeScriptで最小エージェントを組む
Claude Code Hooksの設定方法 — 初めて書く人の完全手順