把问题定位到下一步

先查这里,再找我们

交付看订单,连接查端口,构建先留日志。搜索一个关键词,找到能直接执行的检查步骤。

输入关键词查看匹配条目;搜索后按回车,跳到第一条答案。

已有机器的问题,在同一张工单里补充信息,便于连续排查。

先选问题发生在哪一段

四类问题分开处理。先确认机器能连接,再检查工具链与签名,避免把网络问题当成构建失败。

01 / 交接

开机与交付

付款后在哪里看进度、凭据在哪里取、状态与连接信息如何核对。

检查交付流程
02 / 连接

远程连接

SSH 超时、公钥被拒绝、桌面连接失败,按不同错误分别检查。

定位连接错误
03 / 出炉

Xcode 与签名

从 archive 日志到描述文件匹配,先分清编译、归档和导出阶段。

排查构建与签名
04 / 账单

计费与续费

核对天、周、月、季的目录价格,查看续费入口与付款状态。

核对计费规则
先完成机器交接

交付进度,以订单状态为准

付款、订单处理、机器交付是不同环节。支付完成后先查看订单,不要仅凭付款页判断机器已经可以连接。

  1. 01

    确认支付结果

    进入控制台核对订单号、机型、租期和付款状态。链上转账或银行卡付款已提交,不等于订单状态已完成更新。

  2. 02

    查看交付状态

    打开对应订单或实例详情,查看当前处理进度。具体交付时间与实际可用状态以控制台实时返回为准。

  3. 03

    领取连接信息

    交付后在实例详情查看主机地址、用户名、SSH 端口及首次登录信息。按该实例显示的字段连接,不套用其他订单的参数。

已经付款,为什么还没看到连接信息?

先确认你查看的是本次付款对应的订单,再核对控制台中的付款状态。若支付已确认但实例仍在处理,把订单号、付款方式、支付凭证编号和当前状态写进工单,支持人员可据此核查交付环节。

USDT-TRC20 付款请保留交易哈希;银行卡付款请保留付款记录编号。不要发送完整卡号、安全码或控制台密码,也不要为同一笔付款反复创建新订单。

SSH 超时与公钥被拒绝,分别查什么?

连接超时:先检查实例是否已交付并处于可连接状态,再逐字核对主机地址和端口,检查本地网络、代理及访问规则。超时发生在认证之前,重复更换公钥通常解决不了网络路径问题。

Permission denied (publickey):检查用户名、所用私钥以及控制台登记的公钥是否对应。上传的是公钥文件内容;私钥留在本地,不发给支持人员。下面的 HOST、PORT、USER 替换为实例详情中的实际值。

ssh -vv -o IdentitiesOnly=yes \
  -i ~/.ssh/id_ed25519 \
  -p PORT USER@HOST

提交诊断输出前删去主机地址、个人路径等敏感字段;保留错误类型与认证阶段。主机指纹发生变化时,先核对是否刚做过系统重装,不要直接跳过指纹校验。

SSH 可用,但远程桌面打不开,下一步是什么?

先核对实例详情中的桌面连接信息,确认使用的是同一台机器。远程桌面与 SSH 属于不同连接通道,SSH 成功只能说明 SSH 路径可达。

按连接说明核对桌面服务、访问端口和隧道目标;遇到黑屏时记录客户端提示与发生步骤,再尝试降低分辨率或画质,区分显示问题与认证失败。涉及重启时,先停止正在执行的归档或测试任务。

连接配置与迁移顺序见 SSH 与远程连接说明。桌面入口从登录后的实例详情进入。

先找第一条真正的错误

archive 失败,不要先清空一切

先保留失败现场,再检查 Xcode、Scheme、依赖和目标平台。日志最后的失败汇总只是结果,第一条编译或签名错误才是入口。

archive 报错,按什么顺序定位?

先记录当前提交、构建命令与 Xcode 版本,确认 Scheme 存在且用于归档。命令行任务还要检查所选开发工具目录,避免桌面里打开一个版本、CI 实际调用另一个版本。

xcode-select -p
xcodebuild -version
xcodebuild -list -workspace App.xcworkspace

将 App.xcworkspace 和 App 替换为项目实际名称。使用 workspace 的项目不要误传 project;依赖未恢复、共享 Scheme 未提交、部署目标与 SDK 不匹配,都可能在归档前就失败。

