Kvmzen 部落格
← 返回技術實踐

在 Mac mini M4 雲主機上搭建 iOS CI/CD 全流程

CI/CD 實踐 ·約 5 分鐘閱讀

Mac mini M4 雲主機搭建 iOS CI/CD 實戰 - Kvmzen

團隊規模變大之後,「誰的電腦能出包」這件事本身就會變成瓶頸。我們把 iOS 專案的 CI/CD 整體遷移到 Kvmzen 的 Mac mini M4 雲主機之後,出包等待時間明顯縮短,簽署事故也幾乎歸零。這篇手記記錄了從零搭建這套流水線時踩過的坑,以及最終收斂出來的 Fastfile 與快取策略,供同樣在評估雲端 Mac 的團隊參考。

為什麼選擇雲端 Mac mini M4 做 CI/CD

Xcode 的建置是典型的「運算密集 + 強依賴系統版本」的任務,本機 Runner 很難長期穩定維護。選擇雲端 Mac 節點主要基於三點判斷:

  • 規格可控:映像固定 Xcode 與命令列工具版本,不會因為某人手動升級系統而「團隊裡只有他能編譯」。
  • 隨時擴容:發版前的回歸測試可以臨時多開幾個節點並行跑,跑完即釋放,不用為峰值常年預留硬體。
  • 7×24 值班:M4 晶片待機功耗低,夜間建置、定時安全掃描都可以放心常駐運行,不用擔心電費或噪音。

我們踩過的第一個坑:以為「雲主機」等於「遠端顯示器」,只用它做手動打包。真正把收益吃透,是把它接入 CI 觸發鏈之後才開始的。


CI/CD 流水線設計

階段劃分

一次完整的發版流水線,我們拆成了四個階段:

  1. 程式碼拉取與相依解析(SPM / CocoaPods)
  2. 單元測試與靜態分析(並行執行)
  3. xcodebuild archive 歸檔與簽署
  4. 上傳 TestFlight 並通知值班群組

鉤子與觸發條件

main 分支的每次合併會自動觸發階段 1-2;只有打上 release/* 標籤才會繼續跑階段 3-4,避免每次小改動都消耗簽署配額。本地除錯 Fastlane 腳本時,我們習慣先用 Ctrl+C 中斷一次完整跑批,單獨重跑失敗的那一步,能省下不少等待時間。

範例 Fastfile 片段
lane :ci_archive do
  cocoapods
  run_tests(scheme: "Kvmzen")
  build_app(
    scheme: "Kvmzen",
    export_method: "app-store",
    output_directory: "./build"
  )
  upload_to_testflight(skip_waiting_for_build_processing: true)
end

這段腳本本身並不複雜,關鍵是要讓它在同一套映像基線上重複運行都能得到一致結果——這也是我們把映像版本號寫進建置日誌的原因,方便回溯某次失敗是環境問題還是程式碼問題。


快取與相依管理

快取沒配好,雲端建置的速度優勢會被下載相依的時間吃掉。以下是我們線上跑了三個月後總結的對照表:

快取項目未啟用快取啟用映像內快取
CocoaPods 安裝約 4-6 分鐘約 30 秒
SPM 相依解析約 3 分鐘約 15 秒
DerivedData 增量編譯接近全量編譯命中率 80% 以上

幾個術語的口徑先對齊一下:

DerivedData
Xcode 的增量編譯產物快取目錄,跨建置重複使用可以顯著縮短二次編譯時間。
SPM 快取
Swift Package Manager 拉取到本機的套件原始碼與解析結果快取,避免每次建置都重新拉取遠端倉庫。
映像基線
雲主機開機即用的系統快照,包含固定版本的 Xcode、CLT 與預熱好的相依快取。
團隊在監控面板上查看雲端建置的快取命中率
把快取命中率獨立做成一張面板,比只看總建置時長更容易定位退化點

常見問題排查

最容易被忽略的一點:憑證過期不會立刻報錯,而是在上傳 TestFlight 的最後一步才失敗,這時候整條流水線已經空轉了十幾分鐘。我們現在把憑證有效期檢查放進了階段 1,提前失敗、提前告警。

早期我們用過一種「每晚全量清空快取重新建置一次」的笨辦法來防止快取腐化,後來改成按映像版本號做快取失效(版本號不變就重複使用,升級映像才清空),既保住了速度,也不會讓髒快取悄悄潛伏幾週才暴露問題。

「不要相信一次綠燈的 CI;要相信連續十次綠燈的 CI。」——這是我們值班手冊裡反覆強調的一句話,尤其適用於剛遷移到新雲節點的頭兩週。

常見問題

雲端 Mac mini 和自建 Mac Runner 相比,安全性上有什麼差異?

雲端節點的系統映像由服務商統一維護基線版本,團隊仍需自行管理簽署憑證與 Provisioning Profile 的存取權限;建議只把憑證注入到執行時環境變數,不落地到映像裡,歸還節點前清空 keychain。

免費的 Xcode Cloud 額度能不能直接取代這整套流程?

小團隊用 Xcode Cloud 完全夠用;但當並行建置數、自訂腳本或跨專案共用快取的需求變多之後,自建在雲端 Mac 節點上的流水線會更靈活,也更容易控制成本上限。

多個專案共用同一批雲端節點時,憑證應該怎麼隔離?

建議每個專案使用獨立的 keychain 或獨立的鑰匙圈 profile,建置腳本在啟動階段匯入、結束階段清空,避免不同專案的憑證互相污染同一個系統層級 keychain。

把 CI/CD 放在 M4 Mac mini 上,才算真正省心

本文所有流程——Xcode、Fastlane、CocoaPods、SPM——在 macOS 上都是原生一等公民,不需要任何虛擬機或相容層。Mac mini M4 統一記憶體架構讓簽署、歸檔、上傳這類 I/O 與運算混合任務不再互相拖累,約 4W 的待機功耗也讓 7×24 值班節點的電費幾乎可以忽略。

和自建 Mac Runner 相比,雲端節點不用操心機房散熱、系統更新視窗和硬體故障換機——這些維運負擔全部轉移出去,團隊可以把精力放回流水線本身的品質上。

如果你的團隊也在被「誰的電腦能編譯」困擾,現在就是把 CI 遷到雲端 Mac mini M4 的最佳時機——查看 Kvmzen 套餐方案,幾分鐘內就能拉起第一個建置節點。

限時特惠

不只是一台 Mac,是你在雲端的開發基地

獨享算力 · 全球節點 · 按月訂閱 · 無需購置硬體

返回首頁
限時優惠 點擊查看套餐