Orbit

Kapsule Migrator 构建失败问题排查

When an Orbit build fails, the deployment detail page gives you the full log plus a categorised failure summary and a suggested fix. This guide walks through reading that page, the failures Orbit…

排查失败的构建

当 Orbit 构建失败时,部署详情页面会为您提供完整日志、分类的失败摘要和建议的修复方案。本指南将帮助您理解该页面的内容、Orbit 能够识别的失败类型、无法识别的失败类型,以及构建成功但网站仍然出错时该做什么。

阅读失败信息

  1. 在 Orbit 中打开您的项目。
  2. 打开部署选项卡。
  3. 点击状态为失败的部署。
  4. 先阅读日志上方的失败摘要,然后再阅读日志本身。

显示分类失败摘要的失败部署

Orbit 为每个失败分配一个类别:内存不足编译错误测试失败Lint 错误安装错误网络错误超时未知错误。该类别会告诉您在阅读任何日志行之前应该查看管道的哪个部分。

还有一个获取 AI 诊断按钮。它会读取日志的最后 120 行以及检测到的框架和失败类别,然后返回一个用通俗语言解释的说明。

诊断标记为由 AI 生成,使用前请验证。将其视为指向日志中正确行的很好指针,而不是您代码库的权威。在更改任何内容之前,请先阅读它所指的行。

如果构建从未启动且卡在已排队状态,请跳到下面的已排队构建部分。

Orbit 按名称识别的失败

这些会在部署页面上提供具体的建议修复方案。

Orbit 检测到的内容含义修复
缺少模块导入指向未安装的软件包将软件包添加到 package.json 并提交,或修复导入路径中的拼写错误
ERESOLVE 冲突npm 无法满足对等依赖关系package.json 中解决冲突,或将 --legacy-peer-deps 添加到设置中的安装命令
TypeScript 错误构建期间类型检查失败修复列出的错误。对于第三方类型问题,在 tsconfig.jsonskipLibCheck: true
内存不足构建超过了构建机器的 RAM添加 NODE_OPTIONS=--max-old-space-size=2048 作为环境变量,或迁移到具有更大构建机器的计划
构建磁盘已满构建填满了其磁盘查找意外大的 node_modules 或工件,或迁移到具有更大构建磁盘的计划
构建超时构建达到 30 分钟中止启用构建缓存、减少包大小或找到正在挂起的内容
未找到软件包 (404)依赖项不存在于该名称或版本检查 package.json 是否有拼写错误,或确认软件包已发布
ESLint 错误Lint 错误导致构建失败修复它们,或在框架配置中停止 lint 导致构建失败
语法错误无法解析的源代码缺少括号、未闭合的字符串或 Node 版本不支持的语法
文件未找到存储库中不存在引用的文件确认它已提交,并检查路径的大小写
锁定文件已过期锁定文件与 package.json 不匹配在本地运行您的软件包管理器的安装并提交更新的锁定文件

锁定文件不匹配是最常见的首次部署失败,也是最令人困惑的,因为它从不在本地发生。npm ciyarn install --frozen-lockfilepnpm install --frozen-lockfile 在锁定文件与 package.json 不一致时都拒绝继续。在本地重新生成锁定文件并提交它。

按阶段分类的常见失败

依赖项安装失败

安装阶段出错。

  • 错误的软件包管理器。 Orbit 从您的锁定文件中选择 npm、yarn 或 pnpm。如果提交了多个锁定文件,选择可能不是您期望的那个。删除您不使用的文件,或在设置中明确设置安装命令
  • 私有注册表。 如果依赖项来自私有注册表,身份验证令牌必须在构建时作为环境变量可用,并且您的 .npmrc 必须引用它。
  • Node.js 版本不匹配。 某些软件包需要最低 Node 版本。在设置中将 Node.js 版本设置为主版本号:182022
  • 大型 monorepo 上内存不足。 使用 npm ci 而不是 npm install,并考虑迁移到具有更大构建机器的计划。

构建命令失败

构建阶段出错。

  • TypeScript 或 lint 错误。 Orbit 完全按照写入的方式运行您的构建命令。如果您的构建在本地失败,它也会在这里失败。
  • 缺少构建时环境变量。 在构建期间读取的变量必须在构建运行之前存在,而不仅仅是在运行时。在环境变量选项卡上添加它并重新部署。部署后添加的构建时变量不会溯及既往地应用于它。
  • monorepo 中根目录错误。设置中将根目录设置为应用程序的路径,例如 apps/web

