先定位故障层,再提交可诊断的信息
连接不上、构建失败或 runner 停在队列里,不必从重装环境开始。先按订单、网络、系统、工具链四层排查,再把关键日志交给支持人员。
- VNC、SSH、Xcode 与 CI/CD 分开诊断
- 提交订单号、节点、时间与完整错误上下文
- 密钥、令牌和签名密码必须从日志中删除
六类支持入口,对应六种排查起点
先判断问题属于连接、构建、自动化、网络、存储还是结算。分类准确,能减少在不同日志之间来回切换。
VNC 画面与会话
处理黑屏、超时、键盘布局、剪贴板和会话中断。先保留客户端名称、网络出口和发生时间。
签名、依赖与归档
核对证书、描述文件、Keychain 权限、DerivedData、依赖缓存、磁盘余量和导出配置。
Runner 队列与工作目录
检查标签匹配、服务进程、项目授权、并发数、工作目录权限和失败任务后的清理动作。
仓库、依赖源与远程访问
区分本地网络、节点出口、代码仓库和依赖下载源,避免把单一服务超时误判为整机离线。
容量评估与扩展咨询
先统计项目、DerivedData、依赖缓存、归档和模型文件占用,再咨询 +1TB、+2TB SSD 或并联需求。
周期、附加项与支付记录
提供订单号、结算周期、支付类别和页面提示。不要在公开邮件中提交完整支付凭据或敏感信息。
先确认机器可达,再进入工具链
按顺序执行。前一步没有确认,不要直接清缓存或重装依赖,否则会覆盖原始故障线索。
-
01
订单层
检查订单状态
登录控制台确认订单已交付,机型、周期和节点与当前排查对象一致。若订单信息异常,先记录订单号和页面提示。
-
02
寻址层
核对节点地址
确认 VNC 与 SSH 使用的是交付信息中的地址和端口,不要沿用旧节点、旧书签或其他订单的连接配置。
-
03
访问层
确认账户凭据
检查用户名、密码输入和键盘大小写状态。不要把密码、私钥或恢复信息粘贴进工单正文。
-
04
桌面层
交叉测试 VNC 客户端
记录客户端名称、版本和画质设置。若条件允许,用另一台本地设备或另一条网络复测,以区分客户端问题。
-
05
网络层
测试 SSH 连通性
记录 DNS 解析、连接建立和认证分别停在哪一步。VNC 不通但 SSH 正常,通常应优先检查图形会话而非整机网络。
-
06
资源层
检查磁盘空间
关注系统盘剩余容量,以及 DerivedData、依赖目录、归档、模拟器和模型文件。空间不足会引发多种不直观的构建错误。
-
07
工具层
固定 Xcode 版本
记录实际选中的 Xcode 路径和版本,确认 CI 脚本与交互式构建使用同一套工具链,再复现一次失败命令。
把画面问题、网络问题和输入问题分开
VNC 是图形会话,SSH 是命令行路径。两者分别测试,能快速判断故障位于本地客户端、网络链路还是节点会话。
| 现象 | 先做什么 | 需要记录 | 不要做什么 |
|---|---|---|---|
| VNC 黑屏 | 等待会话初始化,重新建立一次连接,并测试 SSH 是否正常响应。 | 客户端名称、发生时间、节点、SSH 测试结果和黑屏截图。 | 不要连续强制重连,也不要立即删除系统或用户配置。 |
| 连接超时 | 切换本地网络复测,确认地址和端口无误,并区分解析超时与认证超时。 | 本地网络类型、错误原文、开始与失败时间、其他网络的复测结果。 | 不要在日志中公开密码、私钥或完整认证内容。 |
| 键盘布局异常 | 核对本地与远端键盘布局、输入法和修饰键映射,使用纯文本编辑器验证。 | 客户端、键盘布局、异常按键和可复现步骤。 | 不要只用 IDE 快捷键判断,先排除应用自身键位配置。 |
| 剪贴板不可用 | 确认客户端已允许剪贴板同步,并分别测试纯文本和小段内容。 | 复制方向、内容类型、客户端版本和是否对所有应用失效。 | 不要用密钥、令牌或签名密码作为测试内容。 |
| 会话中断 | 记录中断前的操作和持续时间,再检查 SSH 是否仍在线以及本地网络是否切换。 | 精确发生时间、前台应用、网络变化、重连结果和相关日志。 | 不要反复重启构建任务,以免覆盖故障发生时的资源状态。 |
从第一个有效错误开始,不从最后一行开始
签名、缓存、磁盘和导出错误经常连锁出现。固定工具链和复现命令后,从日志中最早出现的明确失败原因向下排查。
证书与描述文件
确认 bundle identifier、团队、证书类型和描述文件用途一致。自动签名与手动签名不要在同一目标中混用而不记录变更。
- 记录失败 target 与 configuration
- 核对签名资产有效期和适用范围
- 保留 codesign 的完整错误上下文
Keychain 权限
交互式构建成功、CI 构建失败时,重点检查 runner 会话能否访问所需签名项,以及任务上下文中的权限差异。
- 比较本地终端与 runner 执行用户
- 确认任务运行时钥匙串状态
- 删除日志中的签名密码和敏感值
DerivedData 与依赖缓存
先确认错误是否可稳定复现,再针对单个项目清理。不要把全盘删除缓存当作默认动作,否则难以判断真正失效的缓存层。
- 记录缓存目录和命中策略
- 固定 lockfile 与依赖管理器版本
- 清理前后各保留一次构建日志
磁盘空间
归档、模拟器、依赖和历史产物会同时占用空间。空间不足不仅导致写入失败,也可能表现为依赖解压或签名过程异常。
- 记录系统盘剩余容量
- 按项目核对归档和缓存占用
- 清理前确认需要保留的产物
归档与导出
区分 archive 创建失败与 export 失败。前者看编译和签名,后者重点核对导出选项、目标渠道和归档中的签名信息。
- 注明 archive 是否成功生成
- 保留导出配置与错误摘要
- 确认产物目标和 scheme 一致
最小可复现命令
工单中写清工作目录、Xcode 版本、scheme、configuration 和执行命令。若仅在 CI 中失败,同时提供去除敏感值后的环境差异。
- 保留错误前后至少一段上下文
- 说明图形界面构建是否成功
- 列出已经尝试且无效的步骤
标签决定任务去哪,目录决定失败后留下什么
队列不动先看标签与在线状态;任务启动后失败,再看执行用户、工作目录、并发和清理策略。
四个变量必须一起记录
任务要求的标签必须与 runner 注册标签完全对应,并确认没有被项目级条件或分支条件排除。
目录应由专用执行用户读写,项目之间避免共用会残留状态的临时路径。
根据内存、磁盘和构建类型设置并发。任务过多时,先判断是在排队还是已经争用资源。
明确每次任务结束后保留什么、删除什么,并为失败任务保留足够日志和诊断产物。
检查 runs-on 与 runner 组
确认仓库或组织对 runner 的访问范围、标签拼写、服务状态和工作目录权限。任务停在等待状态时,先看标签是否存在完全匹配的在线 runner。
检查 tags 与项目授权
确认 job tags、runner 锁定范围、项目授权和并发配置。若任务已启动再失败,补充执行器日志与项目脚本输出。
固定执行身份与生命周期
说明 runner 软件、启动方式、执行用户、工作目录和清理脚本。自定义调度器还应记录任务领取、超时和退出码处理方式。
八个词,先统一问题边界
提交咨询时使用同一组术语,可以避免把物理资源、远程协议和自动化软件混在一起描述。
- 物理节点
- 实际交付并运行 macOS 的 Apple Silicon 设备,不是从共享宿主机切出的虚拟实例。
- 独享
- 订单对应的计算、内存和本机存储由该用户使用,不与其他租户共享同一运行实例。
- 非虚拟机
- 系统直接运行在物理设备上。排障时应按真实 macOS 主机、网络和外设链路理解。
- VNC
- 用于访问 macOS 图形界面的远程桌面协议。画面、输入和剪贴板问题通常从客户端与会话层排查。
- SSH
- 用于命令行连接和自动化执行的协议。可辅助判断节点是否在线,以及图形会话故障是否独立存在。
- self-hosted runner
- 由团队部署在云端 Mac 上、接收 CI 平台任务的执行程序,标签和项目权限由团队自行配置。
- 构建缓存
- 为减少重复下载和编译而保留的依赖或中间产物。缓存必须有版本键、容量边界和清理策略。
- 并联
- 针对适用任务咨询多台设备或 Thunderbolt 5 连接方式。它不代表所有构建工具会自动获得线性加速。
让支持人员拿到信息就能开始诊断
工单的价值不在文字长度,而在时间、对象、复现步骤和原始错误是否完整。
订单号与节点
写明出现问题的订单号,以及新加坡、东京、首尔或香港中的实际节点。多台机器需分别标注。
复现时间
提供包含时区的发生时间和持续时长。若问题反复出现,列出最近两到三次的时间点。
错误日志
保留错误前后的上下文、执行命令和退出码。截图可辅助说明,但不要用截图替代可复制的日志文本。
已执行步骤
按顺序列出已经检查、修改和复测的内容,并注明每一步结果,避免支持人员要求重复操作。
期望结果与实际结果
说明原本希望完成什么,以及当前停在哪个阶段。构建问题需注明 scheme、Xcode 版本和运行方式。
删除所有认证材料
从日志、截图和配置片段中删除密码、私钥、访问令牌、签名密码、支付凭据和其他可用于登录或授权的内容。
工单用于订单问题,邮箱用于一般咨询
已下单问题优先在控制台提交工单,便于关联订单与节点。一般方案咨询可发送邮件至 support@macvpsgo.com。
不同问题,进入不同处理队列
选对入口比重复催问更有效。硬件与连接问题需要关联订单,一般使用咨询和企业需求则适合先整理场景。
准备好运行下一次构建了吗?
选择 Go M4 Core、Go M4 Plus 或 Go M4 Pro,在四个在售节点中完成配置。实际可用状态以控制台实时返回为准。