首页 / 博客 / Kotlin Multiplat
ENGINEERING_BLOG · 2026.10.18

Kotlin Multiplatform iOS CI:托管构建还是远程 Mac?2026

iOS 任务在非 Mac 节点上无法完成,或者 CI 过了构建却卡在签名发布?
本周建议动作:先把共享代码检查与 Apple 平台交付拆成不同阶段;标准流程先试托管 macOS Agent,需要固定工具链、私有环境接入或自定义节点运维时,再评估远程 Mac。签名凭据另行验收,不要只凭“有没有 Mac”决定。

这篇文章适合没有 Mac、但要验证 KMP iOS 目标的独立开发者;也适合把项目推进到团队交付的技术负责人,以及维护 Apple 平台 CI 的 DevOps 工程师。

SECTION 01 环境控制:按节点控制边界选择方案

先按你需要控制的边界选节点,而不是先猜哪一种更快或更稳定。托管 macOS Agent 减少自行准备机器和维护基础环境的工作;远程 Mac 则让你直接管理节点、工具安装和访问方式。实际可用能力取决于具体方案,稳定性、速度和恢复表现都要用项目流水线验证。

决策维度 托管 macOS Agent 远程 Mac
开始试跑 适合直接接入标准 CI 流程 需要确认节点接入、权限和 Agent 配置
工具链控制 受服务提供的镜像与配置方式限制 可自行安装、固定并检查项目所需工具
私有环境 先核验网络准入与地址策略 先核验网络路径、访问控制与凭据边界
日常维护 由托管方案承担部分节点维护 团队需负责节点配置、升级与故障诊断
适合的起点 标准构建、测试及交付流程 自定义环境、持续控制或特定接入要求

这张表只是筛选条件,不是对性能的承诺。比如,托管节点可能不能满足你对固定网络入口或环境保留的要求;远程节点即使可以自行配置,也不代表团队已经具备重启后恢复、版本升级和凭据清理流程。

你若要把 CI 连接到私有资源,应先检查服务的网络准入边界。以托管节点文档为例,标准 macOS Runner 的网络特性与其他 Runner 类型并不完全相同,官方文档也明确列出相关限制;不要把某个托管产品的能力当成所有托管 macOS Agent 的共同属性。查看托管 Runner 的官方限制说明。

SECTION 02 交付范围:区分共享代码验证与 iOS 交付

Kotlin Multiplatform 的共享逻辑验证和 iOS 交付不是同一件事。共享代码及适用于当前目标的通用检查,可以保留在现有执行环境;需要编译 Apple 目标、运行 iOS 模拟器或完成 Apple 平台交付时,应安排 macOS 与 Xcode 阶段。官方文档说明,除 iOS 外的共享或平台专属开发可在 IDE 支持的其他系统上进行,但 iOS 模拟器只能在 macOS 上运行。Kotlin Multiplatform 平台要求。

流水线阶段 可否留在现有非 Mac 环境 需要核验的边界
共享代码静态检查与通用测试 通常可以,按项目目标与任务配置确认 该任务实际编译哪些 source set、依赖和目标
Android 相关构建与测试 可沿用团队已验证的执行环境 Android 工具链与项目自身版本约束
KMP iOS 目标编译 安排 macOS 执行 Xcode、Kotlin/Native、原生依赖是否匹配
iOS 模拟器运行 安排 macOS 执行 模拟器运行时、测试目标和报告是否可用
签名、上传与 TestFlight 验收 安排受控的 Apple 交付阶段 团队权限、签名材料、上传结果及凭据治理

Kotlin 官方提供了在托管 macOS Agent 上构建、测试、配置 Apple 签名并发布到 TestFlight 的流程示例。这证明托管流程可以作为一种实现路径,并不证明任意托管方案都支持你的项目、权限策略或发布流程。官方 KMP iOS CI/CD 示例。

SECTION 03 版本兼容:试跑前先锁定哪些组合?

别在首次 CI 试跑时顺手升级工具链。先从仓库当前配置提取 Kotlin Multiplatform Gradle 插件、Gradle Wrapper、Xcode、macOS、iOS 部署目标、Android Gradle Plugin(若项目使用)及原生依赖版本,再用这套已知基线检查执行节点。

截至 2026 年 10 月 18 日,Kotlin Multiplatform 兼容性指南列出的 Kotlin 插件、Gradle、Android Gradle Plugin 与 Xcode 对应关系,已经包含随版本变化的兼容范围。指南当前列出的 Kotlin 插件 2.4.20–2.4.21 对应 Gradle 7.6.3–9.7.0 和 Xcode 26.4;这些是官方兼容信息的时点快照,不是对你项目中所有插件或第三方原生依赖的兼容保证。发布前应重新核对指南和 Kotlin 当前发布记录。查看 Kotlin Multiplatform 官方兼容表。

Gradle Wrapper 能让执行环境按仓库声明的 Gradle 版本运行;先使用项目提交的 Wrapper,而不是依赖节点预装版本。随后单独核对 Xcode 与 macOS 是否满足 Kotlin 插件、模拟器和原生依赖要求。Gradle Wrapper 官方说明。