构建超时

每个计划上的构建在 30 分钟的实际运行时间后都会被中止。如果您的构建一致性地接近该时间:

  • 检查日志中是否有进程等待输入。提示用户输入的构建是挂起的构建。
  • 避免在大型依赖树上使用 --legacy-peer-deps,除非您需要它。
  • 确保正在使用构建缓存。Liftoff 和 Apex 计划包含它;部署页面显示缓存命中冷构建
  • 迁移到具有更多构建 vCPU 的计划。请参阅 Orbit 计划限制

构建从未启动

卡在已排队的部署正在等待构建槽位。详情页面显示您的队列位置以及有多少并发构建槽位正在使用中,并在一个槽位空闲时自动启动构建。Launch 和 Liftoff 允许一个并发构建;Apex 允许三个。

您可以在 Orbit 然后队列中查看整个帐户中的所有正在进行的内容。

如果部署在没有任何其他内容运行的情况下卡在已排队状态,则更可能是被保留而不是排队。检查:

  • 等待批准,如果要求对生产进行批准已打开
  • 项目上的部署锁定
  • 部署冻结计划阻止当前时间或日期
  • CI 必需检查等待您的管道
  • 生产前需要暂存成功等待同一提交的暂存部署

构建被完全跳过

如果推送没有产生任何部署,则可能是有意被过滤的:

  • 忽略的路径:推送中的每个文件都匹配一个模式,如 *.mddocs/**
  • 分支忽略模式:分支匹配的内容如 dependabot/*
  • 根目录:推送没有涉及该项目的 monorepo 子目录
  • 分支预览关闭,推送不是针对生产或暂存

构建成功但网站出错

绿色构建和损坏的网站几乎总是配置问题而不是代码问题。

每个页面都显示 404。 输出目录错误:Orbit 发布了不是您构建输出的文件夹。检查您的构建实际写入的内容。常见值包括 dist.nextoutbuild.output

仅动态路由上显示 404。 应用程序需要运行的服务器,但被用作静态文件提供。在设置中的运行时下打开服务器模式。这是 Next.js with SSR、Remix、Nuxt 和任何其他非静态导出的应用程序所必需的。

部署后资产 404,对于已在网站上的用户。 他们加载了旧页面,并请求不再存在的旧捆绑包 URL。在设置中打开倾斜保护,这样可以在新部署上线后的保留窗口内保留前一个构建的工件。

环境变量在运行时未定义。 确认变量的作用域确实涵盖此环境,并且部署日期在更改后。部署详情页面列出了在构建时注入的确切键,并将它们与当前配置进行对比。

特定框架的构建设置位于配置您的构建命令和输出目录中。

重试

在失败的部署页面上:

  • 重试构建重新运行相同的提交。
  • 更多重试选项,然后清除缓存并重试,首先删除构建缓存。

您也可以让 Orbit 为您重试。设置中的构建自动重试会重新排队因基础设施错误(如网络故障或超时)导致的失败构建,最多三次。它故意不重试代码错误,因此编译、lint 或测试失败永远不会循环。

使用清除缓存重试会删除环境的缓存 node_modules 且无法撤销。它之后的下一个构建会很慢。这是目的,但不要在大型 monorepo 上下意识地这样做。

停止坏的构建到达用户

如果部署已经上线并破坏了某些内容,请回滚而不是在压力下尝试向前修复。回滚会提升已构建的工件,只需几秒钟。请参阅回滚部署

要在您调查时停止进一步的部署,请在项目上点击锁定部署。推送触发的部署将被跳过,直到您解锁,而手动部署仍然可以工作,以便您可以提交修复。

您也可以让 Orbit 自动执行此操作:失败时自动回滚会在生产部署失败时恢复最后一个健康部署,健康检查路径在新部署在 15 秒内没有使用 2xx 应答时恢复它。

仍然卡住

如果日志简单地以没有错误消息的方式结束,构建进程很可能被杀死:内存不足或构建机器被回收。重试一次。如果它以相同的方式失败两次,请从 KPanel 打开工单或发送电子邮件至 support@kapsulehost.com 并包含详情页面上显示的部署 ID。

相关阅读

仍需帮助?

请发送邮件至 support@kapsulehost.com 或在 KPanel 中打开聊天。

打开 KPanel
Kapsule Migrator 构建失败问题排查