从本地打包到云端交付

把夜间构建排好,
让工作电脑准时收工。

用多台独享物理 Mac 搭建 iOS 打包农场。把不同 scheme 分派到 macOS runner,分别完成归档、签名与 TestFlight 上传,不再让所有任务挤在同一台工作电脑上。

ArmRDP 提供整台 Mac mini,非虚拟机。三档配置、5 个节点,$21.1/天起;先迁一条流水线,再按实际队列扩展。

夜间出包需要先完成 runner、签名与上传配置;交付耗时由项目、依赖和任务队列决定。

夜间交付 · 任务分派示意

一条发布线,分成三路构建。

按 scheme 隔离任务,按节点汇集产物。

  1. A
    主应用 · Releaserunner-app → archive → codesign
    .ipa
  2. B
    扩展与配套目标runner-extension → build → test
    .xcresult
  3. C
    候选版本验证runner-check → simulator → report
    测试报告
调度原则
一台先跑通
扩展方式
增加独立 runner
示例流程,非实时数据。各路任务需按项目依赖设置先后关系;通过检查后再上传 TestFlight。
CI/CD 团队

固定工具链,比反复排查环境更有用。

把云端 Mac 注册为 GitLab 或 GitHub Actions 的 macOS self-hosted runner。仓库仍按团队现有方式管理,只把需要 macOS 的 job 定向到这台物理节点。

先让一次构建可复现

记录 Xcode 完整版本、SDK、命令行工具路径和依赖锁文件。用 xcodes 管理多个 Xcode 版本,再为每个 job 指定 DEVELOPER_DIR,避免不同项目争用同一个全局选择。

runner 标签至少表达系统、工具链和用途,例如 macos、xcode-pinned、ios-release。发布任务只匹配受信任的 runner;未经审查的分支不要进入持有签名材料的执行环境。

起步时每台机器只接一个重型构建任务。观察冷构建、缓存命中、内存压力和磁盘增长,再决定提高并发还是增加节点。机器数量不是唯一变量,缓存与任务拆分同样影响队列。

先核对环境,再归档
xcodebuild -version
xcode-select -p
xcrun --sdk iphoneos --show-sdk-version

xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -archivePath artifacts/App.xcarchive \
  archive

将 App 工作区与 scheme 替换为项目实际名称。归档产物、构建日志和测试结果按 job 独立保存;不要让两个任务写入同一个输出目录。

应用发布

归档、签名、上传,留在同一条可追溯链路里。

面向 App Store 上架,把构建产物与对应的提交、工具链、签名配置关联起来。云端 Mac 承担执行环境,发布权限与审核材料仍由团队管理。

归档与导出

保留 .xcarchive、导出配置与 dSYM。先验证 Release 配置、版本号和构建号,再执行导出;不要只保留最终 .ipa 而丢掉排查崩溃需要的符号文件。

验收点:产物能对应到唯一提交与构建号。

签名与凭据

通过受控方式导入分发证书与描述文件,为构建任务使用独立 Keychain。若采用 fastlane match,限制仓库访问权限,并把解密材料放入 CI 密钥存储,而不是写进脚本。

验收点:非交互任务能够完成 codesign。

上传与审核素材

使用团队授权的上传凭据提交产物。通过图形界面检查模拟器画面并生成审核素材,核对目标设备、语言和版本;上传完成与审核通过是两个不同阶段。

验收点:上传结果、素材和日志一并归档。

发布 job 应限制触发分支与操作者。证书到期、描述文件不匹配或上传权限不足,需要按日志分别处理;增加机器配置不能解决这些问题。

macOS 应用开发

命令行跑任务,图形界面查细节。

独享物理节点原生运行 macOS,Metal 与模拟器可用于相应开发任务。SSH 负责脚本和日志,VNC 屏幕共享负责 Xcode、模拟器与界面检查,两种接入方式各做擅长的事。

适合放到远端的任务

固定版本编译、自动化测试、模拟器截图和依赖安装,都可以脱离本地工作电脑执行。交互排查时,先在图形界面复现,再把能够重复的步骤收进脚本。

先核对目标系统、模拟器 runtime 与 Xcode 版本是否匹配。

需要单独验证的边界

远程画面的响应取决于网络路径、分辨率和编码设置,不等同于本地显示器。涉及外接设备、特定外设或高频交互的工作,先按天运行真实任务,再决定是否迁移。

AI 实验

用 64GB 统一内存,验证模型能否进入工作流。

