未分類

【Claude Code③】GitHub Actions PR自動レビュー&テスト修正|YAMLテンプレート付き

【Claude Code深掘り③】Claude Code × GitHub Actions:PR自動レビューとテスト自動修正の実践

この記事でわかること:Claude CodeとGitHub Actionsを連携し、プルリクエストの自動コードレビューと失敗テストの自動修正提案を実装する方法を、実際に動くYAMLテンプレートとともに解説します。連載②で紹介したCI/CD連携をさらに発展させた実践的な内容です。


目次

  1. はじめに:③で何を実現するか
  2. 前提と環境構築
  3. PR自動レビューの実装:完全版テンプレート
  4. テスト自動修正の実装:フェイル→修正提案まで
  5. 高度な応用:セキュリティスキャン×Claude Code
  6. コスト管理と運用上の落とし穴
  7. まとめと次回予告(④)

1. はじめに:③で何を実現するか

連載②ではClaude CodeとCI/CDの連携を概念レベルで解説し、基本的なYAMLも紹介しました。③の今回は「実際に動くテンプレートをそのまま使える形で提供する」をゴールに設定します。

具体的には次の2つを完全実装します。

  1. PR自動レビュー:PRが作成・更新されたとき、変更ファイルをClaude Codeが読んで問題点をコメントに投稿する
  2. テスト自動修正提案:CIでテストが失敗したとき、Claude Codeが失敗ログを読んで修正コードを提案する

どちらもコピー&ペーストで動く状態のYAMLを提供します。ぜひリポジトリに追加してみてください。

利用前提:Claude Pro($20/月)のサブスクリプション+Anthropic APIキーが必要です。APIキー経由でCI/CDを動かす場合はトークン従量課金が発生します。料金は変動する可能性があります。最新情報は公式サイトでご確認ください。

Claude Code × GitHub Actionsの全体アーキテクチャ図

2. 前提と環境構築

必要なもの

項目 内容
GitHubリポジトリ Public/Private どちらでも可
Anthropic APIキー Anthropic Consoleで発行
GitHub Secrets設定 ANTHROPIC_API_KEY をリポジトリのSecretsに登録
Node.js GitHub Actions上では actions/setup-node で自動インストール

GitHub Secretsの設定手順

  1. GitHubリポジトリの SettingsSecrets and variablesActions を開く
  2. New repository secret をクリック
  3. Name: ANTHROPIC_API_KEY、Secret: 取得したAPIキーを貼り付けて保存

これだけです。以降のYAMLテンプレートはこのSecret名を参照します。

APIコストの目安

GitHub ActionsでClaude Codeを使う場合、サブスクリプションではなくAPI従量課金になります。

  • 小〜中規模のPRレビュー(変更ファイル3〜5個):1回あたり$0.02〜$0.10程度
  • テスト修正提案(失敗ログ50行程度):1回あたり$0.01〜$0.05程度

デイリーで数十件のPRが発生するような大規模開発でなければ、月額で大きなコストにはなりにくいです。


3. PR自動レビューの実装:完全版テンプレート

基本版:変更ファイルを自動レビュー

# .github/workflows/claude-pr-review.yml
name: Claude Code PR Review

on:
  pull_request:
    types: [opened, synchronize, reopened]
    # draft PRはスキップ(コスト節約)
    branches-ignore: []

jobs:
  claude-review:
    runs-on: ubuntu-latest
    # draft PRはスキップ
    if: github.event.pull_request.draft == false

    permissions:
      contents: read
      pull-requests: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Get changed files
        id: changed-files
        run: |
          CHANGED=$(git diff --name-only origin/${{ github.base_ref }} HEAD \
            | grep -E '\.(js|ts|jsx|tsx|py|go|rb|java|rs|cs)$' \
            | head -20 \
            | tr '\n' ' ')
          echo "files=$CHANGED" >> $GITHUB_OUTPUT
          echo "Changed files: $CHANGED"

      - name: Run Claude Code Review
        if: steps.changed-files.outputs.files != ''
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          cat << 'EOF' > review-prompt.txt
          以下のファイルのコード変更をレビューしてください。

          【レビュー観点】
          1. バグリスク(nullチェック漏れ・型エラー・境界値)
          2. セキュリティ問題(SQLインジェクション・XSS・認証漏れ)
          3. パフォーマンス問題(N+1クエリ・不要なループ)
          4. コードスタイル(命名規則・関数の長さ)
          5. テスト不足

          問題がない場合は「&#x2705; 問題なし」と出力してください。
          問題がある場合は以下の形式でMarkdownリスト出力してください:

          ### &#x1f534; 要修正
          - [ファイル名:行番号] 問題の説明と修正案

          ### &#x1f7e1; 改善推奨
          - [ファイル名:行番号] 改善の提案

          対象ファイル: ${{ steps.changed-files.outputs.files }}
          EOF

          claude --print "$(cat review-prompt.txt)" > review-result.md
          cat review-result.md

      - name: Post review comment
        if: steps.changed-files.outputs.files != ''
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            let review = '';
            try {
              review = fs.readFileSync('review-result.md', 'utf8');
            } catch(e) {
              review = '&#x26a0;&#xfe0f; レビューファイルの読み込みに失敗しました。';
            }

            const body = `## &#x1f916; Claude Code 自動レビュー

            > このコメントはClaude Codeによって自動生成されました。最終判断は人間のレビュアーが行ってください。

            ${review}

            ---
            *Generated by [Claude Code](https://claude.ai) | ${new Date().toISOString()}*`;

            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: body
            });
