ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Turborepo CI/CD 实战指南:在 Langfuse 中用 `turbo run`、远程缓存与 `--affected` 构建高效的 monorepo 流水线

Turborepo CI/CD 实战指南:在 Langfuse 中用 `turbo run`、远程缓存与 `--affected` 构建高效的 monorepo 流水线 Turborepo CI/CD 实战指南在 Langfuse 中用turbo run、远程缓存与--affected构建高效的 monorepo 流水线【免费下载链接】langfuse Open source AI engineering platform: LLM evals, observability, metrics, prompt management, playground, datasets. Integrates with OpenTelemetry, LangChain, OpenAI SDK, LiteLLM, and more. YC W23项目地址: https://gitcode.com/GitHub_Trending/la/langfuse本指南以 Langfuse 仓库内的 Turborepo CI 规则文档.agents/skills/turborepo/references/ci/RULE.md为核心系统讲解在持续集成环境中运行 Turborepo 的三大铁律一律使用turbo run显式调用任务、启用远程缓存共享产物、用--affected只跑受影响的包并结合 turbo.json、package.json 等仓库实际配置给出可直接落地的 GitHub Actions 工作流示例与排错方法。读完你将能够为任何 Turborepo monorepo包括 Langfuse 这类 web / worker / 多 packages 结构搭建稳定、快速、可复现的 CI/CD 流水线。一、核心原则为什么 CI 里必须写turbo run规则文档的第一条原则非常明确在 CI 与脚本中永远不要使用turbo tasks简写形式一律使用turbo run# 正确 —— 在 CI、package.json、脚本中永远这样写 turbo run build test lint # 错误 —— 简写形式只用于人类或 Agent 在终端的一次性输入 turbo build test lint简写turbo tasks只服务于在终端直接敲命令的场景。任何被写入代码的命令CI 配置、package.json scripts都必须使用turbo run。原因在于turbo run是显式、稳定的命令形态任务名不会被误解为全局选项或子命令语义对所有执行环境一致。Langfuse 仓库本身就是这一原则的践行者。在根目录 package.json 中所有脚本都使用turbo runbuild: turbo run build, build:check: turbo run build:check, typecheck: turbo run typecheck, dev: turbo run dev, lint: turbo run lint, test: turbo run test, db:generate: turbo run db:generate, db:migrate: turbo run db:migrate其中db:migrate、db:seed等数据库任务同样通过turbo run分发到各包说明即使是非构建类任务统一走turbo run也能获得依赖图调度与缓存策略的收益这些任务的cache: false配置见下文。二、启用远程缓存让每次 CI 都站在前一次的肩膀上远程缓存Remote Caching通过在多次运行之间共享缓存产物能大幅加速 CI。规则文档给出了 CI 环境必需的两个环境变量TURBO_TOKENyour_vercel_token TURBO_TEAMyour_team_slugTURBO_TOKENVercel 访问令牌在 Vercel Dashboard → Settings → Tokens 创建TURBO_TEAM你的 Vercel 团队 slug。在 GitHub Actions 中令牌应以 Secrets 存储团队名以 Variables 存储并在 job 级别注入jobs: build: runs-on: ubuntu-latest env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ vars.TURBO_TEAM }}补充阅读仓库内的 remote-cache.md 可知远程缓存能让团队成员之间、本地开发与 CI 之间互相命中缓存first build 之后 CI 大幅提速。本地开发场景可先用npx turbo login与npx turbo link完成认证与关联生成.turbo/config.json默认被 gitignore。环境变量速查表变量作用TURBO_TOKEN远程缓存的 Vercel 访问令牌TURBO_TEAM你的 Vercel 团队 slugTURBO_REMOTE_ONLY跳过本地缓存只用远程缓存TURBO_LOG_ORDER设为grouped可让 CI 日志更整洁结合 Langfuse 的 turbo.json 看缓存设计Langfuse 根目录的 turbo.json 是缓存策略的典型参考实现值得逐项理解{ $schema: https://turbo.build/schema.json, noUpdateNotifier: true, globalDependencies: [.env], globalEnv: [ NEXT_PUBLIC_LANGFUSE_BLOB_EXPORT_CUTOFF, NEXT_PUBLIC_LANGFUSE_BLOB_EXPORTER_CUTOFF, NEXT_PUBLIC_LANGFUSE_ANALYTICS_EXPORTER_CUTOFF, CLICKHOUSE_BIN ], envMode: loose, tasks: { build: { dependsOn: [db:generate, ^build], env: [NEXT_IGNORE_BUILD_ERRORS], outputs: [dist/**, .next/**, !.next/cache/**], cache: true, outputLogs: errors-only } } }globalDependencies: [.env]根目录.env文件内容变化会使仓库内所有任务缓存失效——这正是规则文档所说的全局哈希输入。globalEnv列出会参与全局哈希的环境变量。Langfuse 把CLICKHOUSE_BIN、几个NEXT_PUBLIC_*开关纳入避免这些变量变化时复用陈旧缓存。envMode: loose宽松模式把所有环境变量计入任务哈希对应 CLI 的--env-modeloose与默认的 strict 模式相比更安全但缓存命中率更低。build任务dependsOn声明了db:generate与上游^build的依赖顺序outputs声明可缓存的产物并显式排除.next/cache/**Next.js 内部缓存不应进入 Turbo 缓存cache: true显式开启缓存。数据库类任务db:migrate、db:deploy、db:reset、db:push、db:seed等全部cache: false迁移与播种有副作用绝不能重放缓存这正是什么样的任务不该缓存的最佳示例。db:generate同样cache: falseturbo.json 中注释说明了原因Prisma generate 把客户端类型写入node_modulesTurbo 缓存命中只会重放日志而不会在全新 CI runner 上恢复这些副作用因此必须每次真实执行。三、PR 构建使用--affected只跑变更涉及的包规则文档的第三条核心原则PR 构建只对相对基准分支发生变更的包执行任务turbo run build test --affected--affected依赖 Git 历史来计算变更范围其工作机制详见 commands.md默认对比main...HEAD在 GitHub Actions 中会自动检测GITHUB_BASE_REF可用TURBO_SCM_BASE/TURBO_SCM_HEAD覆盖基准与头部分支。浅克隆为什么会让--affected失效Turborepo 需要把当前 HEAD 与main的 merge base 做比较。如果该提交没有被 fetch--affected会退化为全量执行。因此 GitHub Actions 中必须显式设置 fetch 深度- uses: actions/checkoutv4 with: fetch-depth: 2 # --affected 所需的最小深度 # 如果 merge base 较远改用 0 拉取全量历史对于提交很多的 PR规则文档建议直接fetch-depth: 0 # 全量历史PR 与主分支差异化构建在 patterns.md 中推荐的成熟模式是PR 只跑受影响任务主分支合并时做全量校验- name: Test (PR) if: github.event_name pull_request run: turbo run build test --affected - name: Test (Main) if: github.ref refs/heads/main run: turbo run build test更细粒度的变更范围--filter与 Git ranges如果默认的main...HEAD不满足需求--filter支持自定义 Git range参考 patterns.md# 自某个提交以来的变更 turbo run test --filter...[abc123] # 两个 ref 之间的变更 turbo run test --filter...[main...HEAD] # 最近 3 个提交内的变更 turbo run test --filter...[HEAD~3]四、GitHub Actions 完整落地从零到可运行以下工作流整合了规则文档与 github-actions.md 的完整示例。Langfuse 使用 pnpm 作为包管理器根 package.json 声明packageManager: pnpm12.3.1并有preinstall: npx only-allow pnpm强制约束pnpm-workspace.yaml 定义了 web、worker、packages/**、ee 四个 workspace 范围因此这里以 pnpm 版本为例name: CI on: push: branches: [main] pull_request: branches: [main] jobs: build: runs-on: ubuntu-latest env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ vars.TURBO_TEAM }} steps: - uses: actions/checkoutv4 with: fetch-depth: 2 # PR 较多时改用 0 - uses: pnpm/setup703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0 with: install: false cache: false - uses: actions/setup-nodev4 with: node-version: 20 cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Build run: turbo run build --affected - name: Test run: turbo run test --affected - name: Lint run: turbo run lint --affected其他包管理器配置速查Yarn- uses: actions/setup-nodev4 with: node-version: 20 cache: yarn - run: yarn install --frozen-lockfileBun- uses: oven-sh/setup-bunv1 with: bun-version: latest - run: bun install --frozen-lockfile无法使用远程缓存时的兜底方案actions/cache如果团队无法接入远程缓存可以用actions/cache缓存 Turborepo 的本地缓存目录.turbo- uses: actions/cachev4 with: path: .turbo key: turbo-${{ runner.os }}-${{ hashFiles(**/turbo.json, **/package-lock.json) }} restore-keys: | turbo-${{ runner.os }}-注意规则文档与 patterns.md 均强调该方案按分支隔离、效果远不如远程缓存。多 job 并行时还需为每个 job 使用唯一 key 避免冲突例如key: turbo-${{ runner.os }}-${{ github.job }}-${{ github.sha }}五、进阶优化模式任务拆分并行在 patterns.md 中将 lint / test / build 拆分为独立 job 可显著缩短总耗时jobs: lint: runs-on: ubuntu-latest steps: - run: turbo run lint --affected test: runs-on: ubuntu-latest steps: - run: turbo run test --affected build: runs-on: ubuntu-latest needs: [lint, test] steps: - run: turbo run build并行时注意每个 job 各自写缓存远程缓存会自动处理使用 actions/cache 时务必用github.job区分 key见上文。按条件跳过昂贵任务草稿 PR 跳过 E2E或打上特定 label 才跑全量测试- name: E2E Tests if: github.event.pull_request.draft false run: turbo run test:e2e --affected - name: Full Test Suite if: contains(github.event.pull_request.labels.*.name, full-test) run: turbo run testNode 版本矩阵测试strategy: matrix: node: [18, 20, 22] steps: - uses: actions/setup-nodev4 with: node-version: ${{ matrix.node }} - run: turbo run test六、Vercel 部署与 turbo-ignore当部署目标为 Vercel 时详见 vercel.md远程缓存自动启用无需配置TURBO_TOKEN与TURBO_TEAM预览与生产构建共享缓存。turbo-ignore用于在包未变更时跳过不必要的构建。在 Vercel 项目 Settings → Git → Ignored Build Step 中选择 Custom 并填入npx turbo-ignore其工作方式是比较当前提交与上一次成功部署的提交借助 Turborepo 的依赖图判断当前包及其依赖是否变更——无变更返回退出码 0跳过构建有变更返回 1执行构建。常用选项# 检查指定包 npx turbo-ignore web # 指定对比 ref npx turbo-ignore --fallbackHEAD~1 # 详细输出 npx turbo-ignore --verbose七、CI 排错与调优工具在 CI 中定位缓存与任务执行问题时以下 CLI 工具参考 commands.md非常有效# 只读远程缓存不写入 turbo build --remote-cache-read-only # 完全跳过缓存 turbo build --no-cache # 预览将要执行的任务不真正运行--dryjson 输出机器可读结果 turbo run build --dry turbo run build --dryjson # 忽略所有缓存强制重跑 turbo run build --force # 限制并发数绝对值或 CPU 百分比 turbo run build --concurrency4 turbo run build --concurrency50% # 任务失败时继续执行其余任务 turbo run build test --continue # 输出任务依赖图支持 svg/png/json/mermaid turbo run build --graph # 生成 JSON 运行摘要 turbo run build --summarize # 控制日志输出量full / new-only / errors-only / none turbo run build --output-logserrors-only # 控制 turbo 自身日志级别 turbo run build -vv其中--output-logserrors-only与 Langfuse 在 turbo.json 中大量任务上配置的outputLogs: errors-only一一对应——CI 日志只保留失败信息命中缓存的任务不再刷屏这正是规则文档建议TURBO_LOG_ORDERgrouped追求更整洁 CI 日志的落地实践。八、总结Turborepo CI 四条黄金准则结合规则文档与 Langfuse 仓库的实际配置可归纳出在 CI 中运行 Turborepo 的四条黄金准则显式优于隐式任何写进代码的 turbo 命令一律使用turbo run简写只留给终端缓存共享优于本地重建配置TURBO_TOKEN/TURBO_TEAM启用远程缓存无法使用时用 actions/cache 缓存.turbo作为降级方案精确优于全量PR 构建使用--affected配合fetch-depth: 2或0主分支合并做全量校验--filter Git ranges 提供更细粒度的控制按需执行优于一刀切副作用型任务如 Langfuse 的db:*系列显式cache: false昂贵任务按 PR 状态或 label 条件化执行。Langfuse 的 turbo.json 本身就是上述原则的生产级范本——从globalDependencies、globalEnv的全局哈希设计到build/lint/test/typecheck的依赖排序与产物声明再到数据库任务的缓存豁免都可以直接借鉴到自己的 monorepo CI 流水线中。延伸阅读仓库内文档github-actions.mdGitHub Actions 完整配置、vercel.mdVercel 部署、patterns.mdCI 优化模式、remote-cache.md远程缓存细节、commands.mdturbo run全部 Flags 参考。【免费下载链接】langfuse Open source AI engineering platform: LLM evals, observability, metrics, prompt management, playground, datasets. Integrates with OpenTelemetry, LangChain, OpenAI SDK, LiteLLM, and more. YC W23项目地址: https://gitcode.com/GitHub_Trending/la/langfuse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表