ENGINEERING SUPPORT

先保留证据,再缩小云端 Mac 的故障范围

这是一份按执行顺序编排的工程指南。先核对设备与网络,再检查 Xcode、签名和 CI 环境,最后处理存储、升级与恢复,避免在多个变量之间反复试错。

6 类 工程问题入口
5 个 可选节点
365 天 节点正常运行
诊断运行单 RUN / SUPPORT
按依赖顺序核对

连接 → 环境 → 构建 → 数据

READY
01 / 设备
设备标识、节点、主机指纹
02 / 网络
本地接入、路由、端口与时延
03 / 工具链
macOS、Xcode、证书与依赖
04 / 任务
复现命令、日志、退出码与时间
提交工单前 脱敏日志并记录已完成步骤
CONNECTION ORDER

连接失败时,先确认目标机器,再确认连接工具

不要在主机地址、端口和凭据尚未核对时反复切换客户端。下面四步应按顺序完成,每一步都为下一步提供可验证的输入。

  1. 01

    读取设备资料

    登录控制台,在对应订单中核对设备标识、所选节点、主机地址、SSH 端口和当前凭据。多台设备并行使用时,先把订单号与设备标识一一对应。

    保留 订单号、设备标识、节点、端口
  2. 02

    核对主机指纹

    首次连接应把客户端显示的指纹与控制台记录比对。设备重装后若指纹发生变化,先确认变更记录,再清理本地旧条目,不能直接忽略警告。

    ssh-keygen -R example-host
    ssh -p 22 user@example-host
  3. 03

    先建立 SSH 基线

    先从有线网络测试 DNS、端口与 SSH。成功后记录登录时间、出口网络和命令行响应;失败时保留完整错误信息,不要只截取“连接失败”一行。

    判断 超时偏向路由或端口;拒绝连接偏向目标服务;认证失败优先核对凭据与权限。
  4. 04

    再配置图形界面连接

    只有 SSH 基线稳定后,才继续核对图形界面所需的地址、端口、客户端版本和本地防火墙。画面卡顿时同步记录分辨率、编码设置与网络时延。

    边界 图形界面可用不代表高码率媒体预览等同本地显示,应按实际链路验证。
NETWORK MEASUREMENT

五个节点的 ping 中位数,要在同一口径下比较

下表用于展示从主要城市到新加坡、日本(东京)、韩国(首尔)、香港、美国西部的路由差异。数据是选点参考,不是应用吞吐、图形界面帧率或任务完成时间承诺。

测试时段 工作日 14:00–16:00 UTC+8
样本量 每个节点 50 次
接入方式 千兆有线网络
统计值 往返时延中位数
从三个主要城市到五个 VMDebug 节点的 ping 中位数参考,单位为毫秒
测试源 运营商 新加坡 日本(东京) 韩国(首尔) 香港 美国西部
上海 中国电信 71 ms 42 ms 46 ms 34 ms 141 ms
深圳 中国联通 44 ms 55 ms 59 ms 18 ms 157 ms
北京 中国移动 91 ms 48 ms 39 ms 63 ms 138 ms
先测本地

排除 Wi-Fi 与本地出口波动

使用网线直连,暂停大文件同步、视频会议和系统更新。连续测试本地网关与节点地址,如果两者同时抖动,应先处理本地接入。

再看路由

中位数不能解释全部体验

远程交互还受丢包、抖动、上行带宽和客户端编码影响。提交网络问题时,应同时提供运营商、城市、测试时段、样本量与路由追踪结果。

XCODE DIAGNOSTICS

签名失败不要先删环境,按五层依赖逐项收敛

同一个错误可能来自证书不可用、描述文件不匹配、Keychain 无访问权限、缓存污染或构建参数差异。先保存原始日志,再按下面顺序检查。

  1. 01

    证书

    确认目标证书存在、未过期,证书与私钥能够配对,并且当前构建用户可以读取。先列出签名身份,不要直接重新导入全部材料。

    security find-identity -v -p codesigning
  2. 02

    Provisioning Profile

    核对 Bundle Identifier、团队标识、证书类型、设备范围与能力声明。手动签名项目应确认配置实际指向目标文件,而不是旧缓存。

    CODE_SIGN_STYLE / PROVISIONING_PROFILE_SPECIFIER
  3. 03

    Keychain 权限

    CI 用户与交互登录用户可能使用不同的 Keychain 搜索列表。确认目标 Keychain 已解锁、加入搜索路径,并允许构建进程读取私钥。

    security list-keychains
  4. 04

    DerivedData

    先记录当前路径与失败任务,再只清理对应项目的派生数据。不要把删除全部缓存当成第一步,否则会丢失可比较的构建证据。

    xcodebuild -showBuildSettings
  5. 05

    构建日志

    保存完整命令、Scheme、Configuration、SDK、Xcode 版本、退出码和首次失败位置。优先查看第一条根因错误,而不是最后一行汇总。

    xcodebuild -version
CI/CD RUNNER

把执行器当作可复现的运行单,而不是长期堆积的工作目录

独享物理 Mac 可以持续运行构建任务,但稳定性仍取决于身份、目录、缓存、密钥和回滚边界。每次变更应能回答“改了什么、如何验证、如何撤回”。

