痛點:快取同步不是二等議題
痛點一:把 DerivedData 當靜態資料夾。中繼索引、模組快取與 Swift 前端暫態可能在 rsync 回報成功時仍半一致,隨機重編譯掩蓋了結構性競態。
痛點二:把編譯器快取與整個 Xcode 工作區混在同一策略。ccache 與 sccache 目錄形狀相對可預測;DerivedData 卻緊耦合 Xcode 小版本、Swift 工具鏈、外掛與功能旗標。升級後同一組 rsync 設定常突然失靈。
痛點三:同一顆卷上 CI 矩陣重疊。矩陣構建與夜間掃描會在 sqlite 與鎖目錄上相撞;SSH 傳輸層健康不代表編譯層健康。
痛點四:忽略 APFS 語意。擴展屬性與權限位元在跨碟複製快取時仍會咬人;先讀 APFS rsync 矩陣再宣告「快取只是純 blob」。
痛點五:缺少髒快取劇本。團隊要嘛每小時全刪、要嘛永不刪而堆積幽靈檔。編號回滾卡片應與 產物校驗清單對齊,快取則用卷級增量治理。
痛點六:把圖形 SFTP 當正式同步工具。適合抽樣檢查,不適合可重複性;請搭配 主機金鑰釘選 與 OIDC/佈署憑證指引。
痛點七:把產物升級與快取預熱混談。簽章目錄不該與揮發快取共用可寫根。
威脅模型:兩條信任鏈
產物需要可稽核、密碼學驗證,以及與 原子升級 綁定的回滾路徑。快取可以失敗即捨、積極清除,並在永不汙染已簽 bundle 的前提下退回冷構建。
以不同卷或不同 SSH 帳號做物理隔離可加速事故調查;稽核才能對應「哪一組憑證寫過哪棵子樹」。WAN 延遲會放大 rsync 掃描成本,請把快取通道與產物通道的頻寬預算分開估算。
明文化誰能觸發驅逐;無工單的 sudo 全刪會抹鑑識軌跡。多產品共用主機要激進命名空間。partial 殘留需監控容量與最舊時間戳。
每季在預備機上演練回滾卡片;Xcode 升級窗應像資料庫遷移一樣預留排練。可觀測性要標記冷/暖/降級快取,才能把測試抖動對回基礎設施狀態。
可量化基線:終結口水戰
追蹤全淨與暖構建分鐘、ccache 命中率、sccache 佇列深度、DerivedData 斜率、rsync 結束碼、partial 殘留、併發作業數與測試抖動密度。
每次 Xcode 升級後重跑金樣專案,並把 rsync --version 標頭寫進日誌與工具鏈版本綁定。耗時要拆成掃描、差量、網路與 fsync。
儀表板可先手工維護;快取異常若與憑證輪替或主機金鑰變更同週出現,先懷疑「旋鈕轉太多」。對釘選 rsync 做靜態檢查,擋下未知旗標 PR。
維運把快取目錄當成有狀態的資料庫:上線、排空、凍結調查、退役;半狀態會讓增量編譯器不可預測地腐敗。FinOps 把產物 egress 與快取 ingress 分開列帳。
決策矩陣:冷快取、僅編譯器快取、修剪 DerivedData、全鏡像、專用卷
| 模型 | 最適合 | 效益 | 風險 |
|---|---|---|---|
| 不同步快取,只在遠端本機構建 | 小團隊、低頻構建 | 維運最單純 | 冷啟動較慢 |
只同步 ccache 或 sccache 根 | Clang 重管線、可接受偶爾驅逐 | 邊界清楚 | 升級後仍需版本衛生 |
同步選定的 DerivedData 子樹 | SPM 解析痛點、受控排除 | 較少重複網路抓取 | 與 Xcode 目錄布局高度耦合 |
| 完整 DerivedData 鏡像 | 單一寫入者的維護窗 | 最大化增量重用 | 鎖與索引碰撞風險最高 |
| 每作業或每團隊獨立 SSD | 共享遠端 Mac 池 | 隔離與配額 | 硬體與自動化成本較高 |
若快取腐敗可能碰到已簽產物,請立刻分拆帳號,並依 簽章 Runbook 檢查點演練刪除範圍。
實作步驟:可貼上再調整的指令骨架
# Per-job cache root (example)
# export CACHE_ROOT=/Volumes/cache/job-${CI_JOB_ID}
# mkdir -p "$CACHE_ROOT/ccache" "$CACHE_ROOT/DerivedData"
# rsync compiler cache only
# rsync -a --partial --partial-dir=.rsync-partial \
# ./ccache-dir/ user@remote-mac:"$CACHE_ROOT/ccache/"
# Trimmed DerivedData with aggressive excludes (verify paths)
# rsync -a --partial --partial-dir=.rsync-partial \
# --exclude '**/ModuleCache.noindex/**' \
# ./DerivedData/SubTree/ user@remote-mac:"$CACHE_ROOT/DerivedData/SubTree/"
# Artifact lane still runs checksum manifests
# shasum -a 256 -c manifest.sha256
# Dirty-cache rollback for one job
# ssh user@remote-mac "rm -rf \"$CACHE_ROOT\""
把片段包成可重用動作,並與 CI 釘選文章 的主機鍵檔一併審查排除清單。
閱讀順序與 CTA 對齊
建議順序:先讀本文,再讀 APFS 中繼資料、校驗閘門、併發 SFTP、簽章分發、原子發佈,最後到 首頁 做產能規劃。
跳步會得到假權衡:校驗完美但快取隔離鬆散,或快取飛快卻汙染簽章樹。複合動作應暴露快取根、排除清單、回滾代號;on-call 對快取事件應有與網路事故同級的 Runbook。
產品可備一頁備忘:哪些樹可同步、哪些必留本機、哪些升級後需全淨構建。
FAQ 與 SFTPMAC 託管遠端 Mac 何時有幫助
每晚全量同步 DerivedData 合理嗎?
僅在獨佔維護窗、單一寫入者與明確升級凍結下合理;日間若與 CI 矩陣重疊仍有碰撞風險。
sccache 一定要用 Redis 嗎?
不一定,但集中後端較易做驅逐指標;請定義快取層分裂時的行為。
快取失敗要擋發佈嗎?
產物仍應以校驗與簽章擋下;快取可退回冷構建並加標籤明示。
與 IDE 監看有何關係?
本文處理編譯器快取完整性;編輯器通知與 FSEvents 盲點屬另一篇文章的範圍。
摘要:2026 年在遠端 Mac 鏈路搬運 Xcode 快取需要每作業隔離、分拆信任鏈與明確回滾卡;在整棵 DerivedData 鏡像之前,先偏好像編譯器快取根這種邊界清楚的選項。
限制:自管機隊必須持續調校卷、帳號、監控與清除腳本;人力流動會讓政策靜默漂移。
SFTPMAC 視角:託管遠端 Mac 產能把穩定的 Apple 構建面與可操作的傳輸通道捆在一起,讓團隊專心交付已簽產物,而不是徹夜撲快取火。
在帳號層級就把快取卷與產物卷拆開;託管池讓配額、稽核與迴歸樣本更容易維持一致。