GitHub Actions PR自動レビューの実行結果サンプル

改善版:差分(diff)を直接渡す

変更ファイル名だけでなく実際のdiff内容をClaudeに渡すことで、より精度の高いレビューが可能です。

      - name: Get diff content
        id: diff
        run: |
          git diff origin/${{ github.base_ref }} HEAD \
            -- '*.js' '*.ts' '*.py' '*.go' \
            | head -500 > diff-content.txt
          echo "has_diff=$(test -s diff-content.txt && echo true || echo false)" >> $GITHUB_OUTPUT

      - name: Review with diff
        if: steps.diff.outputs.has_diff == 'true'
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude --print "以下のgit diffを確認してコードレビューしてください。
          バグリスク・セキュリティ・パフォーマンス観点で問題点をMarkdownで出力してください。

          $(cat diff-content.txt)" > review-result.md

ポイントhead -500で差分を500行に制限しています。大きなPRで全差分を渡すとAPIコストが膨らむため、この上限を設けることがコスト管理の鉄則です。


4. テスト自動修正の実装:フェイル→修正提案まで

CIでテストが失敗したとき、Claude Codeが修正案を自動生成するワークフローです。

# .github/workflows/claude-test-fix.yml
name: Claude Code Test Fix Suggestion

on:
  push:
    branches: [main, develop, 'feature/**']
  pull_request:
    branches: [main, develop]

