先把「能開幾個 Simulator」換成可量測邊界
2026 年常見劇本是:CI 想同時跑多組 xcodebuild test,每台遠端 Mac 再掛兩三個 iOS 版本。實務上先卡的是統一記憶體與 CoreSimulator 服務,不是 CPU 標稱核心數。請把「併發」定義成:同機同時存在的 Simulator 實例數 × 單測記憶體水線 × 螢幕錄影/截圖是否開啟。若還在評估「Gradle 與 Xcode 是否擠同一台遠端機」,可先讀
Flutter 團隊遠端 Mac 替代 Linux VPS+iOS 外掛機決策文,再回到純 iOS UITest 邊界。
xcodebuild:併發測試與多 destination 的取捨
同一 xcodebuild 行程內掛多個 -destination 可省啟動成本,但記憶體峰值會疊加,且任一 Simulator 卡住會拖長整批結果。拆成多個 Job、每 Job 單一 destination,利於重試與快取命中,代價是編排複雜。若管線上還疊了 Webhook 驅動的守護行程,可參考
GitHub/GitLab Webhook 與遠端 Mac 峰值併發案例,避免與 UITest 搶同一時段的磁碟與網路出口。
五地延遲:寫進「互動除錯」預算,而不是行銷 RTT
批次 UITest 對延遲尚可容忍;工程師透過遠端桌面盯 Simulator 除錯時,RTT 與抖動會反映在點擊與動畫斷言。請用晚尖峰最差樣本填表。
| 情境 | 日本 | 韓國 | 香港 | 新加坡 | 美西 |
|---|---|---|---|---|---|
| 東北亞使用者為主、Runner 靠近 Git 與制品庫 | 首選 | 首選 | 備援 | 備援 | 跨洲備援 |
| 大灣區/華南團隊遠端互動除錯 | 可 | 可 | 首選 | 次選 | 長距弱 |
| 與美西雲區同區、偏無人值守夜間批次 | 中轉視 peering | 中轉視 peering | 視 peering | 視 peering | 首選 |
M4 三檔:短租單機 vs 併聯擴容怎麼選
下列矩陣假設同一 Xcode 大版本、DerivedData 有定期清理;「併聯」指多台短租 Runner 分片跑 destination/scheme。
| 檔位 | 典型 UITest 併發 | 儲存壓力 | 短租建議 |
|---|---|---|---|
| M4 16GB/256GB | 1~2 個輕量 Simulator 流水線;多 destination 建議序列化 | 高:快取與 CoreSimulator 映像易塞滿系統碟 | 日/週租 smoke;長測改分片或升檔 |
| M4 24GB/512GB | 2~3 實例或單 Job 多較輕 UI;留意截圖與錄影目錄 | 中:可撐雙版本 SDK 切換 | 團隊預設主力短租檔;港新互為備援 |
| M4 Pro+1TB/2TB | 更高記憶體頻寬,適合大型 App UITest 與多 scheme 夜間合併 | 低~中:適合長開快取與多 Xcode 並存 | 高峰檔+低檔併聯:高峰跑全量,低檔接回歸 |
無人值守佇列 Runbook 核對
- 失敗重試:區分 Simulator 啟動失敗、斷言失敗與網路逾時,避免「整批重跑」放大併發。
- 資源回收:Job 結束後關閉多餘 Simulator、清暫存截圖,避免下一個 PR 繼承髒狀態。
- 金絲雀:尖峰前先用單 destination 探測 CoreSimulator 服務是否僵死。
什麼時候該「加區」而不是「加核」
當互動除錯分鐘數可觀、晚尖峰 RTT 讓 UITest 逾時率超過 SLO,優先把互動與批次分區:批次可落美西,工程師連線落港新。若逾時集中在單一 scheme 的記憶體尖峰,再回到 M4 Pro 或併聯短租。
常見問題
為什麼 UITest 管線最後仍常落到 Mac mini/macOS
UITest 與 Simulator 深度綁定 macOS、Xcode 與 Apple Silicon;統一記憶體帶來較高頻寬,利於多實例穩定啟動。Mac mini M4 待機約 4W,適合 7×24 排程。Gatekeeper、SIP、FileVault 把 Runner 收斂在可稽核邊界。
若要把併發與五地選型壓在正式環境,Mac mini M4 仍是 2026 年高性價比起點;搭配短租節點分片即可上主線。現在可透過下方 CTA 開通演練。