You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CircleCI中无显著开销地并行执行安装依赖后的多测试步骤

解决CircleCI同Job内并行执行测试步骤的低开销方案

你的痛点我太懂了——用workspaces传递大体积依赖确实会吃掉并行带来的时间优势,甚至得不偿失。其实咱们完全可以在同一个Job内实现步骤#2至#4的并行,不需要拆分Job,也没有额外的持久化/附加开销,直接把总耗时压到4+1=5分钟。

核心思路:利用Shell后台进程+Wait命令

CircleCI的Job步骤默认是串行,但我们可以在单个run步骤里,把三个测试任务放到后台运行,然后用wait命令等待所有任务完成。这样所有测试共享同一个环境的依赖(步骤#1安装的产物直接可用),完全绕开workspace的开销。

具体配置示例

jobs:
  test:
    steps:
      - checkout
      - run:
          name: Install dependencies
          command: <<install dependencies>> # 你的步骤#1
      - run:
          name: Run all tests in parallel
          command: |
            # 启动服务器端测试,后台运行并将输出写入日志
            <<execute server-side test>> > server-test.log 2>&1 &
            SERVER_PID=$!
            
            # 启动前端测试1,后台运行
            <<execute frontend test 1>> > frontend1-test.log 2>&1 &
            FE1_PID=$!
            
            # 启动前端测试2,后台运行
            <<execute frontend test 2>> > frontend2-test.log 2>&1 &
            FE2_PID=$!
            
            # 等待所有后台测试进程完成
            wait $SERVER_PID
            wait $FE1_PID
            wait $FE2_PID
            
            # 可选:打印所有测试日志,方便失败后排查
            echo "=== Server-side Test Results ==="
            cat server-test.log
            echo -e "\n=== Frontend Test 1 Results ==="
            cat frontend1-test.log
            echo -e "\n=== Frontend Test 2 Results ==="
            cat frontend2-test.log

为什么这个方案可行?

  1. 零额外开销:所有测试都在同一个容器/虚拟机里运行,依赖直接复用步骤#1的产物,不需要任何持久化或传输操作。
  2. 真正并行:三个测试任务同时启动,总耗时由最长的那个测试(1分钟)决定,加上步骤#1的4分钟,总耗时5分钟,完美发挥并行优势。
  3. 失败检测正常:如果任意一个测试失败,对应的后台进程会返回非零状态码,wait命令会捕获到这个状态,CircleCI会正确标记Job失败。
  4. 日志可追溯:通过将每个测试的输出重定向到单独的日志文件,最后统一打印,不会出现日志混乱的问题,方便调试。

备选方案:利用CircleCI Parallelism(不推荐,资源开销高)

如果你想利用CircleCI的多Runner并行,也可以给Job设置parallelism: 3,然后根据$CIRCLE_NODE_INDEX分配不同的测试任务:

jobs:
  test:
    parallelism: 3
    steps:
      - checkout
      - run: <<install dependencies>> # 每个Runner都会执行这一步,总资源开销是3*4分钟
      - run:
          name: Run assigned test
          command: |
            case $CIRCLE_NODE_INDEX in
              0) <<execute server-side test>> ;;
              1) <<execute frontend test 1>> ;;
              2) <<execute frontend test 2>> ;;
            esac

这个方案的问题是每个Runner都要执行一次4分钟的安装步骤,虽然总耗时也是5分钟,但资源开销是原来的3倍,对于成本敏感的场景不太友好,所以优先推荐后台进程的方案。

内容的提问来源于stack exchange,提问作者nakaakist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:07:34