1. 為什麼 iOS CI/CD 需要真實 Mac
iOS 簽名鏈路依賴 macOS 原生環境,Xcode 15 起強制要求 Apple Silicon 原生編譯,虛擬機與容器方案日趨受限。本文從程式提交到 App Store 審核,給出可復現的全鏈路流程。
1.1 Apple Silicon 核心限制
- xcodebuild
- 必須在原生 ARM64 系統執行;Rosetta 2 轉譯在 Xcode 15+ 已不再完整支援 Simulator 和 archive 流程。
- notarytool
- 公證(notarization)需要有效的 Apple Developer 憑證,並透過蘋果伺服器即時聯網驗證,不可離線運行。
- codesign
- 鑰匙圈(Keychain)存取必須在持久工作階段中進行;CI 短暫進程須配置
security unlock-keychain步驟。
1.2 傳統方案的痛點
自建 Mac mini 機房的主要問題:初期硬體採購成本高→ 2026 年已有日租雲端 Mac 替代方案- 維運團隊需要 7×24 值守,發版故障響應慢
- 發版高峰無法彈性擴容
「我們在 WWDC 2026 發版前一週臨時擴了 4 台機器,只花了 4 小時就搞定。」——某中型遊戲團隊 iOS 負責人
2. 工具鏈選型
2.1 簽名管理工具對比
| 工具 | 適合場景 | 憑證儲存 | 優點 | 缺點 |
|---|---|---|---|---|
| Fastlane match | 團隊 ≥ 2 人 | Git / S3 | 統一版本,CI 友好 | 需要 Git 倉庫權限 |
| Xcode 自動簽名 | 個人開發者 | 本地鑰匙圈 | 零配置 | 多機同步困難 |
| 手動 provisioning | 企業分發 | 手動管理 | 完全控制 | 維護成本極高 |
2.2 Fastlane lane 範例
# Fastfile
platform :ios do
lane :beta do
match(type: "appstore", readonly: true)
build_app(scheme: "MyApp", export_method: "app-store")
upload_to_testflight(skip_waiting_for_build_processing: true)
end
end
3. 環境準備:遠端 Mac M4 日租 PoC
拿到遠端 Mac 存取權限後,建議按順序驗收:
- SSH 登入驗證:
uname -m輸出arm64 - Xcode 版本:
xcodebuild -version確認目標版本 - Fastlane 安裝:
gem install fastlane - 試建置:對範例專案執行
xcodebuild build,記錄耗時
3.1 常見錯誤排查
錯誤:No signing certificate found
執行 fastlane match appstore --readonly false 重新拉取憑證,或檢查 Keychain 中 Apple CA 是否存在。使用 Cmd+Space 開啟 Spotlight 搜尋 Keychain Access。
錯誤:公證超時
蘋果公證服務偶發排隊延遲,通常 5–15 分鐘內完成。建議設定超時重試邏輯。
4. 效能調優
4.1 並行建置矩陣
| 場景 | 推薦配置 | 預估耗時 |
|---|---|---|
| 單架構 Debug | M4 16GB × 1 | 3–5 分鐘 |
| 多模擬器並行測試 | M4 24GB × 1 | 8–12 分鐘 |
| Release + Archive | M4 16GB × 1 | 6–10 分鐘 |
4.2 成本控制
- 日租 PoC:先用 1–3 天驗證流水線,指標穩定後再升週租或月租
固定月租 M1 方案→ 2026 年 M4 日租價格已趨近舊方案,且效能大幅提升- 發版高峰臨時擴容,峰後釋放
總結
iOS 18 CI/CD 全鏈路要點:
- 用遠端 Mac M4 日租完成 PoC 驗收
- 配置 Fastlane match 統一管理簽名憑證
- 用 App Store Connect API Key 實現無互動公證