如何在Github Actions中通过NX仅运行受影响的单元测试?
解决Github PR中NX affected未仅运行变更代码单元测试的问题
我在Github托管的NX工作区(包含多个Angular库和应用)中配置了PR触发的Workflow,原本每次执行所有单元测试耗时约6分钟。尝试用nx affected --target=test仅运行变更代码对应的测试,但两种配置都没生效:
--base=remotes/origin/${{ github.event.pull_request.base.ref }} --head=HEAD:运行成功,但仍执行所有测试--base=${{ github.event.pull_request.base.sha }} --head=${{ github.event.pull_request.head.sha }}:SHA值正确获取,但依旧跑全量测试,耗时仍达7分钟
以下是排查和解决步骤:
1. 确保完整拉取仓库历史
Github Actions默认的actions/checkout只会拉取最新commit(fetch-depth:1),这会导致NX无法正确计算分支间的文件差异。需要修改checkout步骤:
- name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取完整仓库历史 ref: ${{ github.event.pull_request.head.sha }}
2. 验证affected计算结果
在Workflow中添加调试步骤,查看NX识别的受影响项目,确认是否符合预期:
- name: Print affected projects run: npx nx print-affected --target=test --base=${{ github.event.pull_request.base.sha }} --head=${{ github.event.pull_request.head.sha }}
如果输出显示所有项目都在受影响列表里,说明NX的依赖分析逻辑认为所有项目都被变更影响,需要进一步排查。
3. 排查NX依赖配置问题
若print-affected显示全量项目受影响,可能是以下原因:
- 根目录核心配置文件变更(如
nx.json、package.json、tsconfig.base.json),这类文件会影响所有项目 - 某个被所有项目依赖的基础库发生变更
- 项目的
project.json中依赖配置错误,导致依赖链被错误关联
可以临时修改PR中的变更内容(比如只改一个独立库的文件),重新运行Workflow,查看print-affected结果是否正常。
4. 正确设置base和head参数
推荐使用PR的base SHA和head SHA,若使用分支名作为base,需确保本地已拉取该分支的最新代码:
- name: Fetch base branch run: git fetch origin ${{ github.event.pull_request.base.ref }}:refs/remotes/origin/${{ github.event.pull_request.base.ref }} - name: Run affected tests run: npx nx affected --target=test --base=${{ github.event.pull_request.base.sha }} --head=${{ github.event.pull_request.head.sha }} --parallel
5. 检查缓存配置
如果看到[remote cache]但测试仍在执行,可临时禁用缓存验证问题:
- name: Run affected tests without cache run: npx nx affected --target=test --base=${{ github.event.pull_request.base.sha }} --head=${{ github.event.pull_request.head.sha }} --no-cache
若此时仅运行变更项目的测试,说明缓存配置需要调整;如果还是跑全量,问题仍出在affected的计算逻辑上。
内容的提问来源于stack exchange,提问作者Pieterjan
相关产品推荐
相关产品推荐

