AIによる自動コードレビュー機能実装@Github

🧠 ChatGPT自動コードレビュー機能について

✅ 概要

この機能は、GitHubのPull Request(PR)に対して、ChatGPTが自動でコードレビューコメントを投稿するものです。

レビュー観点は「変更内容の要約」「バグ・非効率・改善点の指摘」「問題なしの明示」です。

⚙️ 仕組み(技術構成)

  • トリガー:PR作成時または更新時(差分あり)
  • 実行環境:GitHub Actions(.github/workflows/chatgpt-review.yml)
  • 処理内容
    1. git diff origin/main…HEAD で変更差分を取得
    2. 差分をOpenAI APIへ送信し、レビュー内容を生成
    3. PRのコメント欄に結果を自動投稿
  • 使用技術
    • openai>=1.0.0 に準拠(最新API)
    • GitHub Actions(permissions: pull-requests: write)
    • chatgpt_review.py スクリプトで差分取得〜投稿まで制御

🎯 主な用途とメリット

用途説明
✅ PRの初期チェック人手レビュー前に構文・ロジック・安全性の粗チェックが可能
✅ バグの早期発見ChatGPTが 0除算 や 未処理の例外 などを指摘してくれる
✅ 要約生成で把握が楽になるChatGPTが差分の目的を要約 → 内容理解が高速化
✅ レビュー工数の削減ChatGPTがベースレビュー → 人は最終判断に集中可能

🔧 ChatGPT自動コードレビュー 実装手順(GitHub Actions)


🔑 事前準備(1回だけでOK)

① OpenAI APIキーを取得

  • OpenAIの APIページ でAPIキーを発行
  • セキュリティのため、個人キーではなくチームで管理されたキーを使用推奨

② GitHub Secretsに登録

リポジトリの設定 → 「Secrets and variables」→「Actions」→「New repository secret」

名前値(Value)例
OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxx
GITHUB_TOKENデフォルトで自動付与されてるので設定不要

🧾 実装ステップ

③ chatgpt_review.py をプロジェクトルートに追加

# chatgpt_review.py

import os
import subprocess
import requests
from openai import OpenAI

# OpenAI クライアントの初期化
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# GitHub環境変数
github_token = os.environ["GITHUB_TOKEN"]
repo = os.environ["REPO_NAME"]
pr_number = os.environ["PR_NUMBER"]

# 差分取得
result = subprocess.run(
    ["git", "diff", "origin/main...HEAD"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True
)
diff = result.stdout.strip()

# 長すぎるdiff対策
if len(diff) > 8000:
    diff = diff[:8000] + "\n\n...(差分が長いため一部省略)"

# プロンプト生成
if not diff:
    review_comment = "✅ 差分がありませんでした。レビュー対象の変更が見つかりません。"
else:
    prompt = (
        "以下はGitHubのPull Requestのコード差分です。\n"
        "- 要約を作成してください。\n"
        "- 問題点、非効率なコード、不具合の可能性があれば指摘してください。\n"
        "- 問題がなければ『問題なし』と明記してください。\n\n"
        "```diff\n"
        f"{diff}\n"
        "```"
    )

    try:
        response = client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.2,
        )
        review_comment = response.choices[0].message.content.strip()
        if not review_comment:
            review_comment = "✅ 問題なし(ChatGPTからの応答が空でした)"
    except Exception as e:
        review_comment = f"❌ ChatGPT APIエラー: {str(e)}"

# コメント投稿
url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments"
headers = {
    "Authorization": f"token {github_token}",
    "Accept": "application/vnd.github.v3+json"
}
data = {"body": review_comment}
res = requests.post(url, json=data, headers=headers)

print("=== 投稿結果 ===")
print(res.status_code)
print(res.text)

④ GitHub Actionsのワークフローファイル追加

.github/workflows/chatgpt-review.yml に以下を追加:

name: ChatGPT Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest

    # ✅ PRにコメント投稿するにはこれが必須!
    permissions:
      contents: read
      pull-requests: write

    steps:
    - name: Checkout code
      uses: actions/checkout@v3
      with:
        fetch-depth: 0  # ✅ 差分取得に必要

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install -y diffutils
        pip install --upgrade pip
        pip install openai requests

    - name: Run ChatGPT Review
      run: python3 chatgpt_review.py
      env:
        OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        PR_NUMBER: ${{ github.event.pull_request.number }}
        REPO_NAME: ${{ github.repository }}

🧪 テスト方法

  1. main ブランチを作成・更新
  2. 新しいブランチを切ってファイル変更(例:test.py編集)
  3. PRを作成
  4. 数秒後、自動でPRコメントにChatGPTのレビュー結果が投稿される

🔁 よくあるエラー対策

エラー内容対処法
openai.ChatCompletion は使えないopenai>=1.0.0 では client.chat.completions.create() を使う
投稿が403で失敗するpermissions: pull-requests: write を明記する
差分が取得されないfetch-depth: 0 を必ず checkout に追加

📌 備考

  • 対応しているのは 差分レビューのみ
  • ChatGPTが使うモデルは “gpt-4″(必要に応じて “gpt-4o” などに変更可能)
  • chatgpt_review.py をカスタマイズすることで、独自チェック項目も導入可能

✅ シークレット設定(GitHubで1回だけ)

名前	内容
OPENAI_API_KEY	sk-xxx... を登録(必須)
GITHUB_TOKEN	GitHubが自動で発行するので不要

🔒 登録場所 → GitHubのリポジトリ「Settings」→「Secrets and variables」→「Actions」
📁 プロジェクトルート/
├── chatgpt_review.py           👈 Pythonスクリプト(最新版API使用)
└── .github/
    └── workflows/
        └── chatgpt-review.yml  👈 このYAMLファイル

お問い合わせ

お問い合わせいただきありがとうございます。以下のフォームにご記入いただくか、お電話にてお問い合わせください。営業日においては、お問い合わせいただいた内容について、24時間以内に回答いたします。