执行器接入核对单 5 CHECKS
  1. 01

    注册执行器身份

    为每台设备使用可识别的执行器名称和标签,记录注册范围、服务用户与启动方式。避免多个执行器共用无法区分的名称。

  2. 02

    隔离工作目录

    按仓库、分支或任务建立独立目录,禁止并发任务写入同一 DerivedData、归档目录或依赖输出位置。

  3. 03

    给缓存设边界

    区分可重建缓存与必须保留的产物。清理前记录目录大小、最近使用时间和任务归属,避免全盘删除造成冷启动。

  4. 04

    运行时注入密钥

    密钥只在任务需要时进入进程环境或临时 Keychain,日志中关闭回显,任务结束后删除临时材料并锁定访问。

  5. 05

    定义失败回滚

    更新执行器、Xcode 或依赖前保留版本记录。验证失败时恢复配置文件、工具链选择和缓存索引,而不是继续叠加修改。

工作目录

每个任务生成唯一路径

路径至少包含项目标识、任务标识与尝试次数。清理动作只允许命中本次任务目录,避免误删并发构建。

WORK_ROOT="$HOME/ci-work"
JOB_DIR="$WORK_ROOT/$PROJECT/$RUN_ID"
mkdir -p "$JOB_DIR"
失败证据

退出前归档四类信息

保存执行器版本、工具链版本、完整退出码和首个根因日志。缓存命中率与磁盘余量也应写入任务摘要,便于比较前后差异。

  • 执行器与 macOS 版本
  • Xcode 路径与版本
  • 命令、退出码与日志
  • 磁盘余量与缓存状态
STORAGE & TB5

挂载附加存储前先建立可恢复副本,并联前先画清拓扑

附加存储和 Thunderbolt 5 并联会改变数据路径与权限边界。任何格式化、挂载点调整或设备断开动作,都应先确认数据副本和任务停止状态。

附加存储

挂载前检查

  1. 确认数据副本

    重要代码、素材、构建产物和配置至少保留一份独立副本。尚未验证的挂载卷不能作为唯一存储位置。

  2. 记录磁盘身份

    记录卷名、文件系统、容量、设备标识与预期挂载点,避免仅凭显示顺序判断目标磁盘。

  3. 核对访问权限

    确认运行构建或媒体任务的用户拥有所需目录权限,不要通过全局放宽权限绕过归属问题。

  4. 执行读写验证

    先用可删除的测试文件验证创建、读取、重命名和删除,再迁移真实工作目录。

Thunderbolt 5

多台设备并联顺序

  1. 画出物理拓扑

    标明每台 Mac、线缆方向、共享存储与任务角色。不要在无法识别上下游设备时调整连接。

  2. 统一权限边界

    确定由哪台设备写入、哪些设备只读,并为自动化任务设置独立目录,避免并发覆盖。

  3. 逐台验证链路

    每增加一台设备就完成一次连接、权限和读写测试,不要完成全部接线后再集中排查。

  4. 按任务反序断开

    先停止写入和构建任务,确认缓存已落盘,再卸载卷并从链路末端开始断开设备。

UPGRADE & RECOVERY

系统升级要有验证机、基线和回退材料

所有节点全年 365 天正常运行,平台不安排周期性停机。macOS 与工具链升级由用户根据任务节奏安排变更时段,先在非关键任务上验证,再推进长期执行器。

升级运行顺序 6 PHASES
  1. 01

    建立快照式清单

    导出代码状态、依赖锁文件、Homebrew 清单、Xcode 路径、证书名称、Keychain 列表、执行器配置与磁盘余量。

  2. 02

    备份不可重建数据

    把私有配置、签名材料、构建产物和项目数据迁出到独立位置,并实际验证至少一个文件可以恢复。

  3. 03

    验证工具链兼容

    核对目标 macOS、Xcode、命令行工具、包管理器、执行器和项目依赖的兼容范围,记录必须保留的旧版本。

  4. 04

    暂停写入任务

    停止 CI 队列、素材处理与数据同步,确认没有进程继续写入工作目录、缓存或附加存储。

  5. 05

    完成最小验收

    升级后依次验证 SSH、磁盘、Xcode 版本、证书读取、依赖恢复、测试、归档和产物下载。

  6. 06

    记录新基线

    保存首个成功任务的耗时、日志、缓存状态与磁盘余量,再逐步恢复并发任务,不要一次放开全部队列。

停止条件

出现这些情况先回退

  • 关键证书或私钥无法读取
  • 项目要求的 Xcode 版本不可用
  • 附加存储出现只读或挂载异常
  • 同一基线命令产生新的稳定失败

不要在根因未明确时连续升级多个组件,否则日志无法区分系统、工具链与项目配置的影响。

工单材料

让支持人员能直接复现

  • 订单号与设备标识
  • 问题发生时段与所选节点
  • macOS、Xcode 与执行器版本
  • 最小复现步骤与期望结果
  • 脱敏后的完整日志与退出码
  • 已完成的检查及其结果
提交控制台工单
NEXT ACTION

日志已经脱敏,就把运行单交给支持团队

现有订单问题请在控制台提交工单并附上设备标识、复现步骤和完整错误上下文。尚未下单的配置问题,可通过唯一支持邮箱联系。

support@vmdebug.com