コードレビューの自動化:AI搭載PR-AgentとGitHub Actionsを6ヶ月運用してみた結果

AI tutorial - IT technology blog
AI tutorial - IT technology blog

開発パイプラインにおける実世界でのAI活用

6ヶ月前、私たちのチームは「プルリクエスト(PR)疲れ」という共通のボトルネックに直面していました。毎日数十件のPRが作成される中、シニアエンジニアはルーチン的な構文チェックや基本的なロジックの検証に数時間を費おしており、微妙なアーキテクチャの欠陥を見逃してしまうことがよくありました。そこで、AIが本当に重労働をこなせるかどうかを確かめるため、CodiumAIのPR-AgentをGitHub Actionsのワークフローに統合することにしました。本番環境で半年運用した結果、私たちのCI/CD戦略は根本から変わり、AI駆動のテスト自動化の重要性を再認識することになりました。

従来のリンターや静的解析ツールは、フォーマットの問題や非推奨のメソッドを検出することには優れていますが、開発者の「意図」までは理解できません。ビジネスロジックに、チェックアウトプロセスをクラッシュさせるような欠陥があるかどうかは分からないのです。そこでAI駆動のレビューが登場します。コードの品質を犠牲にすることなく開発チームをスケールさせたいのであれば、AIを活用したコード最適化とリファクタリングはマスターすべき不可欠なスキルの1つです。

クイックスタート:5分で完了するセットアップ

リポジトリでPR-Agentを稼働させるのは驚くほど簡単です。複雑なサーバーをホストする必要はありません。GitHub Actionsが最適な環境を提供してくれます。

ステップ1:APIキーを取得する

OpenAI(最高の結果を得るにはGPT-4oを推奨)やAnthropicなどのプロバイダーからAPIキーを取得する必要があります。キーを取得したら、GitHubリポジトリのSettings > Secrets and variables > Actionsに移動し、OPENAI_API_KEYという名前で新しいシークレットを追加します。

ステップ2:ワークフローファイルを作成する

.github/workflows/pr_agent.ymlにファイルを作成し、以下の設定を貼り付けます。

name: AI Code Review # AIコードレビュー

on:
  pull_request:
    types: [opened, reopened, synchronized]
  issue_comment:
    types: [created]

jobs:
  pr_agent_job:
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: write
      contents: write
    name: Run PR-Agent # PR-Agentを実行
    if: contains(github.event.comment.body, '/review') || github.event_name == 'pull_request'
    steps:
      - name: PR-Agent action # PR-Agentアクション
        uses: Codium-ai/pr-agent @main.py
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_REVIEWER.REQUIRE_SCORE_REVIEW: "true"
          PR_DESCRIPTION.PUBLISH_DESCRIPTION_AS_COMMENT: "true"

プッシュされると、新しいPRごとにAIから詳細な概要と予備的なコードレビューが自動的に届きます。また、PRのスレッドで/review/describeとコメントすることで、特定のコマンドをトリガーすることもできます。

ディープダイブ:単純な構文チェックを超えて

なぜ別のツールを導入するのでしょうか? その真価は、深夜のレビューセッションで人間が見落としがちなロジックバグをPR-Agentが特定したときに発揮されます。これまでに、ユニットテストをパスしたもののエッジケースで失敗したであろう、Goルーチンにおけるレースコンディションや、Pythonのリスト内包表記におけるオフバイワンエラー(1の差によるエラー)を検出するのを目の当たりにしてきました。こうした本番環境でのAIの失敗を防ぐ方法を実務レベルで理解しておくことは極めて重要です。

セマンティック(意味的)理解 vs パターンマッチング

標準的なCIツールはパターンマッチングを使用します。禁止されている関数を見つけるとフラグを立てますが、PR-Agentはセマンティック理解を使用します。コードを読み、変更の文脈を理解し、なぜ特定のアプローチがリスクを伴う可能性があるのかを説明してくれます。例えば、データベースのスキーマを更新したのに、APIレイヤーで対応するバリデーションロジックの更新を忘れていることに気づいてくれるかもしれません。

自動PR説明文

私たちのチームで最も評価されている機能の1つが/describeコマンドです。これは、変更されたファイルのリストやコードの意図を含む、変更の構造化されたサマリーを生成します。これにより、開発者は説明文を書く時間を10〜15分節約でき、レビュアーは最初のファイルを開く前に何をチェックすべきかを正確に把握できます。

高度な使い方:AIの動作をカスタマイズする

デフォルトの状態では、AIは少しおしゃべりすぎる場合があります。エンタープライズ環境で真に効果を発揮させるには、動作を微調整する必要があります。これには、リポジトリのルートに.pr_agent.tomlファイルを追加します。

[pr_reviewer]
# ロジックとセキュリティのみに集中する
inline_code_comments = true
extra_instructions = "並行処理の問題とSQLインジェクションのリスクに焦点を当ててください。命名規則の議論は無視してください。"

[pr_description]
# 説明文にカスタムテンプレートを使用する
final_update_message = false
custom_labels = ["bugfix", "feature", "docs", "refactor"] # バグ修正, 機能追加, ドキュメント, リファクタリング

異なるモデルとの統合

デフォルトはGPT-4oですが、私はClaude 3.5 Sonnetも試してみました。テストの結果、Claudeの方がやや控えめで簡潔なフィードバックを提供する傾向があり、チームによってはこちらを好むかもしれません。PR-Agentは複数のバックエンドをサポートしているため、予算やプライバシーの要件に応じてプロバイダーを切り替えることができます。

セキュリティとプライバシーに関する考慮事項

独自のコードをAIプロバイダーに送信することへの懸念はよくあります。これを軽減するために、コードベース全体ではなくdiff(変更点)のみを送信するようにワークフローを設定しました。さらに、エンタープライズ版のAPIを使用することで、データがプロバイダーのグローバルモデルのトレーニングに使用されないようにしています。

2026年に向けた実践的なヒント

半年間の使用を経て、AIを邪魔者ではなく助けにするためのいくつかの戦略をまとめました:

  • 「最初のパス」ルール: AIによるレビューを「最初のパス」として扱います。人間は、AIがゴーサインを出した後、または開発者がAIの初期の指摘に対応した後にレビューを開始します。これにより、人間のレビュアーは高レベルのアーキテクチャに集中できます。
  • コメントの過負荷を避ける: AIが些細な詳細までコメントしすぎると感じる場合は、extra_instructions設定を使用して、重要度の高い問題のみを報告するように指示します。
  • コストの監視: すべてのコミットでLLMを実行するとコストがかさむ可能性があります。私たちは、すべてのプッシュ時ではなく、特定のラベル(例:「needs-review」)がPRに追加されたときにのみ、フルバージョンの/reviewを実行するようにワークフローを最適化しました。
  • チームへの教育: AIが最終的な決定権を持っているわけではないことを全員に周知します。誤検知が発生することもあります。開発者がAIの意見に同意できない場合は、PRのコメントでその理由を説明するように促すべきです。これは他のメンバーの学習にも役立ちます。

CI/CDへのAI統合はもはや未来の話ではありません。今すぐ利用できる、DevOpsとSysAdminのワークフローのためのAI搭載CLIツールのような生産性の倍増ツールです。コードレビューの日常的な部分を自動化することで、毎週何時間ものエンジニアリング時間を節約しながら、自動化ワークフロー構築方法を洗練させ、ステージング環境に到達するロジックバグの数を大幅に減らすことができました。

Share: