Turborepo

构建 CI

Turborepo 加快了在持续集成管道中所需的构建、代码检查、测试以及任何其他任务的速度。通过并行化和远程缓存,Turborepo 可以显著加快您的 CI 速度。

有关如何将您的 CI 供应商连接到远程缓存并运行任务的示例,请访问我们的CI 指南

启用远程缓存

要为您的 CI 启用远程缓存,请设置环境变量,以便 Turborepo 访问您的远程缓存。

环境变量描述
TURBO_TOKEN访问远程缓存的 Bearer 令牌
TURBO_TEAM与您的存储库关联的帐户名称

当您通过 turbo 运行任务时,您的 CI 将能够命中缓存,从而加快您的管道速度。

远程缓存托管

Vercel 的内置 CI/CD 自动连接到您托管的 Vercel 远程缓存,无需任何配置。要检索将您的其他 CI 供应商连接到 Vercel 远程缓存的令牌,请访问Vercel 远程缓存文档

有关自托管远程缓存选项,请访问Turborepo 的远程缓存文档

在 CI 中运行任务

通过在您的开发和 CI 机器上全局安装 turbo,您可以使用一种心理模型来运行整个存储库,从开发到发布。您在 turbo.json 中注册的任务在 CI 中的工作方式完全相同。

  • 有关如何设置任务的更多信息,请访问配置任务页面。
  • 有关在 CI 中运行任务的示例,请访问我们的CI 指南

筛选入口点

您可以使用--filter 标志筛选您的任务,这与您在本地使用 turbo 时完全相同。CI 支持按包、目录和 Git 历史记录进行筛选。

在 CI 中使用 Git 历史记录

只有当机器上存在历史记录时,才能使用源代码控制更改进行筛选。如果您使用的是浅克隆,则历史记录将不可用。

您还可以使用--affected 标志,仅在已更改的包中运行任务。

Docker

Docker 是许多部署管道的重要组成部分。Turborepo 的 prune 子命令通过从您的镜像中删除不必要的依赖项和代码,帮助您发布轻量级镜像。

有关如何使用 Docker 从 Turborepo 部署的更多信息,请访问专门的 Docker 指南

跳过任务和其他不必要的工作

仅运行受影响的任务

您可以使用 --affected 标志仅运行已更改的任务。

终端
turbo run build --affected

您可能需要在以下情况下使用此标志:

  • 您正在单体仓库中的多个包中运行许多任务,并且只想在代码发生更改的包中运行这些任务。
  • 使用远程缓存,但仍然希望在 CI 中尽可能少地执行工作。
  • 正在使用远程缓存,并且您位于一个大型存储库中。通过最小化将从缓存还原的任务数量,将减少通过网络发送的数据量,从而加快缓存还原速度。
  • 您已经在使用高级筛选技术turbo-ignore来创建与 --affected 相同或相似的行为。您可能会有机会使用这个新标志来简化您的脚本。
    • --affected 将比定制筛选更优雅地处理浅克隆,因为它会退回到运行所有任务。

在 GitHub Actions 中使用 --affected

CI/CD 管道是使用 --affected 的理想场所。通过 --affected,Turborepo 可以通过检查 GitHub 设置的环境变量(如 GITHUB_BASE_REF),自动检测到您正在 GitHub Actions 中运行。

在 PR 的上下文中,这意味着 Turborepo 可以确定 PR 的基础分支和 PR 的头分支之间哪些包发生了更改。这允许您仅运行受 PR 中的更改影响的任务。

虽然 GITHUB_BASE_REFpull_requestpull_request_target 事件中效果良好,但在常规推送事件期间不可用。在这些情况下,我们使用 GITHUB_EVENT_PATH 来确定要将您的提交与之比较的基础分支。在强制推送和推送没有额外提交的分支时,我们会与分支上第一个提交的父级进行比较。

使用 turbo-ignore

随着您的代码库和 CI 的增长,您可能会开始寻找更多方法来进一步加快速度。虽然命中缓存很有用,但您也可能能够完全跳过工作。通过使用 turbo-ignore,您可以跳过冗长的容器准备步骤(如依赖项安装),这些步骤最终会产生缓存命中。