set -o pipefail
xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -destination 'generic/platform=iOS' \
  -archivePath "$PWD/output/App.xcarchive" \
  archive 2>&1 | tee archive.log

这一步产出的是 .xcarchive,不是可分发的 IPA。归档成功、导出失败时,转到签名与描述文件检查,不要重新处理所有编译依赖。

什么时候该处理 DerivedData?

切换工具链后出现模块缓存不兼容、生成文件不一致,或同一提交在干净环境可过、旧缓存不可过时,再验证缓存因素。先停止该项目的构建,保存日志,不要把整个用户目录当作清理目标。

更稳妥的验证方法是给本次构建指定一个新的项目专属目录。旧目录保留,便于回看;如果新目录仍失败,应继续追查源码、依赖或配置,而不是重复清缓存。

xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -derivedDataPath "$PWD/.build/DerivedData-check" \
  -destination 'generic/platform=iOS' \
  build

构建恢复后再按项目清理确认不再需要的旧目录。源码、签名文件、归档产物和 DerivedData 分开存放,能减少误删风险。

找不到模拟器运行时或测试目标怎么办?

先确认任务到底是设备归档还是模拟器测试。设备 archive 使用 iOS 设备目标;模拟器测试需要当前 Xcode 支持的运行时与设备。不要用模拟器目标替代分发归档目标。

xcrun simctl list runtimes
xcrun simctl list devices available
xcodebuild -showdestinations \
  -workspace App.xcworkspace -scheme App

缺少运行时时,在 Xcode 设置中安装对应平台组件;支持该命令的 Xcode 版本也可使用下方方式下载 iOS 平台组件。先检查可用磁盘空间,并保证命令行选中的 Xcode 是准备使用的版本。

xcodebuild -downloadPlatform iOS

安装后重新列出 destinations,再把真实可用的目标写入 CI。不要长期沿用另一台机器的模拟器设备标识。

签名资产单独交接

证书、描述文件、API Key,各管一段

.p12 提供证书与私钥,描述文件约束应用与能力,API Key 用于授权相关接口。三者不能互相替代。

导入 .p12 后,为什么 CI 还是找不到签名身份?

通过安全通道把 .p12 送到机器,导入用于构建的钥匙串,并确认文件包含配对的私钥。只有证书、没有私钥,不能完成代码签名。导入密码通过 CI 的秘密变量提供,不写进仓库、命令脚本或工单。

security find-identity -v -p codesigning

在实际运行 runner 的用户环境中执行检查。桌面用户能看到证书,不代表另一个服务用户也能看到。还要核对钥匙串是否已解锁、是否在该用户的搜索列表中,以及签名进程的访问权限。

给构建使用独立钥匙串,任务结束后按流程锁定。若需要协助,只提供经过脱敏的身份检查结果和错误文本,不发送 .p12、私钥或导入密码。

归档成功,导出 IPA 时提示描述文件不匹配?

对齐四项:Bundle ID、Team ID、导出用途和 entitlements。含扩展的应用,每个需要签名的 Target 都要有对应配置;主应用匹配不代表扩展也匹配。

继续核对描述文件是否有效、是否包含正在使用的证书,以及导出选项中的签名方式是否与项目一致。开发测试与发布分发使用的配置不同,不要仅凭相似的文件名选择。

保留导出阶段日志与 ExportOptions.plist 的脱敏副本。提交工单时写明失败发生在 archive 还是 exportArchive,这能直接缩小排查范围。

App Store Connect API Key 应该怎么放?

将 .p8 文件保存在访问受限的目录,由 CI 秘密变量提供 Key ID、Issuer ID 与文件路径。使用满足上传或自动化任务所需的权限,避免把密钥内容直接写进 lane 或提交到仓库。

API Key 可用于支持该认证方式的上传与管理流程,但不能替代本地代码签名所需的证书私钥。上传 TestFlight 失败时,先区分本地产物签名错误与接口认证、应用权限或版本信息错误。

轮换密钥后同步更新 runner 配置,并移除旧引用。需要支持时提供脱敏错误码与执行阶段,不发送 .p8 文件。

Fastlane match 接到新机器,要先确认什么?

确认签名仓库的读取权限、解密口令、分发类型、应用标识与团队配置。日常 CI 优先只读拉取已经准备好的签名资产,避免每次执行都尝试创建或修改证书。

