如何加快Github Actions中npm run test-compiled的执行速度?
缩短GitHub Actions测试工作流耗时的可行方案
1. 修复并行作业依赖问题,实现多服务并行测试
你之前并行作业失败,大概率是没在每个作业里正确配置Node环境和缓存依赖。可以这么调整:
- 每个并行作业开头用
actions/setup-node指定Node版本,同时启用依赖缓存:jobs: test-service: runs-on: ubuntu-latest strategy: matrix: service: [service-a, service-b, service-c] # 替换成你的实际服务列表 steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 # 换成你的项目Node版本 cache: 'npm' # 自动缓存node_modules - name: Install dependencies run: npm ci # 用ci比install更快,依赖版本更稳定 - name: Run tests for ${{ matrix.service }} run: npm run test-compiled -- --service ${{ matrix.service }} # 假设测试命令支持指定单个服务 - 如果各服务有独立依赖目录,直接进入对应目录执行安装:
cd ./services/${{ matrix.service }} && npm ci
2. 优化依赖与编译产物缓存
- 除了默认的node_modules缓存,还可以缓存
test-compiled生成的编译产物,避免重复编译:- name: Cache compiled test files uses: actions/cache@v3 with: path: ./path/to/compiled-tests # 替换成你的编译产物实际路径 key: ${{ runner.os }}-compiled-tests-${{ hashFiles('**/*.ts', '**/*.js') }} # 源码变更时自动更新缓存 - 全程用
npm ci代替npm install,它会严格按照package-lock.json安装,速度更快且依赖版本一致。
3. 优化测试执行本身
- 拆分测试套件并行跑:用Jest的
--maxWorkers参数,根据虚拟机核心数设置(GitHub Actions虚拟机一般有2-4核),比如:npm run test-compiled -- --maxWorkers=50% - 跳过不必要的测试:通过环境变量或配置文件,排除CI环境不需要的本地调试类测试。
- 增量测试:只运行变更代码对应的测试用例,比如用
jest --onlyChanged(依赖Git),或者结合PR事件,只检测变更文件关联的测试。
4. 优化工作流基础环境
- 选更快的虚拟机:优先用
ubuntu-latest(比Windows/macOS快很多),如果需要更强资源,可开启GitHub的largerunner。 - 砍掉冗余步骤:移除工作流里不需要的检查、打包、预部署等步骤,只保留测试相关操作。
- 预构建依赖镜像:如果项目依赖复杂,提前构建包含Node环境和所有依赖的Docker镜像,工作流直接拉取镜像,跳过依赖安装步骤。
5. 串行作业下的临时优化(若暂时无法并行)
- 并行安装依赖:如果多个服务共享根目录依赖,先装根目录依赖,再并行装各服务私有依赖:
npm ci && (cd service-a && npm ci) & (cd service-b && npm ci) & wait - 复用共享编译产物:先完成所有服务的共享编译步骤,再依次执行每个服务的测试,避免重复编译公共代码。
内容的提问来源于stack exchange,提问作者nray
相关产品推荐
相关产品推荐

