30 秒读完
- 根因:macOS beta 进了 CI 执行层,CI 从「确定」变「碰运气」。
- 症状:同 commit 本地过、CI 挂、重跑又过——别当 flaky test 修。
- 解法:主 CI 冻结稳定版;beta 放独立 Mac mini,只回传 PASS/FAIL。
1. 到底怎么了
WWDC 2026 后,macOS 27 beta 和 Xcode 18 beta 绑在一起。想测新 SDK,CI 就得整台进 beta——于是 Pipeline 从:
代码 → 构建 → 测试 → 产物
变成:
代码 + Xcode beta + macOS beta + 模拟器 + Keychain → 构建
问题不在代码,在 beta 成了 CI 的执行环境——而 beta 每天都在变。
2. 四个坑(WWDC 后高频)
| 机制 | 你会看到什么 |
|---|---|
| Xcode 绑 macOS beta | Runner 没法冻结版本;本地稳定版、CI beta,结果对不上 |
| 模拟器抖 | 冷启动 +30%~80%,UI 测试随机超时(内核调度在变) |
| 签名 / Keychain 漂 | codesign 间歇失败,重跑又过——详见 签名专文 |
| Swift 工具链变严 | 增量构建偶发漏编,clean 才过 |
3. 典型症状(对号入座)
- 时间飘:同一 commit,
xcodebuild18 分钟变 37 分钟 - 结果飘:本地过 → CI 挂 → 重试又过(非 flaky test,是环境在抖)
- 监控正常但不可信:CPU 不忙,测试随机红
这和「CI 比本地慢 2-3 倍」是两类问题:那个能靠 cache 优化;这个是OS 级不确定性,调 YAML 救不了。
4. 解法:beta 执行隔离
主 CI 不要装 beta。beta 只在一台可丢弃的 Mac mini 上跑,结果回传就行。
稳定 CI(正式 macOS + Xcode)
↓
远程 Mac mini(仅 beta)
↓
回传 PASS / FAIL + IPA
四步落地:
- 备一台只跑 beta 的 Mac mini(独立用户 / Keychain)
- 主 Runner 锁稳定版 macOS,日常合并、发版走这边
- beta 栈装隔离节点;用 Runner 标签
[beta, ios]或 nightly SSH 触发 - 只回传结果——别把 beta 的 cache 挂回生产机
Runner 标签与 launchd 细节见 Mac mini 自托管 Runner 指南;临时加 beta 矩阵见 发版冲刺临时构建。
5. 怎么选
| 方案 | 稳定性 | 推荐 |
|---|---|---|
| 主力 Mac 装 beta | ❌ 污染 Keychain,难回滚 | ❌ |
| GitHub Actions 托管 | ⚠️ 排队 + beta 滞后 | ⚠️ 仅补充 |
| 虚拟机 / 快照 | ❌ 模拟器 GPU 不稳 | ❌ |
| Remote Mac mini beta 节点 | ✅ 可隔离、可丢弃 | ✅ |
6. FAQ
macOS beta 会影响 CI 吗?
会——模拟器、工具链、签名都会抖,同一 commit 结果可能不同。
能在本地 Mac 装 beta 做 CI 吗?
个人尝鲜行;团队共用机或生产 Runner 别装。
GitHub Actions 够吗?
缓解排队可以;消不掉 beta 本身的非确定性。
最佳做法?
独立 beta Mac mini + 主 CI 保持冻结。WWDC 后 iOS CI 的核心矛盾是环境不可控,不是「构建失败」——把 beta 拆出去,主 Pipeline 才能重新可信。