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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:36:04