30 秒讀完
- 根因:macOS beta 已進入 CI 執行層,不再只是旁路測試映像。
- 症狀:同 commit 本機過、CI 掛、重跑又過——別當 flaky test 修。
- 解法:主 CI 鎖穩定版 macOS;beta 只跑在獨立 Mac mini,回傳 PASS/FAIL。
1. 到底怎麼了
WWDC 2026 之後,macOS 27 beta 與 Xcode 18 beta 綁在一起出貨。要驗新 SDK,CI 主機就得跟上 beta 列車——流水線不再像:
code → build → test → artifact
而變成:
code + Xcode beta + macOS beta + Simulator + Keychain → build
問題多半不是你的 diff。beta 變成執行環境本身,而且每週都在變。
2. 四個坑(WWDC 後)
| 機制 | 你會看到 |
|---|---|
| Xcode 綁 macOS beta | Runner 無法凍結版本;本機穩定版 vs CI beta 永遠對不上 |
| 模擬器抖動 | 冷啟動 +30–80%,UI 測試逾時,核心排程一直在變 |
| 簽章 / Keychain 漂移 | 間歇性 codesign 失敗、重跑又過——見 簽章指南 |
| Swift 工具鏈更嚴 | 增量編譯漏檔;得 clean build |
3. 典型症狀
- 時間漂移:同 commit,
xcodebuild從 18 分鐘跳到 37 分鐘 - 結果漂移:本機綠燈 → CI 紅燈 → 重跑又綠(環境雜訊,不是測試 flaky)
- 假信心:CPU 閒置、沒明顯 stack trace,測試卻隨機掛
這跟 為什麼 CI 比本機慢 2–3 倍 不同:那是快取調校。這裡是 OS 層不確定性——改 YAML 救不了。
4. 解法:beta 執行隔離
別在生產 CI 裝 beta。丟到可拋棄的 Mac mini 上跑,只回傳結果。
穩定 CI(正式版 macOS + Xcode)
↓
遠端 Mac mini(僅 beta)
↓
回傳 PASS / FAIL + IPA
四步驟:
- 開一台 beta 專用 Mac mini(獨立使用者 + Keychain)
- 主 Runner 鎖穩定版 macOS,負責 merge 與 release
- 隔離節點裝 beta 棧;用
[beta, ios]標籤或夜間 SSH 觸發 - 只回傳結果——別把 beta 快取掛回生產 Runner
Runner 標籤見 Mac mini 自託管 Runner 指南;發版衝刺的 beta 矩陣見 臨時構建矩陣。
5. 怎麼選
| 做法 | 穩定性 | 結論 |
|---|---|---|
| 日常 Mac 裝 beta | ❌ Keychain 污染、難回滾 | ❌ |
| GitHub 託管 Runner | ⚠️ 排隊 + beta 映像落後 | ⚠️ 僅補充 |
| VM / 快照 | ❌ 模擬器 GPU 不穩 | ❌ |
| 遠端 Mac mini beta 節點 | ✅ 隔離、可拋棄 | ✅ |
6. FAQ
macOS beta 會影響 CI 嗎?
會——模擬器、工具鏈預設、簽章都會漂。同 commit 結果可能翻轉。
能在日常 Mac 跑 beta CI 嗎?
個人實驗可以;共用或生產構建機請避免。
GitHub Actions 夠用嗎?
能緩解排隊,但消不掉 beta 非確定性。
最佳實務?
專用 beta Mac mini + 凍結主 CI。WWDC 後真正的問題是環境失控,不是「構建失敗」。