如何配置Turborepo与CircleCI,仅为变更的React应用执行CI/CD?
仅为变更的Turborepo React应用运行CircleCI流水线
默认情况下,修改Project 1代码提交后,CircleCI会触发整个流水线的所有作业——也就是如果没做特殊配置,两个应用的构建/测试任务都会执行。要实现仅针对变更应用运行流水线,需要结合Turborepo的变更过滤能力和CircleCI的配置,具体步骤如下:
1. 配置Turborepo的任务流水线
在项目根目录的turbo.json里定义好各个应用的任务(比如构建、测试),明确依赖关系和输出目录,让Turborepo能准确计算变更哈希:
{ "$schema": "https://turbo.build/schema.json", "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**", "build/**"] }, "test": { "dependsOn": [], "outputs": [] } } }
^build表示运行当前项目的build任务前,先执行其所有依赖项目的build任务outputs指定任务生成的产物目录,用于Turborepo的缓存和变更检测逻辑
2. 编写CircleCI配置文件
在.circleci/config.yml中,通过Turborepo的--filter参数实现仅运行变更项目的任务,具体配置如下:
第一步:统一安装依赖
先定义一个复用的依赖安装作业,避免重复安装浪费资源:
version: 2.1 jobs: install-deps: docker: - image: cimg/node:20 steps: - checkout - restore_cache: keys: - npm-v1-{{ checksum "package-lock.json" }} - npm-v1- - run: npm install - save_cache: key: npm-v1-{{ checksum "package-lock.json" }} paths: - node_modules - persist_to_workspace: root: . paths: - node_modules - apps - packages
第二步:定义通用Turborepo任务作业
创建一个可复用的作业,接收任务名称参数,并用Turborepo的变更过滤语法运行任务:
run-turbo-task: docker: - image: cimg/node:20 parameters: task: type: string steps: - checkout - attach_workspace: at: . # 核心逻辑:过滤出相对于上一次提交有变更的项目 - run: npx turbo run << parameters.task >> --filter=[...HEAD^1]
这里的--filter=[...HEAD^1]是关键:
[...]是Turborepo的变更范围语法,会匹配所有在当前提交中变更的项目HEAD^1表示对比上一次提交的变更内容- 如果两个应用没有互相依赖,修改Project 1只会触发Project 1的对应任务;如果有依赖,依赖该项目的任务也会被触发(符合monorepo的依赖逻辑)
第三步:串联工作流
将作业按顺序串联,确保先安装依赖再运行任务:
workflows: build-test-workflow: jobs: - install-deps - run-turbo-task: name: run-build task: build requires: - install-deps - run-turbo-task: name: run-test task: test requires: - install-deps
3. 验证效果
修改Project 1的代码并提交到GitHub后,CircleCI启动流水线时:
- Turborepo会自动检测到只有Project 1有变更
- 仅运行Project 1的
build和test任务,Project 2的任务不会执行
如果需要更精确的过滤(比如只针对apps目录下的项目),可以把过滤参数改成--filter=./apps/*[...]HEAD^1。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

