痛點與邊界
- 半套同步:只拷貝二進位未帶版本目錄,導致下線任務讀到半成品。
- 權限外溢:單一帳號寫入全系統路徑,稽核困難,違反權限隔離。
- 併發踩踏:兩條流水線同寫
dist/,快取與索引檔撕裂。
決策矩陣總表
依寫入者、讀者與一致性快速對齊;標示常選甜蜜點。
| 方案 | 一致性 | 頻寬/延遲 | 維運複雜度 | 較適合 |
|---|---|---|---|---|
| rsync 直連(單次全量或鏡像) | 高(完成後整包一致) | 初次較重;後續視變更量 | 低 | 偶發發版、包體可預測(甜蜜點) |
rsync 增量(--delete 謹慎) |
中高(依原子切換策略) | 佳 | 中 | 頻繁小步交付、多下游拉取 |
| NFS 掛載+本機頁面快取/唯讀層 | 中(受伺服器與快取策略影響) | 多讀者省拷貝 | 高 | 大量並行讀、共享基線快取 |
三種模式適用場景
rsync 直連/增量:單一發布節點先寫暫存再整批切換;增量以清單或時間驅動,--link-dest 可省空間(視檔案系統)。--delete 僅在單一真相樹上使用。
NFS:多臺共享遠端 Mac唯讀掛基線 SDK/Pods 省頻寬;構建輸出放本機再以 rsync 發布,降低寫競態並觀測 timeout。
併發、umask 與 SSH 分角色
- 目錄鎖:
flock或鎖檔;先寫staging/build-<ID>/,持鎖切換current符號連結。 - umask:建議
027(約750/640),同群 CI 可讀、他人預設不可寫。 - SSH 分角色:
builder沙箱、artifact-writer僅寫版本子目錄、readonly除錯;輪換見憑證矩陣。 - rsync 衝突:避免就地覆寫熱路徑;目錄級替換較穩。
--inplace僅單寫者可考慮,多寫者關閉並分層版本。
落地步驟(≥5)
- 劃定產物根與命名(含 SHA/流水號),禁止多專案共用扁平目錄。
- 構建帳號 umask/ACL/群組寫入 CI 映像或啟動腳本。
- 暫存→校驗→持鎖切換
current三階段發布。 - 讀多寫少基線大:NFS 唯讀;寫入與發版走 rsync 或物件 API。
- SSH 角色與 sudo 白名單版控化,每季演練吊銷;監控磁碟、rsync 失敗與 NFS timeout,對齊Runner 矩陣。
可引用參數清單
- umask 027:同群讀產物、預設阻擋他人寫入。
- 目錄深度:專案/版本/平台至少二層,避免快取鍵撞。
- rsync:
-aH、--partial-dir;完成後目錄級切換。
常見問題 FAQ
Q:NFS 當構建輸出?
A:高併發小檔不建議;本機輸出再 rsync,NFS 唯讀基線較穩。
Q:--delete 何時安全?
A:目標為單一真相鏡像、無人工雜檔,且先 dry-run。