SJ blog
ai
B

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

AIを使ったコードレビュー自動化の実践

GitHub ActionsとAI(Claude Opus 4.6・GPT-5.4)を組み合わせてPRのコードレビューを自動化する方法を解説。セキュリティチェック・バグ検出・スタイル一貫性の維持をAIに任せます。

一言結論

AIコードレビューは人間レビューの補完として有効だが、誤検知やセキュリティリスクを考慮しAIの出力をそのままマージせず人間が最終判断する運用設計が不可欠だ。

なぜ AI コードレビューを自動化するのか

人間によるレビューの限界:
  - レビュアーの時間が足りない
  - 疲れているときはバグを見逃す
  - スタイル指摘に時間を取られる

AI レビューの強み:
  - 24時間即時対応
  - 一貫した基準
  - バグパターン・セキュリティ問題の検出
  - ボイラープレートな指摘を自動化

アーキテクチャ

PR 作成

GitHub Actions トリガー

差分(git diff)を取得

AI(Claude Opus 4.6 / GPT-5.4)に送信

レビューコメントを PR に投稿

GitHub Actions の実装

# .github/workflows/ai-review.yml
name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write  # コメント投稿に必要

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0  # 差分取得のため全履歴が必要

      - name: Get diff
        id: diff
        run: |
          DIFF=$(git diff origin/${{ github.base_ref }}..HEAD -- '*.ts' '*.tsx' '*.js' '*.py' | head -c 10000)
          echo "diff<<EOF" >> $GITHUB_OUTPUT
          echo "$DIFF" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: AI Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
          REPO: ${{ github.repository }}
          DIFF: ${{ steps.diff.outputs.diff }}
        run: node .github/scripts/ai-review.mjs
// .github/scripts/ai-review.mjs
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();
const diff = process.env.DIFF;
const prNumber = process.env.PR_NUMBER;
const [owner, repo] = process.env.REPO.split("/");

const response = await client.messages.create({
  model: "claude-opus-4-6",
  max_tokens: 2000,
  messages: [{
    role: "user",
    content: `以下のコード差分をレビューしてください。

レビューの観点:
1. バグ・論理エラー(重要度: 高)
2. セキュリティの問題(重要度: 高)
3. パフォーマンスの問題(重要度: 中)
4. コードの可読性・保守性(重要度: 低)

形式:
- 問題がない場合は「✅ レビュー完了:特に問題なし」と返す
- 問題がある場合は Markdown リストで列挙(深刻度と理由を含める)
- スタイルの好みの違いには言及しない

\`\`\`diff
${diff}
\`\`\``
  }]
});

const review = response.content[0].text;

// GitHub PR にコメント投稿
const ghResponse = await fetch(
  `https://api.github.com/repos/${owner}/${repo}/issues/${prNumber}/comments`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      body: `## 🤖 AI コードレビュー\n\n${review}`,
    }),
  }
);

セキュリティ特化のレビュー

const securityPrompt = `
以下のコード差分でセキュリティ問題を検出してください。

チェック項目:
- SQLインジェクション
- XSS(Cross-Site Scripting)
- 認証・認可の欠陥
- センシティブな情報のハードコード(APIキー・パスワード)
- 依存関係の危険な使い方
- 入力値のバリデーション不足

問題なければ「✅ セキュリティ上の問題なし」とだけ返す。
`;

実用的なTips

コストコントロール

# 大きすぎる PR はスキップ(コスト対策)
- name: Check diff size
  run: |
    SIZE=$(echo "$DIFF" | wc -c)
    if [ $SIZE -gt 50000 ]; then
      echo "PR が大きすぎるためAIレビューをスキップします(${SIZE} chars)"
      exit 0
    fi

レビュー対象ファイルの絞り込み

# テストファイルとドキュメントを除外
git diff origin/$BASE..HEAD -- '*.ts' '*.py' ':!*.test.ts' ':!*.spec.ts' ':!docs/'

既存ツールとの組み合わせ

steps:
  - name: ESLint(機械的チェック)
    run: npx eslint . --format json > eslint-results.json || true

  - name: AI Review(高レベルの判断)
    # ESLint の結果も含めてAIに送る

注意点

  • AI は確定的なレビューをしない。誤検知・見逃しは発生する
  • 最終判断は人間のレビュアーが行う
  • センシティブなコードを外部APIに送ることへの社内ポリシーを確認する
  • API コストはDiff サイズとモデルに依存(目安: 10KB の diff で Sonnet 4.6 使用時 $0.01〜0.05、Opus 4.6 使用時 $0.03〜0.08)

まとめ

AI コードレビューは人間レビューの補助ツールとして有効です。単純なバグパターンやセキュリティ問題を事前に検出することで、人間のレビュアーはより本質的な設計・ロジックの議論に集中できます。完全自動化を目指すのではなく、「人間のレビューをより効率的にするための前段階」として活用するのが現実的です。


参考: Anthropic API / GitHub Actions 公式