如何创建跨多阶段的CI作业以提升并行性?
如何配置跨阶段并行CI作业,让测试尽早启动
哈哈,这个场景太常见了!很多团队都会遇到核心构建快但有个慢任务拖后腿,想让测试尽早跑起来的需求。我来给你拆解下怎么实现,用主流的CI工具举例子,你一看就懂!
核心思路
要实现你的需求,关键要做到两点:
- 让
slow_build和核心build任务同时启动,不用等彼此 - 让
test任务只依赖核心build的完成,完全不关心slow_build的状态
本质就是打破传统的“阶段线性执行”限制,通过并行阶段/独立作业 + 精准依赖控制来提升效率。
具体配置示例
1. GitLab CI 实现
GitLab CI支持并行阶段,同时可以用needs字段精准指定作业依赖:
# 定义并行阶段:prepare之后,build和slow_build_stage同时执行,然后才是test stages: - prepare - [build, slow_build_stage] - test # 准备阶段:拉取代码、安装通用依赖等 prepare_job: stage: prepare script: - git fetch --all - apt-get install -y common-deps # 核心build任务,快速完成 fast_build_job: stage: build needs: [prepare_job] script: - echo "编译核心代码、生成测试所需产物" - ./compile-core.sh - ./package-test-assets.sh # 慢构建任务,和build阶段同时启动 slow_build_job: stage: slow_build_stage needs: [prepare_job] script: - echo "编译文档、打包大体积静态资源、上传镜像等慢操作" - ./build-docs.sh - ./package-large-assets.sh # 测试任务:只等fast_build完成就启动,完全不等slow_build test_job: stage: test needs: [fast_build_job] script: - echo "运行单元测试、集成测试" - ./run-unit-tests.sh - ./run-integration-tests.sh
2. GitHub Actions 实现
GitHub Actions通过jobs的needs字段控制依赖,默认不依赖的jobs会并行启动:
name: Parallel CI Pipeline on: [push, pull_request] jobs: # 准备任务:拉取代码、缓存依赖 prepare: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Cache dependencies uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} # 核心build任务 fast_build: runs-on: ubuntu-latest needs: prepare steps: - name: Checkout code uses: actions/checkout@v4 - name: Install deps run: npm install - name: Build core assets run: npm run build:core # 慢构建任务,和fast_build并行启动 slow_build: runs-on: ubuntu-latest needs: prepare steps: - name: Checkout code uses: actions/checkout@v4 - name: Install deps run: npm install - name: Build docs & large assets run: npm run build:docs && npm run build:large # 测试任务:只依赖fast_build完成 test: runs-on: ubuntu-latest needs: fast_build steps: - name: Checkout code uses: actions/checkout@v4 - name: Run tests run: npm test
关键注意事项
- 确保
test任务不需要slow_build的产物,如果有部分测试依赖slow_build,可以拆分测试任务:一部分依赖fast_build先跑,另一部分等slow_build完成再跑 - 不同CI工具的语法略有差异,但核心逻辑一致:并行启动非依赖任务 + 精准绑定依赖关系
- 如果你的CI工具不支持并行阶段,也可以把
slow_build放到和build同一个阶段,只要它和build任务没有依赖,就会并行执行,然后test只依赖build任务即可
内容的提问来源于stack exchange,提问作者anol
相关产品推荐
相关产品推荐

