Claude Code GitHub Actions 可以在 Issue 或 Pull Request 中響應 @claude,也可以在 PR 開啟或更新時自動執行 /review。它適合補充人工 Review,但預設示例不能直接等同於生產安全配置。
真正需要設計的是觸發條件、GitHub Token 許可權、模型憑據、允許工具、提示詞來源、Fork PR 和費用上限。配置過寬時,一個普通評論就可能觸發昂貴任務;使用錯誤事件時,不可信程式碼甚至可能接觸倉庫 Secret。
本文使用 Anthropic 官方 anthropics/claude-code-action@v1 介面,先建立按需觸發,再新增自動審查。示例中的模型 ID不硬編碼,以免釋出後迅速過時;由賬戶可用模型和官方當前文件決定。
兩種工作流不要混為一談
互動式模式由評論中的 @claude 觸發,適合:
- 解釋某段變更;
- 根據 Review 意見修復程式碼;
- 從 Issue 建立實現;
- 只在人工需要時消耗模型額度。
自動模式由 pull_request 事件觸發,適合:
- 每次新 PR 做基礎檢查;
- 新提交後重新審查;
- 對關鍵目錄強制執行統一規則;
- 在人工 Review 前發現明顯問題。 小團隊建議先啟用互動模式,收集使用資料後再決定是否對每個 PR 自動執行。
準備 GitHub 和 Anthropic 許可權
你需要:
- 有權安裝 GitHub App 的倉庫管理員;
- Anthropic API Key,或受支援的 Bedrock/Vertex 配置;
- 可以建立 Actions Secret 和工作流檔案的許可權;
- 一個用於驗證的測試倉庫或測試分支。 不要用生產倉庫中的第一個真實 PR 做試驗。測試倉庫應包含幾類已知缺陷和幾段安全程式碼,以便同時觀察漏報與誤報。
官方推薦可在 Claude Code 中執行 GitHub App 安裝流程;若自動安裝失敗,也可以手動安裝 Claude GitHub App,建立 Secret,再新增工作流。
建立 ANTHROPIC_API_KEY Secret
在 GitHub 倉庫進入:
|
|
Secret 名稱使用:
|
|
值只貼上一次,不要儲存到工作流、CLAUDE.md、Issue 或本地示例檔案。
組織倉庫可以使用 Organization Secret,但要限制可訪問倉庫,而不是預設開放給所有倉庫。
定期輪換 Key,並在 Anthropic 控制檯觀察異常使用。刪除工作流並不會自動撤銷已經洩露的 Key。
先部署按需 @claude 模式
建立 .github/workflows/claude.yml:
|
|
該示例有意使用 contents: read。如果你希望 Claude 直接提交程式碼或建立分支,需要增加寫許可權,但應在確認只讀流程安全後再做。
提交工作流後,在測試 Issue 中輸入:
|
|
檢查 Actions 日誌、回覆賬號、持續時間和模型費用。
自動 PR Review 工作流
另建 .github/workflows/claude-review.yml:
|
|
synchronize 會在 PR 推送新提交時觸發。cancel-in-progress: true 可以取消同一 PR 的舊審查,避免連續推送產生重複費用和過時評論。
timeout-minutes 是 GitHub Job 上限,--max-turns 是 Claude 執行回合限制,兩者都要配置。
為什麼不建議直接寫 contents: write
程式碼審查只需要讀取內容並寫入 PR 評論。開放 contents: write 會讓 Action 獲得修改倉庫內容的能力,超出單純 Review 的需要。
許可權應按任務拆分:
| 任務 | 建議許可權 |
|---|---|
| 讀取程式碼 | contents: read |
| 評論 PR | pull-requests: write |
| 回覆 Issue | issues: write |
| 建立提交 | 單獨工作流評估後開放 |
| 訪問其他倉庫 | 不預設授予 |
| 倉庫預設 Token 許可權也應設為只讀,個別工作流再顯式提升。 |
如果使用自定義 GitHub App,檢查 App 的 Contents、Issues、Pull requests 許可權,不要勾選 Administration、Secrets 或組織管理許可權。
Fork PR 是最容易踩的安全坑
來自外部 Fork 的 pull_request 工作流通常拿不到倉庫 Secret,這是 GitHub 用來保護憑據的限制。
不要為了讓外部 PR 自動審查而簡單改成:
|
|
pull_request_target 在目標倉庫上下文執行並能訪問 Secret。如果隨後檢出 Fork 提交併執行其中程式碼,攻擊者可能竊取 Token 和 API Key。
安全選擇包括:
- 外部 Fork 只做不需要 Secret 的靜態檢查;
- 維護者確認後透過受控命令觸發;
- 不執行 PR 中的指令碼、構建步驟和自定義 Action;
- 將 AI Review 放在隔離、低許可權的人工批准環境;
- 對內部成員和外部貢獻者使用不同工作流。 任何能修改工作流本身的 PR 都應額外謹慎。
用 CLAUDE.md 定義倉庫規則
在倉庫根目錄建立 CLAUDE.md,寫入短而可驗證的要求:
|
|
規則要針對倉庫真實故障模式。不要複製幾百行通用風格指南,否則模型注意力會被稀釋,Token 也會增加。 程式碼風格問題優先交給 ESLint、Ruff、golangci-lint、Checkstyle 或格式化工具,Claude 集中處理上下文相關問題。
自定義 Review 提示
若 /review 太寬,可以使用 prompt:
|
|
不要要求它“一定找出五個問題”。這種指標會誘導模型產生低質量評論。 也不要把 PR 標題或評論直接拼接成系統指令。使用者提交的文字屬於不可信輸入。
限制工具與回合
官方 Action 的 claude_args 可以傳遞 CLI 引數,例如 --max-turns、--model、--mcp-config 和允許工具。
審查任務通常不需要寫檔案、執行部署或訪問外部系統。僅開放讀取和搜尋所需能力。 示意寫法:
|
|
允許工具名稱和語法可能隨 Claude Code 版本變化,提交前要與官方當前文件核對。 MCP Server 會擴大可訪問資料範圍。不要把生產資料庫、工單系統或雲管理 MCP 接入普通 PR Review。
路徑過濾減少無效執行
純文件或依賴鎖檔案變更可能不值得執行昂貴審查。可以在事件層限定路徑:
|
|
但路徑排除不能過度。認證配置、基礎設施程式碼和 CI 工作流本身也可能很關鍵。 大型 Monorepo 可以為前端、後端和基礎設施使用不同工作流與規則,避免把整個倉庫上下文塞進一次審查。
防止評論重複和過期
同一 PR 連續 Push 時,舊審查可能還沒完成。使用併發組取消舊 Job只是第一步。 還要在提示中要求只評論當前 Head SHA,並在人工處理評論前核對它對應的提交。 如果 Action 支援更新現有摘要而不是不斷新增評論,優先使用官方推薦方式。否則可以把詳細結果放在一次 Review 中,避免每個問題生成獨立噪聲。 過期評論不要自動標記為已解決,除非能確認相關程式碼確實變化。
怎樣評價 Review 質量
準備至少 10 個小 PR,覆蓋:
- 正常功能變更;
- 空值或邊界錯誤;
- 許可權檢查遺漏;
- SQL 注入或 XSS;
- 資源洩漏;
- 併發競態;
- 缺失測試;
- 只有格式變化;
- 生成程式碼變化;
- 安全但看起來可疑的程式碼。 每條評論標記為:確認問題、可能問題、誤報、無法驗證。 計算兩個最實用指標:
|
|
同時記錄漏報。評論很少不等於質量高,可能只是 Recall 很低。
成本控制要記錄到 PR 級別
每週統計:
- 自動觸發次數;
- 被取消的重複任務;
- 平均執行時間;
- 平均 Token 或費用;
- 每個有效問題的成本;
- 沒有程式碼價值的執行次數。 降低費用的順序通常是:
- 減少無關觸發;
- 縮小檔案範圍;
- 取消過時任務;
- 限制回合;
- 調整模型;
- 最佳化規則長度。
只換便宜模型卻繼續對每次文件 Push 全庫審查,節省有限。
將結果設為合併門禁之前
前兩到四周把 Claude Review 作為非阻斷檢查。人工 Reviewer 可以參考,但不要求所有 AI 評論都解決。 只有同時滿足下列條件才考慮門禁:
- 結果在多次執行中穩定;
- 誤報率可接受;
- 評論能對應當前提交;
- 工作流失敗有明確降級方式;
- API 故障不會永久阻塞緊急修復;
- 團隊知道如何申訴錯誤評論;
- 費用和延遲有預算。 即使成為門禁,也應讓確定性測試、靜態分析和人工審批保持獨立。
常見錯誤
Action 沒有響應 @claude
檢查工作流事件是否包含當前評論型別、GitHub App 是否安裝到這個倉庫、Job 的 if 條件是否匹配,以及 Actions 是否被組織策略禁用。
ANTHROPIC_API_KEY 為空
確認 Secret 名稱完全一致。Fork PR 拿不到 Secret 通常是預期行為,不要在日誌中列印變數確認。
返回 403 或無法評論 PR
檢查 permissions 是否包含 pull-requests: write,組織是否限制 GitHub App,工作流是否由只讀上下文觸發。
每次 Push 都出現多組重複評論
增加 PR 編號併發組和 cancel-in-progress: true,確認沒有兩份相似工作流同時執行。
審查只談格式問題
在 CLAUDE.md 和提示中明確格式由 Linter 處理,要求提供可復現行為與風險路徑。
執行時間達到上限
檢查 PR 大小、允許工具、回合數和 MCP 呼叫。超大 PR 應拆分,不要僅把超時改成一小時。
一套穩妥的啟用順序
第一週只開放內部成員使用 @claude,許可權保持只讀,記錄費用與誤報。
第二週對關鍵原始碼目錄啟用自動 /review,連續 Push 自動取消舊任務。
第三週根據資料精簡 CLAUDE.md,區分安全、後端和前端規則。
之後再決定是否允許 Claude 建立修復提交,以及是否將某些結果變成合並要求。
Claude Code Review 的價值不在於評論數量,而在於用可控成本補充人工容易忽略的上下文問題。最小許可權、可復現規則和真實誤報統計,比一份看起來複雜的工作流更重要。