Gitlab CI执行Cypress测试前服务被kill报错137如何解决?
问题根因
你遇到的killed提示+错误码137是系统OOM(内存不足)杀手主动终止进程导致的,并非Gitlab主动杀掉服务。你本地Docker运行时内存配额足够,所以没有触发该问题,而Gitlab Runner的可用内存无法支撑你当前测试任务的总内存消耗。
排查步骤
- 首先在
tests阶段的脚本开头增加内存监控逻辑,确认峰值内存占用:
tests: image: cypress/browsers:node14.15.0-chrome86-ff82 stage: tests script: - ( while true; do echo "=== 当前内存使用 ===" && free -h && sleep 2; done ) & # 后台持续打印内存占用 # 原有后续脚本
运行流水线后查看日志,确认进程被杀前的内存使用率是否达到上限。
解决方案
1. 修复CI配置错误(必须先改)
你当前的tests阶段存在两处明显配置问题:
- 重复执行
npm ci:install阶段已经完成依赖安装且配置了缓存,tests阶段不需要重复安装依赖,直接删掉该命令即可。 - 未拉取构建产物:
build阶段生成的dist文件夹默认不会传递到后续阶段,需要给tests阶段增加依赖配置:
tests: image: cypress/browsers:node14.15.0-chrome86-ff82 stage: tests dependencies: - install - build # 拉取build阶段的dist产物 script: - npm run test:ci
2. 降低内存消耗
- 拆分测试任务:把Jest单测和Cypress集成测试拆成两个独立的CI任务,避免Node服务、Chrome浏览器、Jest、Cypress四个高内存进程同时运行抢资源。
- 下调Node内存上限:你当前给
start:ci的Node进程设置了4G内存上限,如果Runner总内存不足4G会直接触发OOM,可以改成2G:
"start:ci": "export NODE_OPTIONS=--max_old_space_size=2048 serve dist --no-clipboard --listen ${PORT:-3000}",
- 给Chrome增加适配Docker的启动参数:Docker环境默认
/dev/shm空间很小,Chrome无头模式运行时容易爆内存,修改Cypress启动命令:
"test:cypress": "cypress run --headless --browser chrome --args --disable-dev-shm-usage --js-flags=\"--max-old-space-size=2048\"",
3. 调整Runner内存配额
如果是你自行部署的Gitlab Runner,修改Runner的config.toml配置,给Docker执行器增加内存限制:
[runners.docker] memory = "8g" memory_swap = "8g"
如果使用Gitlab公共Runner,公共Runner默认内存为4G,完成上述优化后基本可以满足需求,仍然不够的话可以升级Gitlab的CI配额。
内容的提问来源于stack exchange,提问作者red house 87
相关产品推荐
相关产品推荐

