连接成功不等于环境就绪
SSH 通了以后,继续检查 Ruby、Bundler 与项目依赖。优先使用仓库锁定的版本,避免用一条全局升级命令改变整个团队的构建环境。
验收点:同一用户可以进入仓库并运行依赖安装命令。
整台物理 Mac 已交给你的团队。先确认连接,再固定工具链,最后注册 runner。用这份清单安排前 30 分钟;工程依赖下载与完整构建耗时取决于你的项目。
尚未租用节点:Apple Silicon M4 / M4 Pro,整机独享,非虚拟机,$20.1/天起。
在注册自动化任务前,保留一条可用的图形连接,再验证 SSH。不要在唯一的连接方式尚未验证时关闭密码登录。
登录控制台,进入对应实例详情,核对节点编号、地址、用户名与连接说明。凭据只在账户内查看,不要复制到工单正文、流水线配置或代码仓库。
从实例详情打开浏览器远程桌面,确认看到的是本实例的 macOS 环境。首次登录后修改系统用户密码,使用团队密码管理工具保存,并明确谁负责续费与凭据轮换。
在 macOS 系统设置的共享选项中检查“远程登录”,只允许需要的用户。使用控制台提供的地址与端口连接;若端口不是默认值,在 ssh 命令中明确传入。
在你的工作电脑生成独立 SSH 密钥,仅把公钥追加到节点的 authorized_keys。保留当前会话,另开终端验证密钥登录成功,再调整其他认证设置。
节点端权限检查
mkdir -p ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
whoami
sw_vers
uname -m
检查结果:用户名应与实例凭据一致,系统版本应符合项目要求,Apple Silicon 环境的架构输出应为 arm64。首次 SSH 连接遇到指纹提示时,先核验主机身份;不要为了连通直接关闭主机密钥校验。
下面是输出格式示例,不是你的节点实测记录。示例工程名为 TeamApp;请替换为仓库中的 workspace、scheme 和签名配置。
$ ssh "$NODE_USER@$NODE_ADDRESS"
Authenticated using "publickey".
$ uname -m
arm64
$ xcodebuild -workspace TeamApp.xcworkspace \
-scheme TeamApp -configuration Release \
-destination 'generic/platform=iOS' \
-archivePath build/TeamApp.xcarchive archive
** ARCHIVE SUCCEEDED **
$ bundle exec fastlane gym --scheme TeamApp
Successfully exported and compressed dSYM file
Successfully exported and compressed ipa file
Successfully generated ipa file:
build/TeamApp.ipa
SSH 通了以后,继续检查 Ruby、Bundler 与项目依赖。优先使用仓库锁定的版本,避免用一条全局升级命令改变整个团队的构建环境。
验收点:同一用户可以进入仓库并运行依赖安装命令。
Archive 成功但 IPA 导出失败时,优先检查导出方式、签名证书与描述文件。保留第一处报错及其上下文,不要只截最后一行失败提示。
验收点:目标路径中有可供后续任务使用的构建产物。
节点是独享物理机,但项目能否并行仍受内存、磁盘与任务隔离方式影响。先以一个构建任务验证完整链路,再增加并发。
在仓库或组织的 Actions 设置中新增 self-hosted runner,选择 macOS 与 ARM64。按该页面当前提供的下载、校验和注册命令执行,不使用来源不明的旧安装包。
注册时使用专用系统用户,并添加 vmfly、ios-build 等用途标签。把工作流的 runs-on 指向对应标签,避免任务继续落在共享执行环境。
runs-on: [self-hosted, macOS, ARM64, vmfly, ios-build]
验收点:管理页面显示 runner 在线,手动触发的任务由本节点接收。
使用与你的 GitLab 环境兼容的 Runner 版本,按项目或组的 runner 创建流程取得认证令牌。在 macOS 上使用 shell executor,给节点标记 macos-arm64 与用途标签。
在流水线任务中指定相同 tags。确认 Runner 工作目录归运行用户所有;证书、依赖缓存与归档输出也应由同一用户访问,避免交互终端成功而自动任务失败。
ios_archive:
tags:
- macos-arm64
- ios-build
script:
- bundle exec fastlane gym
验收点:测试任务能输出系统架构,并读取项目所需的工具链。
GitHub runner 可在注册目录按其服务脚本执行 ./svc.sh install 与 ./svc.sh start。GitLab Runner 按安装方式执行 gitlab-runner install 与 gitlab-runner start。不要对同一 runner 重复安装两套自启机制。
macOS 上以用户 LaunchAgent 运行的服务通常依赖该用户登录会话。检查服务实际生成的配置与运行身份,不要把“开机”误认为“构建用户已登录”。在无发布任务时验证一次重启后的上线、路径、钥匙串访问与产物导出。
通过团队批准的安全方式传入构建证书与描述文件。证书需要包含对应私钥;仅导入公开证书不能完成签名。将解锁密码与自动化令牌放在 CI 的受保护变量中,限制可使用它们的分支与任务。
使用 fastlane match 的团队应沿用现有存储与访问策略,CI 读取既有签名材料时优先采用只读模式。检查 bundle identifier、目标团队、导出方式以及描述文件有效期是否一致,再排查归档命令本身。
无人值守任务需能访问指定钥匙串。不要把长期明文密码写入脚本,也不要在日志中打印环境变量全集。共享日志前,删除私钥、令牌、密码和签名材料内容。
先读取节点当前环境,再决定是否安装项目需要的版本。不要假设交互桌面选中的 Xcode 就是 runner 进程正在使用的版本。
检查当前选择;切换路径需替换为实际安装目录
xcodebuild -version
xcode-select -p
xcrun simctl list runtimes
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcodebuild -checkFirstLaunchStatus
给不同 Xcode 应用使用可辨识的文件名。共享节点上的多个项目若使用不同版本,优先在任务内设置 DEVELOPER_DIR,而不是每次构建都改系统全局选择。
验收点:在 runner 的实际任务日志中输出 xcodebuild -version,与项目要求一致。
在 Xcode 设置中安装项目所需的运行时,安装后用 xcrun simctl list 检查可用设备。UI 测试要明确 destination,避免测试任务等待不存在的系统版本或设备。
验收点:先单独启动目标模拟器,再执行一组最小 UI 测试。
给项目指定独立 DerivedData 路径,保留必要缓存并设置产物保留策略。清理前停止相关构建,先核对目录内容与占用,不对共享工作目录直接执行递归删除。
验收点:依赖、缓存和 IPA 各有明确目录,磁盘余量能够容纳下一次归档。
Xcode 首次启动所需组件应在接入自动化前完成。若交互终端能找到命令而 CI 提示找不到,比较运行用户、PATH、工作目录与 shell 初始化方式,不要先重装全部依赖。
浏览器桌面适合首次设置,持续图形操作可比较客户端连接,无人值守构建交给 SSH 与 runner。三种图形方式都不应成为保存代码和产物的唯一位置。
| 连接方式 | 适用操作 | 起步设置 | 卡顿时先检查 |
|---|---|---|---|
| 浏览器远程桌面 | 首次登录、系统设置、临时查看构建现场 | 从控制台实例详情进入;先使用单屏与适中分辨率 | 本地网络、浏览器缩放及是否同时打开多个桌面会话 |
| VNC 客户端 | 较长时间操作图形界面,调整客户端编码与画质 | 按实例连接说明配置;先选自动编码或平衡画质 | 逐步降低画质或色深,避免同时改动多个参数 |
| macOS 屏幕共享 | 从本地 Mac 进行桌面调试与辅助操作 | 使用实例支持的连接方式;从单屏 1920 × 1080 起步 | 高分辨率、动态画面与跨网络链路,先降低分辨率再比较 |
桌面拖影不等于编译任务变慢。通过 SSH 查看任务输出与资源占用,确认构建是否仍在推进。反过来,桌面流畅也不能证明签名、依赖下载或远端仓库访问正常。
连接异常时记录使用方式、发生时间与时区、本地网络类型,以及 SSH 是否仍可连接。涉及远程登录或屏幕共享设置变更时,保留现有可用会话,避免修改后失去所有连接方式。
账户、实例和账单在控制台管理。先核对订单编号与实例编号,再处理续费或配置调整,避免把发布任务安排在未确认的租期之后。
在控制台查看当前订阅、到期时间与待付账单,完成付款后重新核对订阅状态。到期前将代码、证书备份与构建产物同步到团队受控位置,不把到期节点当作长期备份。
未续费节点到期后停止服务并整盘擦除。需要保留的数据应提前迁出。
Glide M4 为 Apple Silicon M4、16GB 内存、256GB SSD;Cruise M4 Pro 为 Apple Silicon M4 Pro、64GB 内存、2TB SSD。换档前通过工单确认处理方式,不将其理解为原机上的即时内存升级。
+1TB SSD、+2TB SSD 与 Thunderbolt 5 并联选项在下单配置中核对;已租节点的调整先提交工单确认。
仅支持 USDT-TRC20 与 Visa / Mastercard / Amex(经 Stripe),全部以美元结算。实际可用网关以接口返回为准,支付确认后才开始分配物理机。
付款状态未更新时,附订单编号与支付凭证;USDT 付款另附交易哈希。不要重复支付,也不要发送完整卡号。