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

如何在GitLab CI/CD流水线中并行运行命令解决测试任务卡住问题

解决方案

你当前配置的核心问题是npm run dev属于前台阻塞进程,启动后不会主动退出,导致后续npm run test命令永远无法被执行,可通过以下方式解决:

方案1:后台启动+就绪检测(最通用,无需额外依赖)

修改你的.gitlab-ci.yml配置如下,核心逻辑是把服务放到后台运行,等待服务完全启动后再执行测试,测试结束后清理残留进程:

test_job:
  stage: test
  script:
    # 后台启动服务,将启动日志输出到文件方便后续排查问题
    - npm run dev > dev.log 2>&1 &
    # 保存服务进程ID,方便后续清理
    - DEV_PID=$!
    # 轮询检测服务是否启动完成,最多等待30秒
    - |
      counter=0
      # 以下地址替换为你的服务实际地址,如无健康检查接口,可替换为graphql端点检测
      until curl -s -X POST http://localhost:3000/graphql -H "Content-Type: application/json" -d '{"query":"{__schema{queryType{name}}}"}' > /dev/null; do
        echo "等待服务启动中,已等待${counter}秒"
        sleep 1
        ((counter++))
        if [ $counter -eq 30 ]; then
          echo "服务启动超时,启动日志如下:"
          cat dev.log
          kill $DEV_PID || true
          exit 1
        fi
      done
    # 服务就绪后执行测试
    - npm run test
    # 测试完成后清理后台服务进程
    - kill $DEV_PID || true
  # 测试失败时自动保存服务启动日志作为制品,方便排查
  artifacts:
    paths:
      - dev.log
    when: on_failure
    expire_in: 7 days

方案2:使用wait-on工具简化配置(Node生态适配)

如果不想手写轮询逻辑,可以安装Node生态的wait-on工具实现端口/接口就绪检测:

  1. 本地安装开发依赖:npm i -D wait-on
  2. 修改CI配置如下:
test_job:
  stage: test
  script:
    - npm run dev > dev.log 2>&1 &
    - DEV_PID=$!
    # 等待对应接口可用,超时时间设为30秒
    - npx wait-on --timeout 30000 http://localhost:3000/graphql
    - npm run test
    - kill $DEV_PID || true
  artifacts:
    paths:
      - dev.log
    when: on_failure

额外优化建议

如果你执行的是接口集成测试,也可以直接使用supertest等工具直接调用Express实例,不需要单独启动服务,既可以避免进程管理的问题,也能提升测试执行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:06:03