DevOps / CI·CD 2026年4月11日

租賃雲 Mac 上 Xcode SwiftPM 註冊表、解析與 CI 快取(2026)

MacXCode 技術團隊 · 約 16 分鐘閱讀

新加坡、日本、韓國、香港、美國東岸 租用 Apple Silicon 作為建置機時,失敗常在相依套件拉取:註冊表權杖、過期的 Package.resolved,或多個任務爭搶同一 SPM 檢出目錄。本文將 Swift Package Manager 視為生產設施:明確的註冊表鑑權依任務隔離快取、可量測的區域延遲。建議搭配 SwiftPM 與 CocoaPods並發 xcodebuild自架 Runner

為何區域會影響 SPM 解析

  • 出站路徑不同:在美國 VPN 允許的註冊表,可能對 新加坡 裸金屬 IP 拒絕。
  • Git LFS 與二進位產物對 RTT 敏感——預熱快取比單純加 CPU 更重要。
  • 若合規要求相依必須在亞太解析,請文件化哪台主機為權威建置機。
  • 多租戶共用一台 Mac 時,盲目共用 ~/Library/Caches/org.swift.swiftpm 易造成快取損壞競態。
原則:交付分支提交 Package.resolved;CI 對主線預設唯讀解析,除非機器人提出版本 bump PR。

無圖形介面下的註冊表鑑權

SSH 雲 Mac 無法點選 Xcode 彈窗。建議:憑證進 CI 金庫 → 產生 ~/.netrc 或環境變數 → 任務結束清理;多團隊共享主機時依 Unix 使用者或 RUNNER_NAME 目錄做命名空間。

Package.resolved 策略

分支類型策略CI 行為
main / 發布必須提交鎖檔若解析會改變相依圖則失敗
功能分支允許機器人更新新開 PR 更新 Package.resolved
函式庫產品常無鎖檔CI 內產生暫時鎖以確保歸檔可重現

磁碟與 NVMe

路徑/概念用途維運要點
SourcePackages解析後原始碼每任務獨立目錄避免競態
DerivedData模組圖與索引並發任務上限 連動
全域 SPM 快取下載產物唯讀預熱層 + 隔離寫入者

可重複的 SSH CI 步驟

swift package resolve

除錯可暫時加 -v;與 遠端 Archive 使用相同使用者脈絡,避免 launchd 與互動 shell 鑰匙圈不一致。

提示:簽章與解析須在同一使用者下完成。

區域矩陣

關注點量測緩解
註冊表 RTTTTFB區域鏡像或拉取快取
GitHub 可用性429/5xx退避 + 備用鏡像 fork
磁碟爭用fs_usage獨立 NVMe 卷給 CI 根目錄

常見問題

問題回答
是否應關閉 SPM 快取?僅在排查損壞時;平時保留並隔離寫入。
Xcode Cloud 是否相同?佇列與快取生命週期不同,見 Xcode Cloud 對照專用機
如何證明解析確定性?在 CI 校驗 Package.resolved,漂移則失敗除非有核准 PR。

為何選 MacXCode Mac mini M4

解析與編譯都依賴低延遲 NVMe統一記憶體。提前選區(例如面向 Git 選東京)可避免日後搬遷數百 GB 快取。從 定價 開始,用 說明中心 統一鎖檔與權杖規範。

結論:把 SwiftPM 當供應鏈一環——註冊表、鎖檔、快取隔離與 xcodebuild 參數同等重要。

專用 Apple Silicon CI

港 · 日 · 韓 · 新 · 美