概要
GitLab の Merge Request コメントに特定キーワードが付いたら、ローカルの GitHub Copilot CLI を叩いて AI レビューを走らせ、その結果を MR に投稿する仕組みを Express で作りました。外部 HTTP 転送もできるので、CIやツール連携に使えます。
なぜ作ったか(背景)
- 社内のリポジトリは GitLab だが、Copilot が直接連携できず活用しきれていなかった
- GitHub Copilot を導入していないメンバーもおり、AI レビューの利用有無で品質がばらつく
- AI への指示や使い方の差でレビュー質が変わる課題を、共通フローで平準化したかった
- MR コメントにキーワードを入れるだけで、誰でも同じ Copilot CLI レビューを再現できる仕組みを用意した
何ができるか
- GitLab の
/gitlab-hookを受信し、MR コメント内のトリガー(デフォルト@copilot-test)を検知 - 条件一致時に:
- GitHub Copilot CLI へローカルの
git diffを渡してレビュー/机上デバッグを実行 - 結果を MR コメントに投稿(大きすぎる diff は自動トリム)
- GitHub Copilot CLI へローカルの
- 併せて Webhook payload を任意の
TARGET_URLに転送(タイムアウト付き) - 条件不一致は 200 で無視し、GitLab 側のリトライを防止
セットアップ
npm install
cp .env.example .env
.env の主な設定:
- 必須: TARGET_URL(転送先)、GITLAB_SECRET_TOKEN
- 任意: TRIGGER_TAG(既定
@copilot-test)、TARGET_TIMEOUT_MS - Copilot 連携:
- COPILOT_ENABLED=true
- REPO_BASE_PATH(ローカルリポジトリパス)
- COPILOT_COMMAND(例: gh copilot feedback --diff 相当の CLI 呼び出し)
- COPILOT_TIMEOUT_MS(CLI 実行タイムアウト)
起動とヘルスチェック
npm start # または npm run dev
curl http://localhost:3000/health
GitLab Webhook 設定例
- URL: http://:3000/gitlab-hook
- Token: .env の GITLAB_SECRET_TOKEN
- 対象イベント: Merge request events / Comments
- テスト: MR コメントに
@copilot-testを付けて投稿 → Copilot CLI が走り、結果が MR コメントに返る
手動検証用 curl
curl -X POST http://localhost:3000/gitlab-hook
-H "X-Gitlab-Token:$GITLAB_SECRET_TOKEN"
-H "Content-Type: application/json"
-d '{"object_kind":"note","object_attributes":{"note":"@copilot-test review please"},"merge_request":{}}'
まとめ
- GitLab MR コメントをフックに、GitHub Copilot CLI で AI レビューを自動化
- 小さな Express アプリなので既存環境に組み込みやすい
- そのまま外部サービス連携(CI 実行や通知)にも応用可能
試してみた感想や改善案があればコメントでぜひ!