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

Angular+Karma+Gitlab CI中Karma测试成功后超时无法正常终止

问题原因

从输出的TOTAL: 16 SUCCESS日志可以确认测试用例已经全部执行完成,故障出在进程退出环节,和测试用例、gitlab-ci.yml配置本身无关,根因是trion/ng-cli-karma 14.0.0版本存在两个进程残留缺陷:

  • 版本升级时遗漏了Karma测试完成后的进程退出钩子绑定,测试流程结束后Node主进程不会自动触发exit事件
  • 内置的Chrome Headless启动参数未适配CI环境,测试完成后会残留Chrome僵尸进程,持有主进程事件循环句柄,导致进程一直处于活跃状态

Gitlab Runner需要等待脚本对应进程完全退出、拿到明确退出状态码才会标记任务结束,因此会出现测试跑完但任务一直挂起、不输出Job succeeded的现象。该故障是因为CI默认拉取latest标签镜像时,自动拉取了存在缺陷的14.0.0新版本,因此会出现配置未做任何修改、流水线突然失效的情况。

解决方案

按改造成本从低到高选择即可:

  • 锁死稳定版镜像(最快恢复)
    直接将CI使用的镜像版本从默认的latest锁到14.0.0之前的最后一个稳定版,不需要改动任何业务测试配置,修改gitlab-ci.yml的测试任务配置:
    test:
      image: trion/ng-cli-karma:13.3.9
      script:
        - ng test --progress false --watch false
    
  • 修改Karma配置适配14.0.0版本
    如果必须使用14.0.0版本镜像,修改项目根目录下的karma.conf.js配置,补全CI环境下Chrome的启动参数,显式开启单测运行模式:
    module.exports = function (config) {
      config.set({
        // 其余原有配置保持不变
        singleRun: true,
        browsers: ['ChromeHeadlessCI'],
        customLaunchers: {
          ChromeHeadlessCI: {
            base: 'ChromeHeadless',
            flags: [
              '--no-sandbox',
              '--disable-gpu',
              '--disable-dev-shm-usage'
            ]
          }
        }
      })
    }
    
    对应测试执行命令调整为:
    ng test --progress false --watch false --browsers ChromeHeadlessCI
    
  • 增加进程兜底清理逻辑
    如果上述配置修改后仍有偶发的进程残留问题,可以在测试脚本中增加退出码捕获和残留进程清理逻辑,既不会吞掉测试失败的状态,也能避免进程挂起:
    test:
      image: trion/ng-cli-karma:14.0.0
      script:
        - ng test --progress false --watch false; TEST_EXIT_CODE=$?; pkill -f chrome; exit $TEST_EXIT_CODE
    

内容的提问来源于stack exchange,提问作者T. SvZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:33:41