§1
背景與目標
GitLab 後端 repo 缺少自動化 code review 機制。希望 MR 建立或 push 新 commit 時,自動觸發 Claude AI 審查並將結果以 comment 形式貼到 MR,作為 human reviewer 的輔助。
目標:
- MR pipeline 自動觸發,不需人工操作
- Review 結果聚焦本專案規範(DDD / RLS / jedi-* / 權限模型)
- 不阻擋 MR 合併(
allow_failure: true),僅為建議
- 無需額外依賴(原生 Node.js,不引入 npm 套件管線)
§2
需求範圍
觸發條件
- GitLab CI pipeline
rules:只在 $CI_PIPELINE_SOURCE == "merge_request_event" 觸發
- 新 MR 建立、MR 有新 commit push、MR rebase 皆會觸發
Diff 篩選規則
- 副檔名白名單:
.py, .sql, .yml, .yaml, .json
- 路徑排除:
migrations/, tests/, __pycache__/
- Diff 長度上限 80,000 chars,超過截斷並於 prompt 標註
審查面向(Claude prompt 覆蓋)
輸出格式(繁體中文 Markdown)
- 整體評分 1-10,附一句話評語
- 摘要 ≤3 句
- 問題清單:每項含檔案路徑、行號、嚴重程度(🔴 高 / 🟡 中 / 🟢 低)、說明、建議修法
- 優點:具體指出做得好的檔案 / 設計決策
行為細節
§3
架構
┌─────────────────────────────────────────────────────────────┐
│ GitLab CI Pipeline (merge_request_event 觸發) │
│ │
│ .gitlab-ci.yml │
│ └─ review stage │
│ └─ claude-review job (node:20-alpine) │
│ 1. apk add git curl jq │
│ 2. node scripts/claude-review.js │
│ 3. artifact: claude-review.md (2 weeks) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ scripts/claude-review.js (原生 Node.js) │
│ │
│ 1. git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME │
│ 2. git diff origin/<target>...HEAD │
│ → 過濾副檔名 + 排除路徑 │
│ → 80k 截斷 │
│ 3. Anthropic Messages API (claude-sonnet-4-5) │
│ 4. 寫入 claude-review.md │
│ 5. POST GitLab Notes API │
└─────────────────────────────────────────────────────────────┘
§6
安全性考量
- 子行程透過參數陣列傳入(
execFileSync('git', [...])),避免 shell injection
ANTHROPIC_API_KEY / GITLAB_TOKEN 僅透過環境變數讀取,不寫入 log 或 artifact
claude-review.md artifact 內容僅為 review 結果,不包含原始 diff
GIT_DEPTH: 0 完整抓取 commit 歷史以確保能 git fetch origin <target> 成功