preview 的語法,而是「遠端狀態在 S3 相容後端上的鎖租約」「CI 分片與平行預覽是否搶同一個 stack」,以及「狀態鎖與本機 建置鎖是否雙軌互卡」——最後再與 1TB/2TB 磁碟水位一起驗收入庫。
本文給平臺/DevOps 一張可貼進合併前驗收的決策矩陣:先對齊狀態檔案路徑與後端隔離,再為租約 TTL、CI 分片與磁碟閾值寫死數字邊界;最後把 pulumi preview/up 與產物目錄上的 flock 或排程單寫入者收斂到同一套 runbook。延伸閱讀:《Nomad 親和、建置鎖與水位矩陣》、《rsync 製品扇出矩陣》;DNS 與內網製品庫邊界可對照 《拆分 DNS 與製品庫矩陣》。
決策矩陣(起點):下列列的是「控制面」取捨;實際鎖實作請以你所選後端(純物件鎖檔、外部 lease 表等)與 Pulumi 版本文件為準。
| 交付情境 | 遠端狀態/鎖策略 | 平行 preview/up | 與建置鎖合併驗收 |
|---|---|---|---|
| 單區主線 | 單一 bucket 前綴+環境隔離;禁止 PR 與 main 共用 stack 名稱 | preview 可並行(唯讀)/up 建議序列化或依 stack 分片 |
狀態鎖≠產物鎖:promote/tar 仍走 flock 或 max_parallel=1 |
| 跨區多後端 | 每區獨立 endpoint/bucket;加密金鑰與稽核帳號分帳 | 僅對應區域 runner 觸發;避免遠端狀態跨洋鎖競態 | 合併 PR 前比對兩區 stack 輸出摘要與鎖等待時間百分位 |
| 1TB 節點保守模式 | 縮小外掛快取與工作目錄保留天數;必要時獨立「僅 preview」節點池 | 同機並行 stack ≤1–2 | 觸發 80% 磁碟閾值時自動降低 CI matrix 寬度 |
狀態檔案路徑
在 S3 相容後端上,請把「bucket/prefix/專案名/stack」寫成不可協商的命名規範:pulumi.<org>.<env>/<project>/<stack>.json 類似結構即可,重點是同一個邏輯環境永遠對應唯一狀態鍵空間,避免 PR 暫存 stack 與生產 stack 撞名。後端 URL、區域與帳號憑證建議走 OIDC 或短期金鑰;跨區複製 Pulumi.yaml 時要校對 backendURL 是否跟著漂移。
- 主線:production/staging 分桶或分前綴,並啟用版本與刪除保護策略(依供應商能力選擇)。
- PR/實驗:以 pipeline id 或分支名做 stack 後綴,合併後生命週期到期即刪。
- 稽核:狀態讀寫日誌與 CI job id 對齊,便於還原「誰在最後一次 up 前持有鎖」。
租約 TTL
無論後端用原生條件寫入還是獨立 lease 列,TTL 必須同時大於最壞執行時間並小於可接受的阻塞上限:太短會在長時間 preview 或大型資產上傳途中誤釋放;太長則在 runner 被強殺時讓其他 pipeline 空等。實務上常以「單 job 逾時 ×1.2~1.5」為起點,再依跨區 RTT 調整;取消或 timeout 路徑要驗證是否會留下孤兒鎖與半寫入狀態。
| 工作負載 | TTL 起點(示意) | 驗收動作 |
|---|---|---|
| 一般 preview | 貼近 CI job timeout,預留網路重試餘量 | 人為中斷後 5 分鐘內可恢復下一個 preview |
| 大型 up/資產同步 | 與最長資產步驟對齊;必要時拆 stack | 監控鎖等待 p95;超閾值改為序列化或分片 |
| 緊急 rollback | 不縮短到低於單次還原腳本時間 | 演練「持鎖失敗→租約過期→第二次取得鎖」劇本 |
CI 分片
Matrix 分片應以「一 shard 一 stack 命名空間」為原則,讓平行 preview 彼此不讀寫同一狀態鍵;需要合併結果時,用匯總 job 讀多個輸出目錄,而不是讓多個 job 輪流觸碰同一 stack。跨區 runner 請固定標籤,避免同一 PR 在美西與東京輪替執行導致狀態鎖在不同可用區抖動。與排程器協同時可參考站內 Nomad 文,將「基礎設施變更」與「應用建置」分佇列,降低單一 flock 窄門被誤當成狀態鎖救星。
# 示意:分片環境變數(實際名稱依 CI 平台調整)
export PULUMI_CONFIG_PASSPHRASE_FILE="$RUNNER_TEMP/pulumi-pass"
export STACK_NAME="app-${REGION}-${CI_NODE_INDEX}"
pulumi stack select "$STACK_NAME" || pulumi stack init "$STACK_NAME"
pulumi preview --non-interactive
磁碟水位(1TB/2TB)
Mac CI 節點上,provider 外掛快取、工作目錄暫存與日誌會與應用產物競爭同一 APFS 卷宗;Pulumi 本身不是磁碟怪獸,但「平行 matrix × 多版本外掛 × 大型資產」會讓 1TB 機型很快觸發黃燈。下列閾值請接到監控;觸發時應同步降低 matrix 寬度與同機並行 stack 數,而不是只清快取不改 CI。
| 使用率區間 | 1TB 節點 | 2TB 節點 | 建議動作(含 Pulumi/CI) |
|---|---|---|---|
| < 70% | 維持預設 matrix;每週排程清過期工作目錄。 | 可保留較多外掛快取;仍監控 inode 與快照。 | 綠燈:僅趨勢紀錄。 |
| 70%–80% | 黃燈:收斂並行 stack;評估升 2TB 或拆專用 preview 節點。 | 黃燈:刪除過期 .pulumi 工作副本與舊 logs。 |
降低夜間 matrix 寬度;暫停非關鍵資產快取。 |
| > 90% | 紅燈:視為硬停——停止新 up dispatch,先清暫存與外掛快取再放行。 |
佇列背壓直至監控回綠。 | |
若你正在把基礎設施變更從筆電搬到多台 Mac mini M4,請把「狀態鍵命名+租約演練+三閾值」寫進節點上線腳本:回報卷宗使用率、當前允許的並行 stack 上限,以及最近一次鎖等待時間,避免跨區複製設定時無聲漂移。
購買引導:需要獨佔 Mac mini M4 並以 1TB/2TB 支撐 Pulumi 外掛快取、資產同步與多 shard CI 時,請至 購買(免登入瀏覽)與 方案/價格選型;細節與帳務問題可先到 說明中心查閱。下單前建議用本文矩陣對照你的 stack 數量、單 job 逾時與磁碟閾值,必要時拆出「僅 preview」節點池以降低狀態鎖碰撞。
為 Pulumi 與 CI 分片補齊 Mac mini M4 節點
依區域與 1TB/2TB 儲存 tier 對齊外掛快取與工作目錄預算;需要流程說明請至 說明中心。相關叢集實務可延伸閱讀 Nomad 建置鎖矩陣、rsync 製品矩陣。