jobs:
  test-and-fix:
    runs-on: ubuntu-latest

    permissions:
      contents: read
      pull-requests: write
      issues: write

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Run tests
        id: tests
        # テストが失敗してもワークフローを継続するためcontinue-on-error: true
        continue-on-error: true
        run: |
          npm test 2>&1 | tee test-output.txt
          echo "exit_code=$?" >> $GITHUB_OUTPUT

      - name: Generate fix suggestion with Claude
        # テストが失敗した場合のみ実行
        if: steps.tests.outcome == 'failure'
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          # 失敗ログの末尾100行を取得
          tail -100 test-output.txt > test-failures.txt

          # 失敗したテストファイルを特定(Jest形式)
          FAILED_FILES=$(grep -oE 'FAIL\s+\S+' test-output.txt | awk '{print $2}' | head -5 | tr '\n' ' ')

          claude --print "テストが失敗しました。修正案を提案してください。

          【失敗ログ】
          $(cat test-failures.txt)

          【失敗したファイル】
          ${FAILED_FILES}

          【出力形式】
          1. 失敗の原因(1〜3行で簡潔に)
          2. 修正が必要なファイルと具体的なコード変更案
          3. 修正後に再テストするコマンド

          コードブロックを使って修正案を明示してください。" > fix-suggestion.md

          cat fix-suggestion.md

      - name: Post fix suggestion as PR comment
        if: steps.tests.outcome == 'failure' && github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const fix = fs.readFileSync('fix-suggestion.md', 'utf8');

            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## &#x1f527; Claude Code テスト修正提案

              テストが失敗しました。以下はClaude Codeによる修正提案です。

              > &#x26a0;&#xfe0f; AIによる自動提案です。適用前に必ず内容を確認してください。

              ${fix}`
            });

      - name: Fail the workflow if tests failed
        if: steps.tests.outcome == 'failure'
        run: exit 1

5. 高度な応用:セキュリティスキャン×Claude Code

既存のセキュリティスキャンツール(Semgrep・Bandit等)とClaude Codeを組み合わせることで、「機械的な検出→人間に分かりやすい説明」のパイプラインが構築できます。

      - name: Run Semgrep
        run: |
          pip install semgrep
          semgrep --config=auto --json > semgrep-output.json 2>&1 || true

      - name: Explain security issues with Claude
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude --print "以下のSemgrepスキャン結果を開発者向けに分かりやすく解説してください。
          各問題について:原因・リスクレベル・具体的な修正方法を日本語で説明してください。

          $(cat semgrep-output.json | head -100)" > security-report.md

Semgrepが検出した技術的な問題を、Claudeが「なぜ危険か・どう直すか」を日本語で説明してくれます。セキュリティ知識が少ない開発チームにも理解しやすいレポートが生成されます。

セキュリティスキャン×Claude Code自動解説の実行例

6. コスト管理と運用上の落とし穴

落とし穴①:draft PRにも実行されてしまう

対策:if: github.event.pull_request.draft == false を条件に追加(テンプレートに既に含めています)。

落とし穴②:大きなPRで差分が膨大になる

対策:head -500などで差分を制限する。または「特定ディレクトリの変更のみ対象」にフィルタする。

      - name: Get changed files (filtered)
        run: |
          git diff --name-only origin/${{ github.base_ref }} HEAD \
            -- 'src/**' 'lib/**' \   # 対象ディレクトリを限定
            | grep -v 'node_modules' \
            | grep -v '*.lock' \
            | head -10               # 最大10ファイルに制限

落とし穴③:APIキー漏洩

  • ANTHROPIC_API_KEYは必ずGitHub Secretsに登録する
  • ログに直接出力しない(echo $ANTHROPIC_API_KEYは禁止)
  • Forkされたリポジトリからのworkflow実行時はSecretsが渡されないため注意

落とし穴④:コメントが大量投稿される

同じPRに複数回pushするとレビューコメントが連続投稿されます。対策として「既存のBotコメントを更新する」実装を推奨します。

// 既存コメントを検索して更新するscript例
const comments = await github.rest.issues.listComments({...});
const botComment = comments.data.find(c => 
  c.user.login === 'github-actions[bot]' && 
  c.body.includes('Claude Code 自動レビュー')
);

if (botComment) {
  // 既存コメントを更新
  await github.rest.issues.updateComment({
    comment_id: botComment.id, body: body, ...
  });
} else {
  // 新規コメント作成
  await github.rest.issues.createComment({...});
}

💡 Claude Proを使えばCI/CDの外でもこれらのワークフローをローカルでテストできます。まず7日間無料トライアルで試してみましょう。(Claude Pro公式サイト(PR)
※価格は変動する可能性があります。最新情報は公式サイトでご確認ください。


7. まとめと次回予告(④)

今回の記事で実装したもの:

  • PR自動レビュー:変更ファイルをClaudeが分析し、バグリスク・セキュリティ・パフォーマンスの問題を自動コメント
  • テスト自動修正提案:CIテスト失敗時に修正案をClaudeが自動生成してPRコメントに投稿
  • セキュリティスキャン統合:Semgrepの検出結果をClaudeが日本語で解説

すべてコピー&ペーストで使えるYAMLテンプレートとして提供しています。まずは小さなリポジトリで試してみることをおすすめします。

📚 GitHub ActionsとAI連携をより体系的に学びたい方には、UdemyのCI/CD・DevOps関連コースとClaude Code講座の組み合わせが効果的です。(Udemyで講座を探す(PR)
※価格・ラインナップは変動する場合があります

次回:Claude Code深掘り④(7月29日公開予定)

「プロの現場での活用術:フリーランスエンジニアがClaude Codeで収益を2倍にした方法」では、実際にフリーランスとして活動するエンジニアの事例をもとに、Claude Codeを使った案件獲得・単価アップ・作業効率化の実践的なノウハウをお届けします。


よくある質問(FAQ)

Q1. GitHub Actions以外のCI(CircleCI・GitLab CI等)でも同様の実装はできますか?
A. できます。基本的な手順は同じで、「Claude CodeをCLIとしてインストール→APIキーを環境変数に設定→実行」の流れです。各CIのYAML記法に読み替えてください。

Q2. プライベートリポジトリでも動きますか?
A. 動きます。GitHub Actionsはプライベートリポジトリでも利用可能です。ただしPrivateリポジトリのActionsは無料枠を超えると課金されます。

Q3. レビューの精度はどのくらいですか?
A. 明らかなバグ(nullチェック漏れ・未定義変数の使用等)は高精度で検出します。一方、ビジネスロジックの誤りや設計上の問題は見落とすことがあります。あくまで「一次スクリーニング」として位置づけ、最終判断は人間が行う運用が推奨されます。

Q4. チームで使う場合、コストはどう管理しますか?
A. Anthropic Consoleでプロジェクト別の予算上限(Spend Limit)を設定できます。月額の上限を設けておくと予期せぬコスト増加を防げます。


関連記事


※本記事の情報は2026年7月時点のものです。Claude Code・GitHub Actionsの仕様は変更される場合があります。最新情報は各サービスの公式ドキュメントでご確認ください。
※本記事にはアフィリエイトリンクが含まれています。