第7章:AI支援によるコードレビュー実践
7.1 第2章のPRテンプレートを使った実装
この章で扱う「AIレビュー」の前提
この章では、GitHub Copilotの code review(PRレビュー支援) を中心に扱います。AIレビューは有効ですが、誤検知/見落としがあり得るため、最終判断と責任は人間側に残します。
この章の例の読み方
本章では、例を次の2種類に分けて示します。
- 実運用例(このまま使える):
examples/配下にあるファイル(Issue/PRテンプレート、copilot-instructions.md等)。必要に応じて自分のリポジトリ事情に合わせて調整して使います。 - 概念例(擬似):考え方を説明するための例。GitHubの実設定や実行環境と一致しない場合があるため、コピペ前提では扱いません。
再現性を上げるために、先に揃えるもの
AIレビューを「運用」に落とすには、レビューの前提を成果物として固定するのが効果的です。
- PRテンプレート:目的・影響範囲・テスト・ロールバック・AI利用開示・受入条件
- カスタム指示:リポジトリの規約・禁止事項・レビュー観点を
copilot-instructions.mdに集約 - チェックリスト:セキュリティ/運用/互換性など、AIが見落としやすい観点を人間の確認項目として明文化
以下のサンプルは examples/ai-agent-starter/ に同梱しています(そのままコピーして使える形)。
PRテンプレート例(抜粋)
## 目的
- 何を直す/追加するか:
- 期待するユーザー影響:
## 変更内容(概要)
-
## 影響範囲
- 影響する:
- 影響しない:
## 検証
- 自動テスト:
- 手動確認:
## ロールバック
- 失敗時の戻し方:
## AI利用の開示(必須)
- AI利用:有 / 無
- 利用範囲:下書き/実装/レビュー補助 など
- 人間が最終確認した観点:
## 受入条件(Issue)
- Closes #xxxx
.github/copilot-instructions.md 例(抜粋)
## Repository rules (must follow)
- 変更は小さく、意図が分かる単位でPRを作る
- 既存の規約(命名、ディレクトリ構成、lint)を優先する
- 秘密情報・個人情報を出力しない
## Review focus
- 仕様/受入条件との整合
- セキュリティ(`security-checklist.md` を参照)
- 破壊的変更の有無とロールバック手順
有効化・設定(公式手順への参照)
Copilotのcode reviewは、プランや組織設定によって利用可否が変わります。設定手順は変更され得るため、公式ドキュメントを参照してください。
- Copilot code review: https://docs.github.com/en/copilot/concepts/agents/code-review
- Using Copilot code review: https://docs.github.com/en/copilot/using-github-copilot/code-review/using-copilot-code-review
- Custom instructions: https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot
7.2 自動レビューコメントの活用
重要:誤検知/見落としを前提に扱う
AIレビューは「気づきの補助」です。次の2点を前提に、運用として扱います。
- 誤検知(false positive):問題に見えるが問題ではない指摘が混ざる → 受入条件/仕様/一次情報に戻って判断する
- 見落とし(false negative):問題があるのに指摘されないことがある → テスト/静的解析/人間レビューの責務で担保する
レビューコメントの種類
以下は、Copilotが出し得るコメントの「イメージ」を示す概念例です。実際の指摘内容や文言は環境や更新によって変わり得ます。
1. セキュリティ指摘
# PR内のコード
def connect_to_database(password):
conn_string = f"postgresql://user:{password}@localhost/db"
return psycopg2.connect(conn_string)
# Copilotのコメント
"""
🔒 Security Issue: SQL接続文字列にパスワードを直接埋め込むのは
セキュリティリスクがあります。環境変数や設定ファイルの使用を検討してください。
Suggested fix:
```python
def connect_to_database():
password = os.environ.get('DB_PASSWORD')
conn_string = f"postgresql://user:{password}@localhost/db"
return psycopg2.connect(conn_string)
```
"""
2. パフォーマンス改善
# PR内のコード
def process_images(image_list):
results = []
for img in image_list:
processed = cv2.resize(img, (224, 224))
results.append(processed)
return results
# Copilotのコメント
"""
⚡ Performance: リスト内包表記またはNumPy配列の事前割り当てを使用すると
パフォーマンスが向上する可能性があります。
Suggested optimization:
```python
def process_images(image_list):
return [cv2.resize(img, (224, 224)) for img in image_list]
# または大量の画像の場合:
def process_images_batch(image_list):
results = np.empty((len(image_list), 224, 224, 3), dtype=np.uint8)
for i, img in enumerate(image_list):
results[i] = cv2.resize(img, (224, 224))
return results
```
"""
3. コードスタイル
# PR内のコード
def calculate_metrics(y_true,y_pred,threshold = 0.5):
tp=np.sum((y_true==1)&(y_pred>=threshold))
return tp
# Copilotのコメント
"""
📝 Style: PEP 8準拠のためのフォーマット改善を推奨します。
Suggested style improvements:
```python
def calculate_metrics(y_true, y_pred, threshold=0.5):
"""Calculate true positives for binary classification."""
tp = np.sum((y_true == 1) & (y_pred >= threshold))
return tp
```
- スペースの追加
- docstringの追加
- 意味のある変数名の使用を検討
"""
コメントへの対応方法
インライン返信
# 開発者の返信例
ご指摘ありがとうございます。セキュリティの観点は重要なので、環境変数を使用するように修正しました(commit: abc123)。
また、設定ファイルのサンプルも追加しました。
一括対応
# Copilotの複数の指摘に対して
"""
## 対応内容
1. ✅ セキュリティ: 環境変数に変更 (commit: abc123)
2. ✅ パフォーマンス: バッチ処理実装 (commit: def456)
3. ⏸️ スタイル: 次のPRで対応予定 (issue #123)
"""
7.3 人間のレビューとAIレビューの使い分け
レビューの役割分担
AIレビューが得意な領域
- 構文とスタイル
- PEP 8, ESLint準拠
- 命名規則
- インデント、空白
- 一般的なパターン
- よくあるバグパターン
- セキュリティのアンチパターン
- パフォーマンスの問題
- 定量的な分析
- 複雑度の計算
- テストカバレッジ
- 依存関係の分析
人間のレビューが必要な領域
- ビジネスロジック
- 要件との整合性
- ドメイン知識
- エッジケースの考慮
- アーキテクチャ
- 設計の妥当性
- 将来の拡張性
- 技術選定
- コンテキスト
- プロジェクトの経緯
- チームの慣習
- 技術的負債
ハイブリッドレビューワークフロー
graph LR
A[PR作成] --> B[(任意)Copilot code review]
B --> C[人間レビュー(仕様/リスク判断)]
C --> D[CI(テスト/静的解析)]
D --> E{要修正?}
E -->|Yes| F[修正→再レビュー]
E -->|No| G[承認→マージ]
レビュー優先順位の設定
以下は「考え方」を示す概念例です。実際に強制する場合は、rulesets/branch protection とCODEOWNERS(必要な承認者/必要なチェック)で表現します。
# .github/review-priority.yml
priority_rules:
critical:
- path: "src/security/**"
- path: "src/payment/**"
- keyword: ["password", "token", "secret"]
requires:
- human_review: 2 # 2人の人間レビュー必須
- ai_review: "detailed"
standard:
- path: "src/**"
requires:
- human_review: 1
- ai_review: "standard"
low:
- path: "tests/**"
- path: "docs/**"
requires:
- human_review: 0 # 任意
- ai_review: "basic"
7.4 セキュリティは「AIレビュー + 静的解析 + ルール」で担保する
Copilotのレビューは、セキュリティ観点の気づきに役立つことがありますが、セキュリティ検査の代替ではありません。止めたいリスクは、CI(静的解析/テスト)と運用ルールで担保します。
静的解析(CodeQL等)との役割分担(概要)
- Copilot code review:差分の読みやすさ、一般的なアンチパターン、レビュー観点の補助
- CI(テスト/静的解析):規約違反・既知パターンの検出、ブロッキング(必須チェック)
- 人間レビュー:仕様/受入条件、トレードオフ、リスク許容、ロールバック判断
静的解析の詳細は、第8章(GitHub Advanced Security)を参照してください。
セキュリティのレビュー観点(例)
以下は「見落としやすい典型例」です。AIが指摘しない場合もあるため、チェックリスト化して人間の責務として残します。
1. インジェクション(例)
# 脆弱になり得る例(文字列連結)
def search_users(query):
sql = f"SELECT * FROM users WHERE name = '{query}'"
return db.execute(sql)
# 対応例(パラメータ化)
def search_users_safe(query):
sql = "SELECT * FROM users WHERE name = ?"
return db.execute(sql, (query,))
2. 認証・認可(例)
# 脆弱になり得る例(認可チェックの抜け)
@app.route('/admin/users')
def admin_users():
return render_template('admin_users.html', users=get_all_users())
3. 機密情報の露出(例)
# 脆弱になり得る例(ログへの機密出力)
logger.info(f"User login attempt: {username}, password: {password}")
セキュリティ観点のサマリーを残す(例)
AIレビュー/人間レビュー/CIの結果を混ぜず、一次情報(CI結果や根拠リンク)に寄せてPRに残します。
## Security review summary(例)
- CI(CodeQL等)の結果:リンク/結果
- 追加で確認した観点:auth、入力検証、ログ、依存関係 など
- リスクと受容判断:この変更で受けるリスク/避けるリスク
- ロールバック:戻し方、影響範囲
7.5 クォータ/コストを踏まえた運用設計
Copilotのcode reviewは、プランや組織設定によってクォータ等の制約があります。全PRに無条件で適用する前提ではなく、対象を選ぶ運用が現実的です。
どのPRでAIレビューを使うか(例)
- 優先(高リスク):認証/認可、暗号、決済、権限、ネットワーク境界、データ移行、運用手順の変更
- 選択(中リスク):主要な仕様変更、パフォーマンス影響が大きい変更、依存関係の更新
- 省略(低リスク):誤字修正、コメント整形、単純なリファクタ(ただし例外あり)
クォータ枯渇/失敗時の代替フロー
- まずCI(必須チェック)を優先する(テスト/静的解析)
- 人間レビューで「受入条件」と「リスク」を先に確定する
- AIレビューは「使えるときに、観点補助として追加」する(前提が逆転しないようにする)
最小の運用指標(例)
定量は「断定値」ではなく、改善サイクルの材料として扱います。
- 初回レビューまでの時間(Time to first review)
- 修正ラウンド数(レビュー→修正→再レビュー)
- 重大指摘の流入元(人間/AI/CIのどれで検出されたか)
- ロールバック発生の有無(リスク判断の妥当性)
まとめ
本章の要点は次のとおりです。
- Copilot code review は「気づきの補助」であり、最終判断と責任は人間側に残る
- 再現性は、PRテンプレ・カスタム指示・チェックリストで担保する
- セキュリティはAIレビューだけに依存せず、CI(静的解析/テスト)とルールで担保する
- クォータ等の制約を前提に、AIレビューを使うPRを選ぶ
次章(第8章)では、GitHub Advanced Securityによる静的解析・セキュリティ運用を扱います。
確認事項
- 章の冒頭で示した「テンプレ/指示/チェックリスト」の役割を説明できる
- 誤検知/見落としを前提に、AIレビューの結果を扱える
- セキュリティはCIと運用ルールで担保する設計にできる
- クォータ等の制約を前提に、AIレビューの適用範囲を決められる