如果你在新加坡、日本、韩国、香港、美国东部、美国西部落地 iOS/macOS 流水线,迟早要面对一道路由题:哪些 job 交给 Xcode Cloud 这类 Apple 托管路径,哪些必须落到独占 Apple Silicon 的远程 Mac Mini(M4 / M4 Pro)上?本文给工程负责人一张决策矩阵 + 六步混合 Runbook:先拆队列语义与定制天花板,再把 Archive、合规与制品链路绑到已知宿主机与六国区位。读完你应能写清「PR 在校验云、夜间 Archive 在独占机」这类可审计路由规则,并与站内节点租期指南、Runner 密钥清单并联。
本篇刻意不与买租 TCO抢同一道题:TCO 回答「资本化 vs 运营化」,这里回答「workload 放哪条执行面」。
实践中还有一个常被忽略的交接面:描述文件与签名材质往往在两条池之间不同步。混合 CI 若只在工具层面「并行尝试」,而不在钥匙串 / match 仓库 / ASC API Key 轮换上做单源治理,失败会被误读为「云不稳定」或「独占机磁盘慢」。建议在评审模板里强制回答:同一版本的 Distribution 证书是否在两条池都能非交互导入、夜间 Archive 失败是否能在 15 分钟内判定为签名还是网络。
另一条交接面是缓存哲学:托管池倾向鼓励「干净起步」,而独占机会沉淀 DerivedData、Pods 与 SPM 缓存;若路由不把缓存命中率写进观测,财务会看到云端分钟数下降的同时独占机磁盘飙升——需要在台账同时跟踪每千次构建的字节写入与节省的队列分钟,否则混合 ROI 说不圆。
下表用于评审附件的第一页;请在每一格填入你们组织的证据链接(流水线 YAML、值班截图或审计编号),避免口头「我们觉得差不多」。
| 维度 | Xcode Cloud(托管) | 专用远程 Mac Mini M4 / M4 Pro(独占) |
|---|---|---|
| 运营模型 | Apple 托管;工作流挂在 Xcode / ASC 生态内 | SSH/VNC 直达;你设定 launchd/cron、Runner 标签与磁盘布局 |
| 并发语义 | 订阅档位 + 共享池;峰值排队需读账单与队列面板 | 自设并发上限;邻居噪声可视为零(裸金属独占) |
| 镜像 / 定制 | 受支持步骤边界约束;系统级定制空间有限 | 任意 shell、Docker sidecar、额外 Agent(含 OpenClaw Gateway) |
| 区域 placement | 跟随 Apple 可用区策略 | 可选新加坡、日韩、港台、美东、美西——贴近 Git/Registry/ASC 出口 |
| 典型最佳适配 | 标准 scheme、TestFlight hook、团队 onboarding 友好 | 重度 Archive、奇异签名、内部工具链、合规点名宿主 |
混合不是偷懒:若缺少路由表(Routing Table),两套环境会在密钥、描述文件与缓存路径上互相踩踏;文档化「哪个分支默认跑哪张池」比再多买一台机器更重要。
L1 PR 冒烟(轻)、L2 nightly 集成(中)、L3 Archive + notary + 上传(重);分别统计墙钟分位数而非平均值。L3 绑到 RTT 最优的六国节点——详见制品就近矩阵。metal-m4、archive-only 等标签;密钥按仓库粒度隔离,抄Runner 清单字段即可。第 4 步与第 5 步之间建议插入48 小时冻结窗:任何改动若同时触及 Xcode 小版本与路由表,只允许改其一;否则排障会陷入「到底是 Apple 侧镜像漂移还是我们标签写错」的双头扯皮。冻结窗内只做观测与回滚,不叠加新试验。
若团队已经实践跨时区接力 CI,可把接力窗绑定到独占池:白昼在人机协同密集的时段使用 Xcode Cloud 做快速反馈,夜班把长耗时矩阵甩到独占节点——前提是artifacts 交接字段(commit、scheme、签名上下文哈希)在工单里可读,而不是仅靠 Slack 口述。
# 示例:伪路由片段——按分支与工作流类型拆分执行池
# L1 -> xcode-cloud-default
# L3 -> self-hosted labels: [metal-m4, archive, sg-region]
routing_rules:
- match: { branch: "release/*", job: "archive" }
target: dedicated_remote_mac
region_hint: ["jp", "sg", "us-east"] # 按 Git/ASC RTT 实测替换
- match: { branch: "feature/*", job: "unit-ui" }
target: xcode_cloud
L3 增加独占容量或缩短租期反馈环。.xcarchive 哈希树差异;若差异集中在签名材料或嵌入路径,说明路由仍混用了钥匙串上下文。额度解决的是排队表象,不解决镜像边界:当你要在 Archive 前插入私有合规扫描或要与OpenClaw Docker 生产拓扑侧车共存,托管池往往要求你把步骤强行拆进不被支持的缝隙,工程债反而上升。
临时笔记本当 Runner 则输在电源、睡眠与审计:夜间 job 与钥匙串提示无法写成 SLA;财务也无法把「借用」折旧进合规台账。
相对这类折衷,当你需要在六国之一落地独占 Apple Silicon、可把租期切成基线 + 峰值,并让 SSH、Runner、Archive 与可选 Agent 网关落在同一张可点名工单里时,MACCOME 的 Mac 云主机通常更易把「混合 CI」从口号拆成可验收条目:节点区位覆盖新加坡、日本、韩国、香港、美国东部、美国西部等协作热点,搭配按日/周/月/季组合的弹性租期,先把独占执行面写稳,再接 Xcode Cloud 做轻量并行,而不是反向操作。
混合 CI 在 2026 年的胜负手,是能否复述规则:新人入职当天应能读出「我的 PR 为什么只在云端跑、Release Archive 为什么只在 JP 区独占机跑」。把矩阵贴在wiki不如写进 pipeline repo 的 ROUTING.md,并与租期与区位指南互相引用。
评审收尾五分钟请核对两件事:密钥是否仍单源、峰值租期是否在财务系统里有对应科目;否则混合只会制造双倍运维故事。
最后补一句文档契约:路由表应标明「默认池」与「逃逸 hatch」——当 Xcode Cloud 连续三次在同一失败簇卡住时,允许紧急路由到独占池,但必须在 24 小时内补齐 RCA,并把临时 hatch 收敛成正式规则或回滚。没有逃逸条款的团队会在事故夜人肉改 YAML;有条款却无 RCA 的团队会把独占池变成永久兜底,云端订阅形同虚设。
与SSH 与 VNC 接入指南并行阅读时,请记住:连通性就绪不等于路由就绪;SSH 能登录却只说明你能摸到 shell,不代表 Archive 钥匙串与 Runner 标签已经对齐混合策略。