- AI ⚙️
Claude Code GitHub Actions連携|YAML雛形と入力一覧
Claude Code の GitHub Actions 連携とは、anthropics/claude-code-action@v1 をワークフローに置き、Issue や PR の @claude への応答・PR の自動レビュー・定期実行などをリポジトリの中で動かす仕組みです。 必要なのは「Claude GitHub App のインストール」「認証用シークレット1つ」「ワークフロー YAML 1枚」の3点です。
この記事では、そのまま .github/workflows/ に置ける YAML を用途別に4本、入力パラメータ12種の日本語表、beta から v1 への対応表、ジョブごとの最小 permissions、「誰が起動できるか」の判断表、費用の上限のかけ方までを1ページにまとめます。
確認環境:Claude Code Docs(code.claude.com/docs)と anthropics/claude-code-action の docs(usage.md・migration-guide.md・security.md)を2026年10月7日に開いて確認。掲載した YAML は Python 3.11.15 + PyYAML 6.0.3 と actionlint 1.7.12 で構文を確認し、git の操作は git 2.43.0 で実行しています。
Claude Code GitHub Actions 連携の早見表
| やりたいこと | 置くファイル | 起動のきっかけ | prompt |
|---|---|---|---|
@claude に応答させる |
claude.yml |
Issue・PR のコメント | なし |
| PR を自動レビューする | claude-code-review.yml |
PR の作成・更新 | あり |
| 毎朝レポートを作る | claude-daily-report.yml |
cron・手動 | あり |
| 自作スキルを動かす | claude-changelog.yml |
手動 | あり |
| 決めること | 選択肢 | 目安 |
|---|---|---|
| 認証 | APIキー / OAuthトークン / OIDC連携 | 個人はOAuth、組織共有はAPIキーかOIDC |
| 権限 | ジョブの permissions |
読むだけなら read、書き込むジョブだけ write |
| 費用の上限 | --max-turns・timeout-minutes・concurrency |
3つとも入れる |
| バージョン | @v1 |
@beta の入力名は v1 で置き換え |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Claude Code GitHub Actions連携|YAML雛形と入力一覧」
仕組みを先に押さえる:prompt の有無で動き方が決まる
claude-code-action は、ワークフローの書き方から動き方を自動で判断します。v1 では mode という入力は無くなり、prompt を書くかどうかで次の2つに分かれます。
| モード | 条件 | 動き | 結果の出る場所 |
|---|---|---|---|
| 対話(interactive) | prompt なし |
トリガーフレーズ(既定 @claude)を待って応答 |
元の Issue・PR のコメント |
| 自動(automation) | prompt あり |
メンションを待たずに実行 | 既定ではワークフローの実行ログ |
対話モードが反応するのは、Issue や PR のコメント、PR レビュー、新しく開かれた Issue の本文とタイトルに含まれるトリガーフレーズです。自動モードでは、プロンプトで投稿を指示し、かつ投稿できるツールを許可したときに限り、Issue や PR にコメントが付きます(後述の PR レビューの YAML がその例です)。
flowchart TD
A[GitHub のイベント発生] --> B{起動した人は bot か}
B -- "bot で allowed_bots に無い" --> X[実行しない]
B -- "人、または許可した bot" --> C{Issue・PR 系のイベントか}
C -- はい --> D{write 権限があるか}
D -- いいえ --> X
D -- はい --> E{prompt を指定したか}
C -- "schedule など" --> E
E -- なし --> F["対話モード: @claude を待って応答"]
E -- あり --> G["自動モード: すぐ実行しログに出力"]
セットアップの手順
準備の方法は2通りあります。どちらもリポジトリの管理者権限が必要です。
| 方法 | 手順 | 向いている場面 |
|---|---|---|
| かんたん設定 | Claude Code で /install-github-app を実行 |
手元で Claude Code を使っている |
| 手動設定 | App 導入 → シークレット登録 → YAML を置く | ワークフローを自分で管理したい |
かんたん設定(/install-github-app)
- GitHub CLI を入れて
gh auth loginで認証しておく - 連携したいリポジトリで
claudeを起動し、/install-github-appを実行する - 案内に沿って進めると、Claude GitHub App の導入、シークレットの保存、ワークフローを載せたブランチの push までが行われ、ブラウザで PR 作成画面が開く
- その PR を作成してマージすると
@claudeが使えるようになる
保存されるシークレット名は、API キーなら ANTHROPIC_API_KEY、サブスクリプションのトークンなら CLAUDE_CODE_OAUTH_TOKEN です。このコマンドは github.com のリポジトリが対象です。
手動設定
- Claude GitHub App をリポジトリにインストールする
- リポジトリの Settings → Secrets and variables → Actions に、次のどちらかを登録する
ANTHROPIC_API_KEY:Claude Console で発行した API キーCLAUDE_CODE_OAUTH_TOKEN:手元でclaude setup-tokenを実行して作る OAuth トークン(Pro・Max・Team・Enterprise プラン)
- 次の章の YAML を
.github/workflows/に置く - Issue か PR のコメントで
@claudeと書いて動作を見る
コピペ用ワークフロー YAML 4種
4本とも permissions を必要な分だけにし、timeout-minutes・concurrency・--max-turns で1回あたりの上限を入れてあります。OAuth トークンで認証する場合は、anthropic_api_key の行を次の1行に置き換えてください。
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
1. @claude メンションに応答する(claude.yml)
Issue や PR のコメントに @claude と書くと、Claude が同じ場所に返信し、作業の進み具合をそのコメントに更新していきます。
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
concurrency:
group: claude-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: false
jobs:
claude:
if: contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
actions: read
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_args: |
--max-turns 20
| 行 | 役割 |
|---|---|
if: contains(...) |
@claude を含まないコメントではランナーを起動しない。アクション側でもトリガーフレーズを確認する |
id-token: write |
アクションが既定で使う GitHub App 認証に必要 |
actions: read |
PR の CI 結果を Claude が読めるようにする |
actions/checkout |
Claude が作業するためのリポジトリの写しを用意する |
concurrency |
同じ Issue・PR では1本ずつ順番に動かす |
コメントの書き方の例です。
@claude この Issue の内容に沿って実装してください
@claude このエンドポイントの入力チェックはどう書くのがよいですか
@claude 一覧画面で出ている TypeError を直してください
@claude への応答では、Claude は新しいブランチにコミットし、PR 作成ページへのリンクを返します。PR を作るボタンを押すのは人です。
2. PR を自動レビューする(claude-code-review.yml)
plugin_marketplaces と plugins で code-review プラグインを入れ、そのスキルを prompt で呼びます。
name: Code Review
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
concurrency:
group: claude-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
review:
if: >-
github.event.pull_request.draft == false &&
github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
plugin_marketplaces: "https://github.com/anthropics/claude-code.git"
plugins: "code-review@claude-code-plugins"
prompt: "/code-review:code-review --comment ${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
claude_args: |
--max-turns 15
--allowedTools "mcp__github_inline_comment__create_inline_comment"
レビューの出力先は次の2行で決まります。
| 行 | 働き |
|---|---|
--comment |
見つけた点ごとにインラインコメントを付ける。指摘が無ければまとめのコメントを1件。外すと結果は実行ログだけに出る |
--allowedTools "mcp__github_inline_comment__..." |
インラインコメントを投稿する MCP サーバーは、claude_args の --allowedTools に名前があるときだけ起動する |
plugins の書式は プラグイン名@マーケットプレイス名 です。マーケットプレイス名はリポジトリの URL ではなく、マーケットプレイス自身のマニフェストに書かれた名前を使います。
Claude 側でも、ドラフトやクローズ済みの PR、レビュー不要と判断した PR(自動生成のものやごく小さなもの)、すでに Claude のコメントがある PR は対象から外します。上の if は、その前の段階でランナーの起動自体を省くためのものです。cancel-in-progress: true により、同じ PR に続けて push したときは最新の1本だけが残ります。
3. cron で定期レポートを作る(claude-daily-report.yml)
prompt を付ければ、cron を含むどのイベントでも自動モードで動きます。次の例は平日の日本時間 9:00(UTC 0:00)にコミットと Issue を要約し、実行ログに出します。
name: Daily Report
on:
schedule:
- cron: "0 0 * * 1-5"
workflow_dispatch:
concurrency:
group: claude-daily-report
cancel-in-progress: false
jobs:
report:
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
issues: read
id-token: write
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: "昨日のコミットと、開いている Issue を日本語で要約してください。見出しは「コミット」「Issue」「次に見るとよい点」の3つにしてください。"
claude_args: |
--max-turns 10
--model claude-sonnet-5
--allowedTools "mcp__github__list_commits,mcp__github__list_issues"
押さえておく点は3つです。
- 文章のプロンプトでは、許可したツールだけが使えます。 シェルや GitHub API を使わせるには、
claude_argsの--allowedToolsか、settings入力のpermissions.allowで必要なツールを渡します。この例は GitHub MCP の2つのツールでコミットと Issue を読むため、checkout のステップを省いています。 - スケジュール実行は既定ブランチのワークフローだけが対象です。公開リポジトリでは、リポジトリに動きが無い状態が60日続くとスケジュールが止まります。
- cron は UTC で書きます。 日本時間の 9:00 は UTC の 0:00 です。
--model を省くと、Claude Code の既定モデルが使われます。
4. リポジトリ内のスキルを prompt で実行する(claude-changelog.yml)
リポジトリの .claude/skills/ に置いたスキルは、先に actions/checkout を実行してから prompt に /スキル名 を渡すと動きます。まずスキル本体です。
.claude/skills/changelog-draft/SKILL.md
---
name: changelog-draft
description: 直近のタグから HEAD までのコミットを読み、変更履歴の下書きを日本語で作る
disable-model-invocation: true
allowed-tools: Bash(git describe *) Bash(git log *) Bash(git tag *)
---
直近のタグから HEAD までの変更履歴の下書きを作ってください。
1. `git describe --tags --abbrev=0` で直近のタグを調べる
2. `git log <直近のタグ>..HEAD --oneline --no-merges` でコミットを一覧にする
3. コミットを「追加」「変更」「修正」「その他」に分け、Markdown の箇条書きで出力する
4. ファイルは編集しない。分類に迷ったコミットは「その他」に入れ、理由を1行添える
.github/workflows/claude-changelog.yml
name: Changelog Draft
on:
workflow_dispatch:
concurrency:
group: claude-changelog
cancel-in-progress: true
jobs:
changelog:
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: "/changelog-draft"
claude_args: |
--max-turns 10
スキルを呼ぶ場合、Claude はフロントマターの allowed-tools に書いたツールを使えます。ここでは git の読み取り系コマンド3種だけを渡しています。タグを参照するので fetch-depth: 0 で履歴をすべて取得します。
スキルが使う git コマンドを、タグ v1.0.0 のあとに3コミットを積んだリポジトリで実行した結果です(git 2.43.0)。
$ git describe --tags --abbrev=0
v1.0.0
$ git log v1.0.0..HEAD --oneline --no-merges
b564f7e docs: README に起動手順を追記
8ebe799 fix: 数量が0のとき合計が空になる点を修正
55d2e20 feat: 在庫一覧に検索条件を追加
Claude はこの一覧を受け取り、「追加」「修正」などに分けた下書きを実行ログに出します。プラグインに入ったスキルを呼ぶときは、2本目の YAML のように /プラグイン名:スキル名 と名前空間つきで書きます。
YAML の構文を確認した結果
4本の YAML とスキルのフロントマターを、次のスクリプトで読み込みました。push する前に手元で同じ確認ができます。
import pathlib, yaml
print("PyYAML", yaml.__version__)
for path in sorted(pathlib.Path(".github/workflows").glob("*.yml")):
doc = yaml.safe_load(path.read_text(encoding="utf-8"))
# PyYAML は YAML 1.1 の規則で `on` を真偽値 True として読む
triggers = doc.get("on", doc.get(True))
print(f"\n{path.name}: OK")
print(" triggers :", ", ".join(triggers))
for job_id, job in doc["jobs"].items():
print(" job :", job_id)
print(" timeout :", job.get("timeout-minutes"), "min")
print(" permissions:", job.get("permissions"))
uses = [s["uses"] for s in job["steps"] if "uses" in s]
print(" uses :", uses)
print(" concurrency:", doc.get("concurrency"))
# スキルのフロントマターも確認
text = pathlib.Path(".claude/skills/changelog-draft/SKILL.md").read_text(encoding="utf-8")
front = yaml.safe_load(text.split("---")[1])
print("\nSKILL.md frontmatter: OK")
for k, v in front.items():
print(f" {k}: {v}")
$ python3 check_yaml.py
PyYAML 6.0.3
claude-changelog.yml: OK
triggers : workflow_dispatch
job : changelog
timeout : 10 min
permissions: {'contents': 'read', 'id-token': 'write'}
uses : ['actions/checkout@v6', 'anthropics/claude-code-action@v1']
concurrency: {'group': 'claude-changelog', 'cancel-in-progress': True}
claude-code-review.yml: OK
triggers : pull_request
job : review
timeout : 15 min
permissions: {'contents': 'read', 'pull-requests': 'read', 'issues': 'read', 'id-token': 'write'}
uses : ['actions/checkout@v6', 'anthropics/claude-code-action@v1']
concurrency: {'group': 'claude-review-${{ github.event.pull_request.number }}', 'cancel-in-progress': True}
claude-daily-report.yml: OK
triggers : schedule, workflow_dispatch
job : report
timeout : 10 min
permissions: {'contents': 'read', 'issues': 'read', 'id-token': 'write'}
uses : ['anthropics/claude-code-action@v1']
concurrency: {'group': 'claude-daily-report', 'cancel-in-progress': False}
claude.yml: OK
triggers : issue_comment, pull_request_review_comment
job : claude
timeout : 20 min
permissions: {'contents': 'write', 'pull-requests': 'write', 'issues': 'write', 'id-token': 'write', 'actions': 'read'}
uses : ['actions/checkout@v6', 'anthropics/claude-code-action@v1']
concurrency: {'group': 'claude-${{ github.event.issue.number || github.event.pull_request.number }}', 'cancel-in-progress': False}
SKILL.md frontmatter: OK
name: changelog-draft
description: 直近のタグから HEAD までのコミットを読み、変更履歴の下書きを日本語で作る
disable-model-invocation: True
allowed-tools: Bash(git describe *) Bash(git log *) Bash(git tag *)
ワークフロー専用の静的チェックである actionlint 1.7.12 にも4本を通し、指摘なし(終了コード 0)でした。
$ actionlint -version
1.7.12
$ actionlint .github/workflows/*.yml; echo "exit=$?"
exit=0
PyYAML で確認するときは、on キーが真偽値 True として読まれる点に気を付けます。上のスクリプトでは doc.get("on", doc.get(True)) で両方に対応しています。
入力パラメータ12種の一覧
公式ページが「よく使う入力」として挙げている12種です。どれも anthropics/claude-code-action ステップの with: に書きます。
| 入力名 | 役割 | 必須 |
|---|---|---|
prompt |
Claude への指示。文章でもスキル呼び出しでもよい。省くとトリガーフレーズに応答する | いいえ |
claude_args |
Claude Code に渡す CLI 引数 | いいえ |
anthropic_api_key |
Claude API のキー | Claude API を使う場合に必要(OAuth トークンか OIDC 連携を使うなら不要) |
claude_code_oauth_token |
サブスクリプションで認証する OAuth トークン。claude setup-token で作る |
いいえ |
github_token |
GitHub 操作用のトークン。省くと Claude GitHub App として認証する | いいえ |
plugin_marketplaces |
プラグインのマーケットプレイスの Git URL(改行区切り) | いいえ |
plugins |
実行前に入れるプラグイン名(改行区切り) | いいえ |
settings |
Claude Code の設定。JSON 文字列か設定ファイルのパス | いいえ |
trigger_phrase |
反応するトリガーフレーズ。既定は @claude |
いいえ |
use_bedrock |
Claude API の代わりに Amazon Bedrock を使う | いいえ |
use_vertex |
Claude API の代わりに Google Cloud の Agent Platform を使う | いいえ |
use_foundry |
Claude API の代わりに Microsoft Foundry を使う | いいえ |
claude_args でよく使う引数
claude_args には Claude Code の CLI 引数をそのまま書けます。1行でも、| を使った複数行でも構いません。
claude_args: "--max-turns 5 --model claude-sonnet-5 --mcp-config /path/to/config.json"
| 引数 | 働き |
|---|---|
--max-turns |
会話のターン数の上限 |
--model |
使うモデル。省くと既定モデル |
--mcp-config |
MCP 設定ファイルのパス |
--allowedTools |
許可するツール(カンマ区切り)。--allowed-tools でも同じ |
--append-system-prompt |
既定のプロンプトに指示を追記する |
--debug |
デバッグ出力を有効にする |
起動や絞り込みに使うその他の入力
アクションのリポジトリにある usage.md には、上の12種のほかにも入力が載っています。起動の条件や安全面に関わるものを抜き出します。
| 入力名 | 既定値 | 働き |
|---|---|---|
assignee_trigger |
なし | Issue にこのユーザーが割り当てられたら起動 |
label_trigger |
なし | Issue にこのラベルが付いたら起動 |
allowed_bots |
空(bot は不可) | 起動を許可する bot 名(カンマ区切り)。* で全 bot |
allowed_non_write_users |
空 | write 権限の無いユーザーの許可。github_token 入力と併用 |
branch_prefix |
claude/ |
Claude が作るブランチ名の接頭辞 |
use_sticky_comment |
false |
PR へのコメントを1件にまとめる |
track_progress |
false |
進み具合のコメントを付ける |
use_commit_signing |
false |
GitHub の API でコミットに署名する |
include_comments_by_actor |
空(全員) | 読み込むコメントの投稿者を絞る |
exclude_comments_by_actor |
空 | 読み込まないコメントの投稿者 |
認証方式の比較:APIキー・OAuthトークン・OIDC連携
| 方式 | 使う入力 | 保存するもの | 合う場面 |
|---|---|---|---|
| APIキー | anthropic_api_key |
ANTHROPIC_API_KEY |
組織で共有、従量課金で管理 |
| OAuthトークン | claude_code_oauth_token |
CLAUDE_CODE_OAUTH_TOKEN |
個人のサブスクリプションで動かす |
| OIDC連携 | anthropic_federation_rule_id ほか |
長期のシークレットなし | 長期の鍵を置かない運用 |
| クラウド経由 | use_bedrock など |
各クラウドの連携設定 | 自社のクラウド契約で推論する |
- OAuth トークンは
claude setup-tokenを実行した人のサブスクリプションに結び付きます。 複数リポジトリで共有するシークレットには API キーが合います。組織レベルの Actions シークレットに置けば、リポジトリごとに登録し直す手間が省けます。 - OIDC 連携(workload identity federation)は、ワークフローの GitHub OIDC トークンを Claude API のアクセスに交換する方式です。
anthropic_federation_rule_id(fdrl_...)とanthropic_organization_idを指定し、必要に応じてanthropic_service_account_id(svac_...)とanthropic_workspace_id(wrkspc_...)を足します。ジョブにはid-token: writeが必要です。 - Bedrock・Agent Platform・Foundry の3つも、API キーではなく OIDC の ID 連携で認証します。
- OAuth トークンで動かした実行は、API の課金ではなくサブスクリプションの利用枠を使います。
permissions を最小にする
ワークフロー別の permissions
GitHub Actions では、ジョブに permissions を書くと、書いた項目だけが有効になります。4本の YAML の内訳です。
| ワークフロー | contents | PR | issues | その他 |
|---|---|---|---|---|
| @claude 応答 | write | write | write | actions: read |
| PR 自動レビュー | read | read | read | なし |
| 定期レポート | read | なし | read | なし |
| スキル実行 | read | なし | なし | なし |
4本とも id-token: write を加えています。これはアクションが既定で使う GitHub App 認証に必要な項目です。コードを書き換えるのは1本目だけなので、write を持つのも1本目だけにしてあります。
Claude GitHub App が要求する権限11項目
Claude GitHub App は、このアクションのほか Code Review や Web のセッションの auto-fix でも共通に使われます。GitHub App は機能ごとに権限を分けられないため、インストール時には次の11項目をまとめて許可することになります。
| 権限 | アクセス | このアクションでの用途 |
|---|---|---|
| Actions | 読み書き | ほかの機能向け |
| Checks | 読み書き | ほかの機能向け |
| Contents | 読み書き | ファイルの変更、ブランチ作成 |
| Discussions | 読み書き | ほかの機能向け |
| Issues | 読み書き | Issue への応答 |
| Members | 読み取り | ほかの機能向け |
| Metadata | 読み取り | ほかの機能向け |
| Pull requests | 読み書き | PR の作成、変更の push |
| Repository hooks | 読み書き | ほかの機能向け |
| Statuses | 読み取り | ほかの機能向け |
| Workflows | 読み書き | ほかの機能向け |
このアクションが頼っているのは Contents・Issues・Pull requests の3つです。組織の方針でこの3つだけに絞りたいときは、アクションの setup.md に沿って独自の GitHub App を作る方法があります。その場合に使えるのはこのアクションだけで、Code Review と Web の auto-fix には公式の App が必要です。
App が新しい権限を求めるようになったときは、アカウントの所有者(組織なら組織の所有者)に GitHub から承認の依頼が届き、承認するまでは以前の権限のまま動きます。
誰が起動できるかの判断表
アクションは Claude を動かす前に、起動した人について2つの確認をします。どちらかで外れると、その実行は失敗として終わります。
| 起動した人・イベント | 結果 | 通したいとき |
|---|---|---|
| write 権限のある人のコメント | 実行される | 設定不要 |
| write 権限の無い人のコメント | 実行されない | allowed_non_write_users と github_token を指定 |
| bot(Dependabot など) | 実行されない | allowed_bots に bot 名を列挙 |
schedule |
write の確認は対象外。bot の確認はある | 最後に cron を変更した人が bot なら allowed_bots に追加 |
workflow_dispatch |
write の確認は対象外 | 設定不要(手動実行できるのは write 権限のある人) |
| フォークからの PR | シークレットが渡らない | 同じリポジトリのブランチから PR を出す |
設定するときの目安です。
allowed_botsは bot 名を1つずつ書くと範囲がはっきりします(例:"dependabot[bot],renovate[bot]")。許可した bot にはリポジトリ権限の確認が行われないため、公開リポジトリで*を使うと外部の App からも起動できる状態になります。あわせてジョブのpermissionsを最小にしておきます。allowed_non_write_usersを使うときは、github_token: ${{ secrets.GITHUB_TOKEN }}を渡します。 このトークンはジョブ単位で自動発行され、入れ替わっていきます。個人アクセストークンは入れ替わらないため、ここではGITHUB_TOKENを使い、claude_argsで許可するツールも必要な分だけにします。- フォークからの PR には、GitHub がシークレットを渡しません(公開リポジトリの場合)。2本目の YAML では
head.repo.full_name == github.repositoryの条件で、同じリポジトリのブランチからの PR だけを対象にしています。 pull_request_targetやworkflow_runはベースリポジトリのシークレットで動きます。使うときは、ワークスペースのルートにはベースブランチを checkout し、PR 側のコードが必要ならpath: pr-headのように別ディレクトリへ取り出して--add-dir pr-headで渡す形が公式に示されています。- 外部から届く Issue や PR の本文には、表示されない文字や HTML コメントが含まれることがあります。アクションはこれらを取り除いてから Claude に渡します。読み込むコメントの投稿者を絞りたいときは
include_comments_by_actorが使えます。
Claude のコミットで CI が動かないときの原因
GitHub は、既定の GITHUB_TOKEN で作られたコミットではワークフローを起動しません。 そのため、アクションに github_token: ${{ secrets.GITHUB_TOKEN }} を渡していると、Claude が push しても CI が始まりません。
直す前(github_token を渡している)
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
直した後(行を外して Claude GitHub App として認証する)
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
独自の GitHub App を使っている場合は、その App のトークンを github_token に渡します。あわせて、CI 側のワークフローの on: に、Claude の push で発生するイベント(push や pull_request)が入っているかも見ておきます。
費用に上限をかける設定
1回の実行で使うものは2種類あります。GitHub Actions の実行時間(GitHub ホストのランナーの分数)と、API のトークン(OAuth トークンの場合はサブスクリプションの利用枠)です。次の3つを入れると、どちらにも上限がかかります。
| 設定 | 書く場所 | 抑えられるもの |
|---|---|---|
--max-turns |
claude_args |
1回の実行でのやり取りの回数 |
timeout-minutes |
ジョブ | 1回の実行時間 |
concurrency |
ワークフロー | 同時に走る本数 |
直す前(上限の指定が無い)
jobs:
claude:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
直した後(3つの上限を入れる)
concurrency:
group: claude-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: false
jobs:
claude:
if: contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_args: |
--max-turns 20
cancel-in-progress は用途で使い分けます。PR レビューのように最新の1本があれば足りるものは true、@claude への応答のように途中で止めたくないものは false が合います。
設定のほかに効くのは、依頼の書き方です。
@claudeへの依頼を具体的に書くと、少ないターンで終わります- Issue テンプレートで、必要な情報を最初から渡します
CLAUDE.mdは毎回読み込まれるので、短く保ちます
beta から v1 への対応表
anthropics/claude-code-action@beta のままのワークフローは、次の4点で v1 に移せます。
usesの@betaを@v1に変えるmodeを消す(モードは自動で判定される)direct_promptをpromptに変えるmax_turnsやmodelなどの CLI オプションをclaude_argsに移す
| beta の入力 | v1 での書き方 | 補足 |
|---|---|---|
mode |
不要(自動判定) | prompt の有無で決まる |
direct_prompt |
prompt |
そのまま置き換え |
override_prompt |
prompt |
変数は GitHub のコンテキストで書く |
custom_instructions |
claude_args: --append-system-prompt |
既定のプロンプトに追記 |
max_turns |
claude_args: --max-turns |
CLI の書式で書く |
model |
claude_args: --model |
CLI の書式で書く |
allowed_tools |
claude_args: --allowedTools |
CLI の書式で書く |
disallowed_tools |
claude_args: --disallowedTools |
CLI の書式で書く |
claude_env |
settings の env |
設定 JSON で渡す |
mcp_config |
claude_args: --mcp-config |
CLI 引数で渡す |
timeout_minutes |
ジョブの timeout-minutes |
入力ではなくジョブに書く |
custom_instructions には同名のフラグが無く、--append-system-prompt になります。--system-prompt は既定のプロンプト全体を置き換える別のフラグです。
書き換えの例(beta)
- uses: anthropics/claude-code-action@beta
with:
mode: "tag"
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
custom_instructions: "Follow our coding standards"
max_turns: "10"
allowed_tools: "Edit,Read,Write"
書き換えの例(v1)
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_args: |
--max-turns 10
--append-system-prompt "Follow our coding standards"
--allowedTools Edit,Read,Write
環境変数(claude_env)は、settings に JSON で渡します。
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
settings: |
{
"env": {
"NODE_ENV": "test",
"CI": "true"
}
}
うまく動かないときの確認表
| 症状 | 確認するところ |
|---|---|
@claude に反応しない |
App がリポジトリに入っているか/ワークフローが有効か/シークレットがあるか |
| 同上 | @claude が単語として書かれているか(/claude や @claude-bot では反応しない) |
| 同上 | コメントした人に write 権限があるか |
| Claude のコミットで CI が動かない | github_token: ${{ secrets.GITHUB_TOKEN }} を渡していないか |
| 認証エラー | キーやトークンが有効か。手元の claude で試してから確認する |
| レビューがコメントされない | --comment と --allowedTools の2行があるか |
| フォークの PR で失敗する | シークレットが渡らない。同じリポジトリのブランチで試す |
| cron が動かない | 既定ブランチに YAML があるか。時刻を UTC で書いたか |
よくある質問
Q. API キーとサブスクリプションのどちらで動かせますか?
A. どちらでも動きます。API キーは anthropic_api_key、サブスクリプションは claude setup-token で作ったトークンを claude_code_oauth_token に渡します。OAuth トークンは発行した人のサブスクリプションに結び付くため、複数リポジトリで共有するなら API キーか OIDC 連携が合います。
Q. ワークフローを書かずに自動レビューだけ使う方法はありますか? A. 公式には、ワークフローの管理が要らない Code Review という別の機能が用意されています。プロンプト・モデル・トリガーを自分で決めたい場合に、この記事の2本目のようなワークフローを使います。
Q. Claude の作業ルールはどこに書きますか?
A. リポジトリのルートに CLAUDE.md を置き、コードの書き方やレビューの観点を書きます。Claude は PR の作成や依頼への応答のときにこの内容に従います。毎回読み込まれるので、短くまとめるのがこつです。
Q. 連携をやめたいときは何を消せばよいですか?
A. .github/workflows/ の該当ワークフロー、リポジトリ(と組織)のシークレット、Claude GitHub App の3つです。シークレットを消しても鍵そのものは有効なままなので、API キーを使い終えるときは Claude Console 側でも削除します。App はほかの Claude の機能で使っていない場合に外します。
まとめ
- 必要なものは3つ:Claude GitHub App、認証用シークレット、
anthropics/claude-code-action@v1を使う YAML promptなしは対話モード、ありは自動モード。v1 ではmodeを書かないpermissionsはジョブごとに最小に。書き込みが要るのは@claude応答のジョブだけ- 起動できるのは write 権限のある人。bot は
allowed_botsに名前を書いたものだけ - Claude のコミットで CI を動かすには
github_token: ${{ secrets.GITHUB_TOKEN }}を渡さない - 費用は
--max-turns・timeout-minutes・concurrencyの3つで上限をかける - beta の入力は
promptとclaude_argsに集約。custom_instructionsは--append-system-prompt
参考・出典
いずれも2026年10月7日に確認しました。
- Claude Code Docs: Claude Code GitHub Actions https://code.claude.com/docs/en/github-actions
- Claude Code Docs: Skills https://code.claude.com/docs/en/skills
- Claude Code Docs: Configure permissions https://code.claude.com/docs/en/permissions
- anthropics/claude-code-action: Usage(入力一覧) https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
- anthropics/claude-code-action: Migration Guide https://github.com/anthropics/claude-code-action/blob/main/docs/migration-guide.md
- anthropics/claude-code-action: Security https://github.com/anthropics/claude-code-action/blob/main/docs/security.md
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Claude Code GitHub Actions連携|YAML雛形と入力一覧」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。