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 鑰匙圈不一致。
提示:簽章與解析須在同一使用者下完成。
區域矩陣
| 關注點 | 量測 | 緩解 |
|---|---|---|
| 註冊表 RTT | TTFB | 區域鏡像或拉取快取 |
| 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 參數同等重要。