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

使用Mocha执行NodeJS测试时GitLab Runner卡顿求助

GitLab Runner Stuck After Mocha Tests Pass

我之前也碰到过GitLab Runner在Mocha测试全部通过后一直卡住等待的情况,大概率是Mocha没有正确触发Node.js进程退出导致的。下面几个排查方向和解决办法你可以试试看:

  • 检查测试中是否有未清理的异步资源
    测试跑完后如果还有未关闭的数据库连接、WebSocket、定时器或者其他异步资源,Node.js进程会一直保持活跃,GitLab Runner就会一直等待进程结束。你可以在测试套件的after()全局钩子中手动清理这些资源:

    // 在测试文件的全局范围添加
    after(async () => {
      // 示例:关闭数据库连接
      await databaseClient.end();
      // 示例:清除所有未完成的定时器
      const timers = require('timers');
      timers.clearTimeout(global.testTimer);
    });
    
  • 给Mocha添加--exit参数强制退出
    这是快速验证问题的方法,--exit参数会让Mocha在测试完成后强制终止Node.js进程,不管是否有残留的异步操作。修改你的CI配置:

    test:
      stage: test
      script:
        ### Run with debugging
        - mocha --exit -R mocha-pretty-bunyan-nyan build/test/v1/
        - mocha --exit -R mocha-pretty-bunyan-nyan build/test/v2/
        #- mocha build/test/v1/
    
  • 查看GitLab Runner的详细日志
    去项目的CI/CD运行记录里找到对应的Job,查看Runner的完整输出日志,有时候能找到进程挂起的具体线索,比如某个资源无法关闭的错误信息。

  • 合并测试命令减少进程启动
    把两个Mocha命令合并成一个,一次性运行所有测试文件,避免多次启动进程可能带来的异常:

    test:
      stage: test
      script:
        - mocha --exit -R mocha-pretty-bunyan-nyan build/test/v1/ build/test/v2/
    

我当时遇到这个问题是因为测试里残留了一个未关闭的Redis连接,先用--exit临时解决了CI卡住的问题,后来在全局钩子中添加了连接关闭逻辑就彻底解决了。你可以先试试--exit参数验证是不是进程未退出的问题,再逐步排查清理异步资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:40:05