lane :prepare_signing do
  match(
    type: "appstore",
    readonly: true,
    app_identifier: ENV.fetch("APP_IDENTIFIER"),
    team_id: ENV.fetch("TEAM_ID")
  )
end

仓库访问凭据与解密口令分别管理。出现读取失败,先查仓库认证;解密失败,查口令;安装成功但签名失败,再查钥匙串与描述文件。不要把三类故障合并成“match 不工作”。

租期与付款分开核对

四种周期,按目录价格结算

日、周、月、季分别定价,不把日价直接乘成其他周期。两档机型均为独享物理机、非虚拟机;实际订单金额以结账明细为准。

基础机型目录价,单位为美元(USD)
机型与配置天周月季
OSXBuild Bake M4
M4 / 16GB / 256GB
$20.1$54.2$100.3$272.8
OSXBuild Bake M4 Pro
M4 Pro / 64GB / 2TB
$60.3$162.9$301.6$820.4
四种租期怎么比较,附加项怎么算?

按预计占用机器的连续时间选周期,再核对相同周期的机型价和附加项。周期开始、结束的准确时间以订单显示为准,不能把“月”简单理解成某个自然月剩余天数。

附加 SSD 与 Thunderbolt 5 并联各有四周期目录价。先在配置器选好需要的项目,再查看结账明细;不要只看基础机型价格就判断最终账单。完整目录与选型建议见 租用方案与附加选项。

在哪里续费?到期前要做什么?

登录控制台,进入对应订阅或订单,查看到期时间、可用续费操作及账单。完成支付后再次确认新到期时间;不要把支付页面打开或付款提交当作续费已经生效。

是否启用自动续费、是否存在待付账单,以该订单中的设置和状态为准。需要继续使用的机器,提前完成续费并核对结果。需要结束租用的机器,提前导出源码、产物及必要配置。

租期结束后机器进入回收流程,磁盘安全擦除并重装系统。不要将节点当作唯一备份,也不要依赖到期后再取回本地文件。

支持哪些付款方式,支付异常怎么查?

仅支持 USDT-TRC20 与 Visa / Mastercard / Amex(经 Stripe),全部以美元(USD)结算。实际可用网关以后端接口返回为准。

USDT-TRC20 付款时逐项核对结账页面的网络、收款地址与金额,不沿用旧订单的付款信息。银行卡付款按网关提示完成验证,再返回控制台确认状态。

付款异常请提供订单号、所选渠道、脱敏提示及交易编号。信用卡处理由 Stripe 完成,工单与邮件均不需要完整卡号或安全码。

把现场一起带来

提交工单前,核对这四项

能复现的步骤,比一句“打包失败”更有用。涉及正在运行的任务时,先保存现场,再做重启或配置变更。

  • 已在保存现场后尝试重启

    先停止构建和测试,保存日志与未提交文件,再重启机器。记录重启前后现象;若当前任务不宜中断,在工单中注明尚未重启及原因。

  • 已确认 SSH 端口与公钥

    对照当前实例信息核对主机、用户名、端口与密钥配对。提供具体错误文本,不上传私钥,也不发送首次登录密码。

  • 已附上日志末尾 50 行

    附上末尾 50 行及第一条相关错误的上下文,注明命令、Xcode 版本与提交标识。日志较长时通过控制台工单提供附件,并先去除令牌和签名秘密。

  • 已注明节点与订单号

    写清订单号、节点、问题发生时间与时区、预期结果和实际结果。补充最近一次正常运行的情况,避免支持人员反复确认基础信息。

提取日志末尾,不会改动构建产物:

tail -n 50 archive.log

证书私钥、.p12 密码、.p8 文件、访问令牌与控制台密码,都不应出现在支持材料中。

还没解决,把排查结果交给我们

已有订单或机器故障,登录控制台提交工单。售前咨询、无法登录或需要补充联系信息,发送邮件至 support@osxbuild.com。

支持按亚太与美西时区衔接处理。具体回复进度通过工单记录或邮件跟进;提交时写明你的时区与可配合排查的时间段,在原工单中补充新结果。

联系页说明了不同咨询应准备的信息。机器全年 365 天正常运行,工单回复时段与节点运行时间是两回事。