检出存储库

首先克隆您的存储库。请注意,对于比较,必须使用具有您计划使用的克隆深度的历史记录进行克隆。

了解一下

默认情况下,turbo-ignore 使用父提交。要自定义更多深度,请参阅turbo-ignore 参考

为包和任务运行 turbo-ignore

默认情况下,turbo-ignore 将在当前工作目录中使用 build 任务。

  • 要检查对其他任务的更改,请使用 --task 标志。
  • 要检查特定包及其依赖项的更改,请添加包的名称作为参数。

通过添加 web 包作为参数,检查 web 包及其依赖项的 build 任务的更改

终端
npx turbo-ignore web

处理结果

如果在包或其内部依赖项中检测到更改,turbo 将以 1 状态码退出。如果未检测到更改,它将以 0 退出。

使用此状态码,您可以选择 CI 管道的其余部分应该执行的操作。例如,1 退出代码可能意味着您应该继续安装依赖项和运行任务。

有关更高级的用例,请参阅turbo-ignore 参考

最佳实践

依赖缓存

Turborepo 的缓存功能允许您创建具有最小复杂性的快速 CI 管道。通过远程缓存和使用 --filter 标志来定位要构建的包,Turborepo 将处理大型单体仓库的更改检测,而无需太多开销。

例如,您的 CI 可以运行以下两个命令来快速处理质量检查和构建您的目标应用程序

  • turbo run lint check-types test:为您的整个存储库运行质量检查。任何未更改的包都将命中缓存。
  • turbo build --filter=web:使用您在 turbo.json 中注册的 build 任务构建 web 包。如果 web 包或其依赖项未更改,则构建也将命中缓存。

随着您的代码库的扩展,您可能会发现更多优化 CI 的具体机会 - 但依赖缓存是一个很好的起点。

CI 中的全局 turbo

在 CI 工作流程中使用全局 turbo 很方便,允许您轻松运行特定于 CI 的命令并利用自动工作区作用域

但是,在某些情况下,您可能正在运行 turbo 命令或使用 turbo 的脚本,这些命令或脚本会在**使用包管理器安装包之前**执行。一个示例是使用 turbo prune 创建 Docker 镜像。在这种情况下,全局 turbo 将无法使用 package.json 中的版本,因为该版本的二进制文件尚未安装。

因此,我们建议您**将 CI 中全局安装的 turbo 固定到 package.json 中的主版本**,因为主版本中不会引入重大更改。您还可以选择通过固定精确版本来获得更高的稳定性,从而牺牲维护负担以接收补丁版本中的错误修复。

在 CI 中使用 turbo run

turbo run 是您在 Turborepo 中工作时最常用的命令,为了方便起见,它被别名为 turbo。虽然这对于本地工作来说很棒,但 turbo 还有其他子命令,如turbo pruneturbo generate

我们一直在努力改进 turbo,因此我们将来可能会添加更多子命令。因此,您可以通过在 CI 中使用 turbo run 来防止命名冲突。

举例来说,如果你的 CI 管道中有一个 turbo deploy 命令,它可能会与直接内置在 turbo CLI 中的潜在 deploy 子命令冲突。为了避免这种情况,请在你的 CI 管道中使用 turbo run deploy 代替。

故障排除

命中缓存导致构建失败

如果你的任务在未命中缓存时通过,但在命中缓存时失败,则很可能是你没有为你的任务正确配置 outputs

使用错误的环境变量进行部署

如果你没有为你的任务定义 envglobalEnv 键,Turborepo 将无法在创建哈希时使用它们。这意味着你的任务可能会在不同的环境中命中缓存。

检查你的配置中的 envglobalEnv 键。

下一步

你现在拥有使用 Turborepo 发布应用程序所需的一切。要了解有关特定用例的更多信息,请查看指南深入了解核心概念

小时

节省的总计算量
开始使用
远程缓存 →

本页内容