Cloudflare CI 是什麼?用 Workflows 與 Sandbox 做 CI 前先看邊界
Cloudflare 最近公開的 cloudflare/ci repository,提供一個以 Workers、Workflows 與 Sandbox 組成的 Cloudflare-native CI engine。它適合想把 CI runner 放在 Cloudflare runtime、並讓流程和 Worker 或 Artifacts 事件靠近的團隊;但目前 package 版本是 0.1.0,仍應視為早期元件,不是可以直接取代所有 GitHub Actions 或既有 CI 平台的完整產品。
直接答案是:@cloudflare/ci 是給 Workers-aware bundler 使用的 TypeScript package,不是可以在本機直接執行的 Node.js CLI。 你仍要自己提供事件來源、Workflow class、路由、bindings、secret 與部署設定;官方 examples 只是可部署的參考 Worker。
Cloudflare CI 的工作分界
| 元件 | 在流程中的責任 | 導入時要自己決定的事 |
|---|---|---|
| Worker | 接收事件、提供入口、掛上 Workflow 與 bindings | route、事件驗證、環境與 account scope |
| Workflows | 排程可重試的步驟,串起 install、test、build、deploy | 步驟依賴、重試策略與副作用是否可重做 |
| Sandbox | 讓 runner 執行 shell command 與建置工作 | image、instance、備份、secret 與資源上限 |
@cloudflare/ci | 提供 CIWorkflow、runner 與 failure diagnostics 等 authoring API | source provider、通知與實際部署流程 |
官方 package README 特別強調,runner command 會位於可重試的 Workflow step 中;只要 command 有外部副作用,就必須具備 idempotency。另一方面,CiRunnerResult.logs 是原始 command output,不會自動替你遮蔽 secret;只有 provider notification preview 與 failure message 會做遮蔽。
這兩個條件決定了它的使用方式:把 runner 當成受 Workflow 重試控制的建置環境,而不是把任意 shell script 原封不動搬進雲端。
先用官方 Artifacts example 理解觸發路徑
官方的 cloudflare-artifacts example 不是「部署後自動掃描任何 Git repository」。它要求你事先建立並填入 Cloudflare Artifacts repository,pipeline 會接收 cf.artifacts.repo.pushed event;如果 namespace 或 repo name 和 wrangler.jsonc 的 trigger filter 不一致,pipeline 不會啟動。
這個邊界很適合用來做第一個 smoke test:先讓一個測試 repository 觸發 install、平行的 lint/test/typecheck/build,最後再執行 deploy。不要一開始就把 production repository、正式 deployment account 和 self-healing agent 一起接上,否則很難分辨是事件、Sandbox、Workflow 還是權限問題。
安裝與 Worker 設定不是同一個步驟
官方 README 的安裝指令很短:
pnpm add @cloudflare/ci但 package 直接發佈 Workers 取向的 TypeScript source,並不提供直接執行的 Node.js build。若 Worker 需要從 @cloudflare/ci/worker 匯入 reusable primitive,還要在 Wrangler 設定啟用 nodejs_compat。真正的 HTTP route、Queue handler、Workflow class 與 Wrangler bindings 都仍屬於你的應用程式。
一個 runner pipeline 的核心概念大致如下,實際型別參數與 bindings 應以 官方 Artifacts example 為準:
const deps = await ci.runner({ name: 'install', command: 'npm ci', cache: { inputs: ['package.json', 'package-lock.json'] },})
await Promise.all([ deps.runner({ name: 'lint', command: 'npm run lint' }), deps.runner({ name: 'test', command: 'npm run test' }), deps.runner({ name: 'typecheck', command: 'npm run typecheck' }), deps.runner({ name: 'build', command: 'npm run build' }),])這個寫法表達的是「安裝完成後平行驗證」的依賴關係,不代表每個專案都應該平行執行所有步驟。若 build 會修改同一個共享目錄、test 會啟動固定 port,先在 Sandbox 裡確認隔離條件,再調整平行度。
部署前要先處理副作用與 secret
讓重試安全
Workflow 可能重試 step,因此 npm exec wrangler deploy、artifact 上傳、外部 webhook 或資料庫 migration 都要能重做,或在 command 前先檢查目前狀態。不要把「重試只會再跑一次」當成安全假設;重複 deploy、重複通知和半完成的 migration 都可能比一次失敗更難收拾。
不要把 secret 當成普通環境變數輸出
官方 Artifacts example 會要求 CF_TOKEN、R2 access key 等 secret。這些 secret 應透過 Wrangler secret 或受控的 secret store 注入,並檢查 npm、Wrangler、測試工具和自訂 script 是否會把環境變數印到 log。因為 runner logs 是 raw output,任何 echo $TOKEN、verbose HTTP header 或失敗時列印完整 env 的做法,都可能讓 CI log 變成憑證外洩來源。
分開 source account 與 deploy account
官方 example 同時要求 Artifacts/CI 使用的 account 設定與 deploy account 設定。實務上應把 namespace、source repository、執行 runner 的權限和 production deploy 權限分開盤點;CI 能讀來源不等於它應該能改所有 Worker。部署 credential 也應只在最後需要 deploy 的 step 注入,縮短高權限 secret 的暴露範圍。
目前適合與不適合的情境
適合先試的情境,是你想把 Cloudflare Artifacts push event 連到一個 Workers-native pipeline,並且願意自己管理 Wrangler config、Sandbox image、資源、secret 與通知。可以從單一測試 repository 開始,先只跑 install、test 與 build,再加入 deploy。
不適合直接當成既有 CI 的無痛替換,尤其是你需要大量現成 SaaS integration、成熟的權限 UI、跨雲 runner fleet,或 pipeline 依賴 Node.js 原生環境而不是 Workers/Sandbox。官方 repository 目前仍是 0.1.0,導入前要鎖定版本、閱讀 changelog 與 example 的 lockfile,並在測試 account 先驗證重試和 log 邊界。
Cloudflare CI 的價值不在於把 YAML 換成另一套語法,而在於把 CI 的事件、可重試流程與執行環境放進 Cloudflare runtime。先把「誰觸發、哪裡執行、什麼可以重試、哪些 log 會原樣留下」回答清楚,再決定是否值得為這個邊界承擔早期元件的整合成本。
常見問題
Q: @cloudflare/ci 可以直接用 node @cloudflare/ci 執行嗎?
A: 不行。官方 README 說明它針對 Cloudflare Workers 與 Workers-aware bundler,發佈的是 TypeScript source,不是直接執行的 Node.js package。你需要把它放進可部署的 Worker/Workflow application。
Q: Cloudflare CI 會自動替我連接任意 GitHub repository 嗎?
A: 不會。官方 Artifacts example 要先有 Cloudflare Artifacts repository,並用 event trigger 的 namespace 與 repo filter 限定來源。其他 source provider、webhook 與 route 仍要由應用程式自行設計。
Q: self-healing agent 是 @cloudflare/ci 內建功能嗎?
A: 不是。官方 example 的 Healing Agent 是 application-owned 的範例,負責消化 runner failure diagnostics;agent、工具與 AI dependencies 不屬於 @cloudflare/ci package 本身。
參考資料:
Cloudflare GitHub:cloudflare/ci
Cloudflare CI:官方 package README
回報錯字、失效連結,或告訴我你想看的延伸主題。