Cloudflare打造CI原生AI程式碼審核系統,大幅縮短審核等待時間並提升工程品質
Cloudflare打造CI原生AI程式碼審核系統,大幅縮短審核等待時間並提升工程品質。
Cloudflare開發基於「OpenCode」的CI原生AI程式碼審核系統,取代傳統人工審核的瓶頸,讓合併請求(merge request)立即獲得多位專門Agent的評估。此系統已在內部數萬個合併請求上運行,能自動批准乾淨程式碼、精準標記真實錯誤,並在偵測嚴重問題時阻擋合併,作為「Code Orange: Fail Small」工程韌性提升的一部分。
傳統審核痛點
傳統程式碼審核雖能捕捉錯誤並分享知識,卻是工程團隊可靠的瓶頸:合併請求排隊等待,審核者需切換上下文閱讀差異(diff),常挑剔變數命名等瑣事,作者回應後循環重複。在Cloudflare內部專案中,首次審核中位等待時間常以小時計。
市售工具不足
初期實驗市售AI程式碼審核工具,許多表現不錯且提供客製化,但對Cloudflare規模而言,靈活性和客製化始終不足,無法滿足需求。
自製粗糙方法失敗
接著嘗試抓取git diff塞入半成品提示,詢問大型語言模型找錯。結果如預期般雜訊氾濫:充斥模糊建議、幻覺語法錯誤,以及對已有錯誤處理的函式建議「考慮加入錯誤處理」。團隊迅速意識到,單純摘要方法無法處理複雜程式庫,尤其在大規模程式碼庫中。
OpenCode架構選擇
不從頭建構單體審核Agent,而是圍繞開源編碼Agent「OpenCode」打造CI原生協調系統。當工程師開啟合併請求,即啟動最多七位專門審核Agent,涵蓋安全性、效能、程式碼品質、文件、發行管理及內部「Engineering Codex」相容性。協調Agent負責重複剔除發現、評判嚴重度,並發佈單一結構化審核評論。
插件架構設計
為支援數千程式庫,避免硬編碼版本控制系統或AI提供者,採用可組合插件架構。入口點將所有配置委託插件組成,定義審核流程。執行流程分三階段:
- Bootstrap鉤子並行執行、非致命(模板擷取失敗仍繼續)。
- Configure鉤子依序執行、致命(VCS無法連GitLab即中止)。
- postConfigure處理非同步工作,如擷取遠端模型覆寫。
ConfigureContext提供受控介面:註冊Agent、加入AI提供者、設定環境變數、注入提示區段、調整Agent權限。插件無直接存取最終配置,透過上下文API貢獻,核心組譯器合併成OpenCode消耗的opencode.json檔案。此隔離讓GitLab插件不知Cloudflare AI Gateway配置,反之亦然,所有VCS耦合限於單一ci-config.ts檔案。
OpenCode內部運用
選擇OpenCode因:
- 內部廣泛使用,團隊熟悉。
- 開源,便貢獻功能與修復(撰文時Cloudflare工程師已上游合併逾45個pull request)。
- 優異開源SDK,便建置無縫插件。
- 以伺服器為主結構,文字介面與桌面App為客戶端,便程式化建立工作階段、經SDK發送提示、多工作階段並行收集結果,無需駭CLI介面。
協調分兩層: - 協調程序:用Bun.spawn衍生OpenCode子程序,經stdin傳協調提示(避開命令列ARG_MAX限制,大型合併請求描述常觸發E2BIG錯誤)。以--format json執行,stdout輸出JSONL事件。
- 審核plugin:在OpenCode程序內,提供spawn_reviewers工具。協調LLM呼叫時,經SDK啟動子審核者工作階段。各子審核者獨立工作階段與Agent提示,協調Agent不見或控其工具;子審核者可讀源檔案、執行grep、搜尋程式庫,結束時回傳結構化XML發現。
JSONL結構化記錄
JSONL(每行獨立JSON物件)解決結構化記錄挑戰:不像標準JSON需完整關閉,無需解析整份文件或擔心緩衝巨量payload、遺失結束符(子程序記憶體耗盡時)。串流管線即時處理協調輸出,每100行或50ms緩衝刷新,避免appendFileSync拖垮磁碟。監控觸發器:從step_finish擷取token使用追蹤成本;error事件啟動重試;偵測reason: "length"(max_tokens上限截斷)自動重試。未預期營運痛點:Claude Opus 4.7或GPT-5.4等大型模型思考久,看似卡住,使用者頻取消抱怨。解決以每30秒心跳記錄「Model is thinking... (Ns since last output)」,幾乎根除問題。
專門Agent分工
避開單一巨型提示,拆分領域專屬Agent,各有嚴格範疇提示,明確指示檢查與忽略項目。安全性審核者僅標「可利用或具體危險」問題。提示工程價值在告知LLM「不做什麼」:無邊界即噴湧理論警告,開發者學會忽略。每審核者產結構化XML發現,分嚴重度:critical(致宕機或可利用)、warning(可測退化或具體風險)、suggestion(值得考慮改善)。確保下游行為驅動結構化資料,而非解析建議文字。
模型分配策略
依Agent複雜度分配,避免每任務用昂貴頂級模型:
- 頂級:Claude Opus 4.7與GPT-5.4,專供審核協調者(讀七模型輸出、重複剔除、濾假陽性、最終判斷,需最高推理)。
- 標準:Claude Sonnet 4.6與GPT-5.3 Codex,用於重任子審核者(程式碼品質、安全性、效能),快速廉價、擅長邏輯錯誤與漏洞。
- Kimi K2.5:輕量文字任務,如文件審核者、發行審核者、AGENTS.md審核者。
提示注入防護
Agent提示運行時串接專屬markdown與共享REVIEWER_SHARED.md(強制規則)。協調輸入提示縫合MR中繼資料、評論、先前審核發現、diff路徑、客製指示成結構化XML。消毒使用者控制內容:剝除邊界標籤如
token節省機制
不嵌入完整diff至提示,而是寫per-file patch至diff_directory,傳遞路徑;子審核者僅讀相關領域檔案。從協調提示擷取共享上下文(shared-mr-context.txt)寫盤,子審核者讀取而非重複完整MR上下文,避免中等MR上下文乘以7倍token成本。
協調者整合角色
子審核者結束後,協調執行judge pass:
- 重複剔除:相同問題僅保留最適區段。
- 重新分類:程式碼品質審核標記的效能問題移至效能區段。
- 合理性濾鏡:投機問題、瑣挑、假陽性、違反慣例發現遭棄。若不確定,協調用工具讀源程式碼驗證。
偏好批准:單一警告仍approved_with_comments而非阻擋。生產系統置於工程師發佈路徑,設逃生艙:人類審核者評論「break glass」強制批准(熱修補時需),系統審核前偵測追蹤遙測,避免潛在錯誤或LLM提供者中斷。
風險等級分類
依diff大小與性質分三風險等級,避免一行README拼字修正耗費七Agent頂級token:
- 安全敏感檔案(auth/、crypto/或聽似安全路徑)永遠全審核,寧多花token不漏漏洞。
- 其他依規模調整Agent數。
diff過濾管線
Agent見碼前,過濾雜訊:鎖定檔、供應商依賴、最小化asset、source maps。掃描首幾行標記如// @generated或/* eslint-disable */剔除生成檔,但明確豁免資料庫遷移(遷移工具常標生成,然含需審核架構變更)。
spawn_reviewers工具
管理最多七並行審核者工作階段生命週期,含斷路器、故障回退鏈、每任務逾時、重試邏輯,實為微型LLM工作階段排程器。
此系統證明將LLM置入CI/CD關鍵路徑的工程挑戰可解:從插件隔離、JSONL串流、專門分工到風險分級,皆確保規模化運行,助Cloudflare工程師更快、更安全發佈程式碼。
Learn about how we built a CI-native AI code reviewer using OpenCode that helps our engineers ship better, safer code. https://t.co/X1bm2t0VK0
— Cloudflare (@Cloudflare) April 20, 2026