ArmRDP M4 Pro 配备 M4 Pro、64GB 统一内存与 2TB SSD。适合在独享环境中做本地模型加载、量化版本对照和推理接口验证,再判断是否值得继续投入。

先测容量,再测速度

模型文件大小不等于运行内存。权重之外还要计入 KV cache、上下文长度、运行框架和其他进程;先从目标模型的小上下文开始,记录峰值内存与内存压力,再逐步增加请求量。

使用支持 Apple Silicon 的推理框架,并确认具体算子与模型格式的兼容性。统一内存不是任意模型都能运行的保证,也不能直接推导出生成速度;用自己的提示词、上下文和输出长度做验收。

一次实验至少留下四项记录

  • 模型名称、版本与量化格式。
  • 上下文长度、批量大小与峰值内存。
  • 首次加载耗时与稳定运行后的响应。
  • 请求样本、输出质量与失败日志。

推理实验与正式发布构建尽量分开调度,避免争用内存影响结果。远程接口应使用认证与受限访问,不直接公开监听端口。

从一条流水线开始迁移

先搬数据,再对齐环境,最后切换调度。

不要第一次就迁走整套发布系统。选一个依赖明确、能在本地稳定出包的 scheme,把本地结果作为对照,依次通过下面三道验收。

  1. 01 · 数据

    迁仓库,也迁签名所需材料

    通过只读或最小权限凭据拉取仓库,核对子模块、私有依赖与大文件。证书、描述文件和解密密钥分别管理,不把敏感文件提交到代码仓库。

    • 确认固定提交可完整检出。
    • 确认构建所需密钥可被受控读取。
    • 将产物与备份保存在节点之外。

    通过条件:同一提交的数据与依赖齐全。

  2. 02 · 工具链

    把“我电脑上能跑”写成清单

    用 xcodes 安装并锁定项目需要的 Xcode。保存 Homebrew 依赖清单与包管理锁文件,补齐目标模拟器 runtime,记录环境变量和执行路径。

    • 比对 Xcode 与 SDK 版本。
    • 先跑一次无缓存构建。
    • 按项目隔离 DerivedData 与缓存。

    通过条件:手动执行可以得到预期产物。

  3. 03 · CI 接入

    注册 runner,只切一条发布线

    注册 runner、设置标签与仓库权限,把首条流水线定向到云端 Mac。成功后再加入签名和上传阶段,最后扩展到其他 scheme 与独立节点。

    • 首次使用单任务并发。
    • 保留日志、测试报告与符号文件。
    • 失败时仍能切回原有执行环境。

    通过条件:无人值守任务可重复完成。

迁移期间保留原有 runner,直到冷构建、签名、上传与失败重试都验证完成。租期结束前导出需要保留的数据,不将节点磁盘当作唯一归档位置。

三档选型参考

构建次数用来分组,真实项目用来定配置。

下面按每日任务量给出起步建议,不是吞吐测试或出包承诺。一次大型全量编译可能比多次增量构建更重;同时记录单次耗时、缓存命中和峰值内存,再决定纵向升级或横向加机。

每日构建次数为规划分组;三档均为独享物理机,默认先验证单任务执行。
每日任务量参考 起步机型与规格 优先验证什么 按天租用
1–5 次
临时验证、单项目起步
ArmRDP M4 Base
M4 / 16GB / 256GB
先跑归档与签名闭环;关注依赖安装、DerivedData 和产物对磁盘的占用。 $21.1/天租用 M4 Base
6–20 次
持续集成、频繁迭代
ArmRDP M4 Plus
M4 / 24GB / 512GB
核对编译与测试共存时的内存压力;先优化缓存,再判断是否需要多台 runner。 $41.4/天租用 M4 Plus
21 次及以上
多目标、重型任务评估
ArmRDP M4 Pro
M4 Pro / 64GB / 2TB
验证大项目或模型实验的资源需求;若瓶颈是排队,将独立任务拆到多台节点。 $59.5/天租用 M4 Pro

把节点与租期一起纳入判断

5 个节点为新加坡、日本(东京)、韩国(首尔)、香港、美国西部,三档机型均覆盖。图形交互优先比较团队到节点的连接体验;无人值守构建则同时检查仓库、依赖下载与产物上传路径。实际可用状态以控制台实时返回为准。

验证阶段按天开始;固定发版节奏再比较周、月、季价格。支持 USDT-TRC20 与 Visa / Mastercard / Amex(经 Stripe),统一美元结算,实际可用网关以后端返回为准。

先租一天,验收一条真实流水线。

带上一个 scheme、一组签名配置和明确的验收标准。跑通归档、签名与交付后,再为更多任务安排节点。