0:00 0:00
Article
Claude CodeとGitHub ActionsでCIを整える手順
AI生成コードを安全に運用するためのGitHub Actions CI設計。基本のテスト・lint・型チェック・ビルドに加え、公式の`anthropics/claude-code-action`を使ったPRレビュー・自動修正フローまで整理します。
Claude Codeで書いたコードを安全に本番投入するには、ローカルでnpm testを流すだけでは不十分です。AIが生成したコードは「ローカルでは通るがCIでは落ちる」「依存追加に気づかない」「テスト不足のまま自信満々にマージ依頼してくる」といった事故が起きやすく、人間レビューだけでは見落としが残ります。GitHub Actionsでテスト・lint・型チェック・ビルドの4点を機械的に止める層を作り、その上に公式のanthropics/claude-code-actionを載せれば、AIに「失敗を見て自分で直す」フローまで含めて任せられます。この記事では、その2段構成を実例つきで整理します。
結論:CIは「人間レビュー前のフィルター」として最低4チェック
AI生成コードに対するCIの役割は次の3つです。
- 人間レビュー前のノイズ除去:lint・型・テスト失敗で止まるPRはレビューしない
- 依存追加・秘密情報・大量差分の検知:Claude Codeが勝手に増やしたものを機械的に弾く
- AIに自分のミスを見せる:失敗ログを依頼文に貼り直して再依頼する材料にする
最低限、次の4ジョブをPR時に実行します。
| ジョブ | コマンド例 | 落とす理由 |
|---|---|---|
| lint | npm run lint | スタイル違反・未使用変数 |
| 型チェック | npx tsc --noEmit | TypeScriptの型崩れ |
| テスト | npm test | ユニット・結合テスト失敗 |
| ビルド | npm run build | 本番ビルドだけで出る型/import事故 |
PR運用全体の前段は「Claude Codeで安全にコミットとPRを作るワークフロー」を参照してください。
ステップ1:最小のCIワークフローを置く
.github/workflows/ci.ymlを次の形で始めます。Node.jsプロジェクトを前提にしますが、コマンドを差し替えれば他言語にも応用できます。
name: CI
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
- run: npm ci
- run: npm run lint
- run: npx tsc --noEmit
- run: npm test
- run: npm run build
ポイントは次のとおりです。
npm ciを使う(npm installはpackage-lock.jsonを書き換えるためCIで使わない)- 各ステップは独立コマンドとして書く(失敗箇所がログでわかりやすい)
node-versionを固定する(AIが勝手にNodeバージョンを上げないため)
このYAML自体をClaude Codeに生成させるときは、依頼文に「lint・型チェック・テスト・ビルドの4ジョブをparallelではなくsequentialで実行する」「npm ciを使う」と明記します。AIは最適化しようとしてparallel構成にしがちですが、初手はsequentialのほうがログが読みやすくなります。
ステップ2:失敗を読みやすくする工夫
AIに「CI失敗ログを見て修正してください」と依頼するとき、ログが整理されていないとコンテキストを浪費します。次を仕込んでおくと効きます。
- テスト出力に色を付けない:
FORCE_COLOR=0環境変数を設定。ANSIエスケープが混ざるとAIが読みにくい - lint・型チェック・テストを別ステップにする:合体させると失敗の特定に余計な情報がつく
- ビルド成果物をartifactに保存しない:PR CIではディスクI/Oが増えるだけ。本番デプロイCIだけで保存する
actions/upload-artifactで「失敗時だけログを保存」を入れておくと、AIへの再依頼時にダウンロードして渡せます。
- name: Upload test logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: test-logs
path: |
npm-debug.log
coverage/
ステップ3:依存追加と秘密情報のチェックを追加する
Claude Codeが勝手に依存を増やしたり、.envを誤コミットしたりする事故を防ぐため、専用ジョブを足します。
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Detect new dependencies
run: |
git diff origin/main -- package.json | grep -E '^\+\s*"' && \
echo "::warning::package.json に新しい依存が追加されています" || true
- name: Run gitleaks
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
gitleaksは秘密情報の検出に使えるOSSです。誤コミット対策の3層防御は「Claude Codeに秘密情報を渡さないための実践ルール」で扱っています。
依存追加の検出を「warning」で止めず「error」にしたい場合は、exit 1を返すスクリプトに置き換えます。ただし、最初は警告だけにしてレビューで判断する運用が現実的です。
ステップ4:anthropics/claude-code-actionでAIに自動修正させる
公式のanthropics/claude-code-action(2025年8月リリースのv1)を導入すると、PRコメントに@claude 修正してくださいと書くだけでClaude CodeをGitHub Actions上で起動できます。
導入手順
- リポジトリ管理者権限でClaude GitHub Appをインストール
- Settings → Secrets and variables → Actionsで
ANTHROPIC_API_KEYまたはCLAUDE_CODE_OAUTH_TOKENを登録 .github/workflows/claude.ymlを追加
CLAUDE_CODE_OAUTH_TOKENは、ローカルでclaude setup-tokenを実行して生成できる長期トークンで、Pro/Max/Team/Enterpriseプランで使えます。APIキー従量課金を避けたい場合はこちらが楽です。
Claude Code CLIから/install-github-appを実行すると、上記をガイド付きで進められます。
最小ワークフロー例
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
claude:
if: contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
steps:
- uses: actions/checkout@v4
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
PRやIssueのコメントに@claude このテストの失敗を直してくださいと書くと、Claude Codeが該当ブランチで作業し、差分をコミットしてプッシュします。
使いどころと注意
- 使いどころ:CI失敗の小さな修正、テスト追加、コメント追記、issue triage
- 使わないほうがいい場面:本番デプロイ系、依存大量追加、
mainへの直接push(権限を絞る) - コスト:Action実行時間とAnthropic API呼び出しが課金対象。長時間ジョブのタイムアウトを設定する
外部コントリビューターからの@claudeを無条件で受け付けると、APIクレジットを枯らされる可能性があります。if条件にgithub.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER'を入れて、リポジトリメンバーだけに制限します。
ステップ5:失敗ログをローカルClaude Codeに食わせるフロー
@claudeをGitHub上で動かす運用は便利ですが、API課金やコンテキスト制御の柔軟性ではローカルClaude Codeのほうが上です。失敗時に手元で修正させる手順を整えておくと、状況に応じて使い分けられます。
依頼:直近のCI失敗を直してください。
## 失敗ログ
@gh-run-12345.log
## 制約
- 失敗テストだけを修正対象とする
- テストファイル自体は改変しない(実装側で直す)
- 依存は追加しない
- 型と lint も通ること
## 完了条件
- npm run lint, npx tsc --noEmit, npm test, npm run build がローカルですべて通る
GitHub CLIで失敗ログを引いてきて、ファイルとしてClaude Codeに渡します。
gh run view --log-failed > gh-run-12345.log 依頼文の骨格は「Claude Codeに伝わるプロンプトの基本構造」、完了条件の書き方は「Claude Codeの成功率を上げる制約条件と受け入れ条件の作り方」で扱っています。
ステップ6:マージ条件をCIに紐付ける
CIを整えたら、GitHubのBranch protection rulesで「verifyジョブの成功」をマージ条件に設定します。AIがgh pr mergeしようとしても、CIが通っていなければブロックされます。
- Settings → Branches → Branch protection rules → Add rule
- Branch name pattern:
main - Require status checks to pass before merging:
verifyを選択 - Require branches to be up to date before merging:on
- 管理者のbypassを許可しない(理想)
GitHub CLIを使ったgh pr mergeの運用ルールは「Claude Codeで安全にコミットとPRを作るワークフロー」で扱っています。
よくある失敗パターン
| 症状 | 原因 | 対処 |
|---|---|---|
| ローカルで通るのにCIで落ちる | Node・OS差・依存lockずれ | node-version固定/npm ci/actions/setup-nodeのcache: npm |
AIが@claudeに過剰反応 | トリガー条件が広すぎる | ifでcontains(comment.body, '@claude')に絞る/author_associationチェック |
| Actionが何度も同じ修正に失敗 | コンテキストが足りない/指示が曖昧 | ログを添付し直し、失敗テスト名を明示/2回失敗したらローカルで対応 |
| Secretsがログに出る | echoしてデバッグした残骸 | ::add-mask::を使う/set -xを切る |
| CI実行時間が長い | ビルドキャッシュなし・テスト並列なし | actions/cache/テストランナーの並列分割 |
チェックリスト
-
lint・型チェック・テスト・ビルドの4ジョブをPR時に実行している -
npm ciを使い、node-versionを固定している - 失敗時にログを
artifactで保存している - gitleaks等で秘密情報スキャンを入れている
-
anthropics/claude-code-actionを導入する場合はANTHROPIC_API_KEYまたはCLAUDE_CODE_OAUTH_TOKENをSecretsに登録した -
@claudeトリガーをリポジトリメンバーに制限している - Branch protection rulesでCI成功をマージ条件にしている
- AIに失敗ログを渡して修正させる依頼文テンプレートを用意した
次に読むおすすめ記事:
- 「Claude Codeで安全にコミットとPRを作るワークフロー」:CI前段のGit・PR運用
- 「Claude Codeをコードレビューに使う方法と人間が見るべきポイント」:CIを通った後の人間レビュー観点
- 「Claude Codeに秘密情報を渡さないための実践ルール」:Secrets漏えい防止の3層防御