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
相关产品推荐
相关产品推荐

