保留一份机器可读清单
记录 macOS 版本、芯片架构、Xcode 版本、Homebrew 软件清单、Git 版本和语言运行时。每次升级只改变一个主要组件,并在升级前后各保存一次清单。
先判断故障属于连接、开发环境、CI/CD、存储、网络还是账户管理,再按固定顺序验证状态、参数与日志。Oakmini 提供的是独享 Mac mini 物理节点,非虚拟机;排查时应把本地连接条件、节点状态与项目工具链分开验证。
$ uname -m
arm64
$ sw_vers -productVersion
macOS ready
$ ssh -v oak-node
debug1: Authentication succeeded
$ df -h /
Filesystem status: available
不要同时改动网络、凭据和工具版本。先选择最接近的症状,每次只验证一个变量,并记录发生时间、执行动作和结果。这样能避免一次修改掩盖另一个问题。
适用于 SSH 超时、VNC 黑屏、凭据被拒绝或连接后立即断开的情况。
从主机状态开始检查适用于 Xcode 路径、Homebrew 包、Git 配置、Fastlane 或语言运行时版本不一致。
核对路径与版本清单适用于 runner 离线、标签不匹配、任务排队、缓存异常或构建输出不完整。
从 runner 注册状态开始适用于磁盘空间不足、缓存持续增长、工作目录混乱或构建产物无法导出。
核对容量、目录与占用适用于交互延迟升高、偶发丢包、文件传输慢或仅特定本地网络无法访问。
对比不同链路与时间段适用于订单识别、主机管理权限、续用状态或控制台操作结果未更新。
先核对订单与操作记录使用 df -h 查看卷容量,再用 du -sh 检查项目、构建缓存和导出目录。删除前确认产物已经备份,不要直接清空未知系统目录。
分别记录 SSH 建连、VNC 操作、代码拉取和本地构建耗时。若只有图形界面迟缓,应先调整 VNC 画质;若命令行与传输同时异常,再检查本地链路和节点可达性。
确认当前登录账户、订单标识、所选区域与最近一次操作时间。主机状态、订单和管理动作统一在控制台完成,支持请求中只提供订单标识,不发送登录凭据。
连接失败通常发生在主机状态、本地网络、连接参数、防火墙或凭据中的一层。按顺序验证,前一层未通过时不要继续改后一层。
确认订单对应的云端 Mac 处于可连接状态,核对节点区域和连接信息是否属于同一台物理节点。如果刚完成管理操作,记录操作时间与当前状态,不要反复提交相同动作。
通过条件:主机状态正常,订单标识、节点区域与连接目标一致。先确认本地网络可以访问目标地址与端口,再对比另一条可信网络。仅在办公网络失败时,应检查出口策略;所有网络都失败时,保留测试时间、目标端口与错误类型。
nc -vz HOST PORT
ssh -vvv USER@HOST
通过条件:端口可达,连接不会在握手前超时。
确认主机地址、端口、用户名和连接方式来自当前订单。SSH 配置别名可能覆盖端口或密钥路径,可用详细日志查看最终采用的参数;VNC 则应核对目标地址、显示设置和客户端保存的旧记录。
ssh -G oak-node
ssh -v USER@HOST -p PORT
通过条件:客户端实际参数与控制台提供的信息完全一致。
临时测试前先记录原有规则。检查终端、SSH 客户端或 VNC 客户端是否允许发起连接,以及企业网络是否限制目标端口。不要为了排查长期关闭整套本地防护。
通过条件:目标程序和端口拥有明确的出站权限,替代网络测试结果一致。区分“网络超时”和“认证被拒绝”。前者不应通过更换密码解决;后者需要确认用户名、密钥文件、文件权限和最近是否更改过凭据。支持请求只能附认证错误文字,不得附密码或私钥内容。
chmod 600 ~/.ssh/id_ed25519
ssh-add -l
通过条件:握手完成,认证成功,连接进入 macOS 命令行或图形界面。
“已安装”不等于“流水线正在使用”。工具链排查需要同时记录可执行文件路径、版本、当前 shell 环境和项目实际调用结果。
| 工具 | 先核对 | 建议命令 | 常见偏差 |
|---|---|---|---|
| Xcode | 当前开发者目录、版本、SDK 列表 | xcode-select -pxcodebuild -version |
命令行指向另一套 Xcode,项目要求的 SDK 不在当前版本中 |
| Homebrew | 二进制路径、软件清单、诊断结果 | brew --prefixbrew doctor |
shell 未加载正确路径,迁移后包清单与本地环境不一致 |
| Git | 版本、远端地址、仓库权限与用户配置 | git --versiongit remote -v |
runner 与交互式 shell 使用不同凭据或不同工作目录 |
| Fastlane | 调用来源、依赖锁定、lane 与环境变量名称 | bundle exec fastlane --version |
直接调用全局版本,未按项目依赖文件执行 |
| 语言运行时 | 解释器路径、版本管理器和项目锁定版本 | which rubywhich node |
交互式 shell 与非交互任务加载不同初始化文件 |
记录 macOS 版本、芯片架构、Xcode 版本、Homebrew 软件清单、Git 版本和语言运行时。每次升级只改变一个主要组件,并在升级前后各保存一次清单。
在本地终端可运行但 runner 失败时,把 echo "$PATH"、which 与版本命令写入临时诊断步骤。确认后删除不必要的环境输出,避免日志带出敏感变量。
先运行依赖解析,再执行一次干净构建,最后确认产物路径和退出码。若最小项目成功而业务项目失败,应回到项目配置、依赖锁定和脚本权限继续定位。
以下输出足以建立基础版本记录。提交支持请求前删除目录中的项目名称和任何敏感参数。
uname -m
sw_vers
xcode-select -p
xcodebuild -version
brew --prefix
git --version
which ruby
which node
df -h /
CI/CD 问题应按“是否接单、是否进入工作目录、是否获得权限、是否命中依赖、是否完成构建”逐层判断。不要只依据最终失败提示下结论。
确认 runner 服务正在运行,注册关系仍有效,并且控制台显示在线。重启前记录最后在线时间和最近一次成功任务。
任务长时间排队但 runner 在线时,比较任务要求的标签与 runner 实际标签。标签包含大小写、空格或架构差异时,任务可能不会被领取。
确认 runner 用户对仓库目录、缓存目录和产物目录拥有所需权限。不要用扩大所有目录权限的方式掩盖单个路径配置错误。
缓存失效时先做一次不读取旧缓存的对照任务。并发任务互相覆盖文件时,为每个任务分配独立工作目录,并检查 Oak Core 或 Oak Forge 的内存与存储是否符合任务规模。
保留任务开始时间、runner 名称、提交标识、关键工具版本、失败步骤、退出码和末段日志。若失败可重复,记录最短复现步骤;若偶发,至少保留一次成功与一次失败的对照。
优先检查 runner 在线状态、项目授权和标签。此时先不要清理缓存,因为任务尚未进入构建阶段。
优先检查工作目录、脚本权限、shell 初始化和工具路径。对比交互式终端与 runner 环境变量。
核对锁文件、缓存键、磁盘余量与网络下载日志。使用一次干净缓存任务建立对照,不要连续覆盖原始证据。
检查内存占用、共享目录写入冲突、端口占用和临时文件命名。先降低并发验证,再决定调整任务拆分或配置。
使用一致术语可以减少来回确认。描述问题时,尽量指出具体对象,例如“东京节点的 SSH 连接超时”,而不是只写“服务器不可用”。
Oakmini 的联系渠道只有两种:登录控制台提交工单,或发送邮件至 support@oakmini.com。涉及现有订单、主机状态和持续排查记录时优先使用工单;售前或无法进入控制台时可使用邮件。
逐项填写,未知项目写“未确认”,不要猜测。若问题涉及多次尝试,请按时间顺序列出。
主题:订单标识 / 问题类别 / 节点区域
发生时间与时区:
连接方式或任务类型:
预期结果:
实际结果:
复现步骤:
1.
2.
3.
已完成的排查:
错误原文与退出码:
脱敏日志附件说明: