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

Angular单元测试本地正常,GitLab CI用Karma执行被终止如何解决?

Angular GitLab CI Karma单元测试被终止问题排查与解决方案

根因定位

日志中输出的Killed是Linux系统内核的OOM(内存不足) Killer机制触发的典型表现:当系统剩余内存无法满足进程需求时,内核会主动杀掉内存占用最高的进程(通常是ChromeHeadless或者Node进程)来保障系统正常运行。
可以通过在CI任务脚本中添加以下命令验证OOM触发情况:

# 测试任务执行完成后输出系统日志中OOM相关记录
dmesg | grep -E 'Out of memory|Killed process'

如果输出包含Killed process以及对应Chrome/Node进程的PID,即可确认是内存不足导致的问题。

解决方案

1. 优化ChromeHeadless启动参数

在karma.conf.js的ChromeHeadlessNoSandbox配置的flags数组中新增以下两个参数,降低Chrome内存占用:

flags: [
  '--no-sandbox',
  '--disable-gpu',
  // 新增以下两行
  '--disable-dev-shm-usage', // 禁用/dev/shm共享内存,避免CI环境小容量共享内存不足
  '--js-flags="--max-old-space-size=2048"', // 限制Chrome V8引擎内存上限为2G
  // 原有其他参数保持不变
  '--enable-logging',
  ...
]

同时将karma.conf.js中的autoWatch参数修改为false,CI环境不需要监听文件变更,避免不必要的内存占用。

2. 调整Node进程内存上限

修改单元测试执行命令,给Node进程设置更大的内存上限:

NODE_OPTIONS=--max-old-space-size=4096 npm run ng test --watch=false --browsers=ChromeHeadlessNoSandbox

上述命令将Node进程最大内存上限调整为4G,可根据实际情况调整数值。

3. 优化CI运行环境

如果是自托管GitLab Runner,可将Runner实例内存提升到至少4G;如果使用共享Runner,选择更高配置的规格。
也可以在CI脚本中临时添加swap分区缓解内存压力:

# CI任务前置步骤,创建4G临时swap分区
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

4. 其他优化方案

  • 若测试用例数量过多,可拆分测试模块分批执行,避免单次运行内存占用过高
  • 临时关闭覆盖率统计验证问题是否解决,若关闭后恢复正常,可给coverageIstanbulReporter添加内存限制参数,或者降低覆盖率报告的生成类型
  • 检查karma-chrome-launcher、Chrome版本兼容性,确保karma-chrome-launcher版本≥3.1.0,和Chrome版本匹配,避免版本不兼容导致的内存泄漏。

内容的提问来源于stack exchange,提问作者rami-sf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:54:06