需要特别区分两种限制:官方兼容指南给出的版本约束,属于发布方声明;项目插件、CocoaPods 或 Swift Package、手写构建脚本及原生库造成的问题,则必须用你的仓库实测。遇到不兼容时,先记录失败任务和依赖链,再改变单一变量;不要通过升级整套工具链掩盖真正的冲突。

SECTION 04 复现与运维:把一次成功变成可验收结果

在选型之前,用同一提交、同一 iOS 目标和相同配置分别跑候选环境。记录 CI 日志、测试报告、产物标识、工具版本和失败重跑结果;如果失败后只能依赖节点上的临时状态才能通过,就还没有证明流水线可复现。

里程碑 A:建立不依赖发布凭据的基线

从现有仓库选定一个提交,保留 Gradle Wrapper 与锁定文件,明确构建任务和模拟器测试目标。先执行 iOS 编译与项目已有测试,确认产物和日志能从 CI 结果中取回;不要在这一步注入发布密钥。

里程碑 B:核验节点变更与恢复

核对执行节点实际使用的 macOS、Xcode、命令行工具及依赖缓存;再按方案允许的方式重启或重新分配节点,重复相同任务。检查任务失败时能否定位原因、重跑时环境是否符合预期,以及升级工具链前是否能保留原基线。

里程碑 C:签名与发布单独放行

只有构建和测试阶段验收后,才接入签名凭据及上传步骤。Apple 文档要求 TestFlight 或 App Store 分发涉及相应开发者团队与 App Store Connect 应用记录;上传完成也不等于处理完成,应检查平台返回的交付状态和日志。Apple 的应用分发准备说明与App Store Connect 上传说明分别说明了这些交付环节。

常见问题(FAQ)

没有自己的 Mac,KMP 项目还能跑 iOS CI 吗?可以先测试托管 macOS Agent。把共享代码检查留在已有环境,只有需要 macOS 与 Xcode 的 iOS 构建和模拟器阶段才切到 Mac 执行;试跑前确认托管流程覆盖你的依赖、测试目标及凭据治理要求。

托管 Agent 和远程 Mac,怎么判断哪种适合项目?标准流程先试托管方案;需要固定并持续控制节点、接入私有网络或自行维护环境时,再试远程 Mac。比较时用相同提交和目标记录任务结果、日志及产物,不要仅凭“托管”或“远程”推断速度、稳定性或恢复能力。

KMP iOS 构建成功就表示 TestFlight 发布已打通吗?不表示。构建通过与签名、上传是不同验收点;你还要确认开发者团队授权、签名资产、上传凭据、App Store Connect 中的处理结果,以及密钥的访问、清理和撤销流程。

什么情况值得租用或自建远程 Mac?当托管 Agent 无法满足固定工具链、私有环境准入或节点访问控制要求,且团队有人承担维护与恢复责任时,可以评估远程 Mac。若只是共享代码检查,或托管流程已通过完整发布验收,维护额外节点未必能抵消其运维投入。

SECTION 05 成本与准入:确定托管、远程或双轨

比较成本时不预设金额,而是把团队能核实的输入放进同一张表。总成本不仅是节点费用,也包括维护和凭据治理所耗的工程时间。

核算项 托管 macOS Agent 远程 Mac
实际使用周期 按当前方案核实计费方式与使用周期 按实际租用周期和套餐可用内容核实
任务量与并行需求 查当期方案的构建额度、并行限制及超额规则 记录实际排队、任务并发与节点占用
工具链维护 核实镜像、版本选择和自定义能力 核算安装、固定版本、升级和恢复投入
私有接入与凭据 确认网络策略、密钥注入和审计能力 确认访问范围、凭据隔离及清理责任
迁移与回退 记录流水线配置及产物迁出办法 记录节点替换、数据清理和回退路径

按现有流水线定义算账时,至少把实际使用周期、任务量、维护投入、凭据治理要求和切换成本逐项填实。托管方案的功能和价格会随产品及时间变化,远程 Mac 的套餐与交付内容也要以当期可核验页面为准;VPSNIX 当前可选周期与套餐信息应在试跑前直接核对远程 Mac 租赁页面,不要把本文当成价格报价。连接方式或使用流程有疑问时,可再查阅VPSNIX 帮助中心。

截至 2026 年 10 月 18 日核对的官方资料支持一个清晰边界:KMP 的 iOS 交付可以按托管 macOS Agent 流程搭建,但需要 macOS 与 Xcode 的 Apple 目标阶段不能由一般 Linux 执行环境替代;具体方案能力和版本仍须发布前复核。官方 KMP iOS 构建说明也明确了 iOS 构建所需环境。

决策落点:标准任务先试托管;工具链必须固定、私有接入或持续节点控制需求已经明确时,再评估远程 Mac;签名或恢复环节尚未验收时,先让少量任务双轨运行。托管方案可能受环境选择和网络准入限制,远程 Mac 则需要你投入节点维护、升级与故障排查,两者都不能替代凭据治理。若你确定需要受控的 Mac 执行节点,又不想先购买实机,可以按实际流水线任务核对 VPSNIX 的套餐和连接说明,再用同一提交验证环境;若任务长期稳定且维护能力具备,自购 Mac 也应纳入总成本比较。