Cloudflare Workers 原本已針對特定上傳版本提供 Version URL,但這些 URL 只能指向生產資源,無法為每次變更建立隔離環境,因此若要安全測試較大的變更,就得冒著共用預備環境狀態的風險,或為每個環境另外架設一個 Worker。隨著代理輔助開發將更多、更大的變更推入流程,合併前需要進行更多測試,同時又不能拖慢代理的速度。

Worker Previews 將分支模型延伸到程式碼之外:在任何分支上執行 npx wrangler preview,就會建立一個擁有專屬 URL 與設定的隔離環境,並繼承一份可依分支覆寫的基礎設定。更棘手的問題在於狀態。Durable Objects 採用單例模型,由單一實例擁有其儲存空間,因此若 Preview 共用生產環境的命名空間,一次失敗的遷移就可能改動實際流量。修正方式是為每個 Preview 建立全新的 Durable Object 命名空間,並透過 ctx.exports 解析,讓相同的程式碼在生產環境與 Preview 中分別連到不同的命名空間。

Cloudflare 以自家的 CloudflareOS 實際試用(dogfooding)這項功能。CloudflareOS 是 Cloudflare 的開源平台,讓代理透過受權限範圍限制的「Gatekeepers」與 Google、GitHub、Slack 等服務互動。Gatekeeper 的錯誤、OAuth 回呼、核准流程,以及權限狀態彼此不良互動等問題,只有在整個系統一起運行時才會浮現,因此團隊會為每個待審查的變更部署一個隔離的 CloudflareOS Preview,在合併前先跑完整流程。

將 git 分支機制從程式碼延伸到環境與狀態

為每個 Preview 自動配置新的 Durable Object 命名空間與 Container 應用程式,消除了 Preview 可能悄悄改動生產流量所用儲存空間的失敗模式。

定義一份可供 Preview 繼承、並能依分支覆寫的可重用基礎設定,避免像過去分離環境那樣,每個分支都得從頭重新設定密鑰與繫結。

在 CloudflareOS 的 Gatekeepers 上實際試用,針對的正是隔離的元件測試無法捕捉錯誤的情況,因為這類錯誤只有在 OAuth、權限與核准流程一起運行時才會出現。

將可觀測性依 Preview 劃分範圍,讓失敗能從該分支自身的追蹤與日誌中診斷,而不會混入生產流量或其他進行中的變更。

當「在預備環境可用、在生產環境卻出錯」的情況反覆發生時,就讓每個環境的配置成本與隔離程度都像程式碼分支一樣低,包括多數工具仍共用、具狀態的部分。

Cloudflare 列出截至推出時仍存在的缺口:從 Preview 呼叫的服務繫結,仍會呼叫所繫結 Worker 的生產部署,而非對應的 Preview;Preview 可以傳送訊息至 Queues,但尚無法從中消費訊息;至於用於持久預備或 QA 環境的長期存在 Preview,仍正依據封閉測試的回饋評估範圍。Worker Previews 現已在 Workers 平台上全面提供,較舊的 Version URL 則保留為另一套範圍較窄的機制,用於指向特定上傳版本。

追溯依據

參考來源

  1. Introducing Worker Previews: isolated preview environments for every change your agent makes The Cloudflare Blog · blog.cloudflare.com ·