javascript - Gitlab CI - 服务器在 Cypress 测试可以运行之前获取 'killed'

标签 javascript node.js gitlab cypress

我在 Gitlab 中运行 CI 管道,它运行一些 Cypress 集成测试作为测试阶段的一部分。这些测试在我的本地机器上运行得非常好,但是当我尝试在 Gitlab CI 中运行它们时,似乎 Gitlab 运行程序在我可以针对它运行我的 Cypress 测试之前杀死了我的本地服务器。这是我的 Gitlab 配置:

variables:
  API_BASE_URL: https://t.local.um.io/api
  CYPRESS_API_BASE_URL: https://t.local.um.io/api
  npm_config_cache: '$CI_PROJECT_DIR/.npm'
  CYPRESS_CACHE_FOLDER: '$CI_PROJECT_DIR/cache/Cypress'

cache:
  paths:
    - node_modules/
    - cache/Cypress

stages:
  - install
  - build
  - tests

install:
  image: cypress/browsers:node14.15.0-chrome86-ff82
  stage: install
  cache:
    key: 'e2eDeps'
    paths:
      - node_modules/
      - cache/Cypress/
  script:
    - npm ci

build:
  stage: build
  dependencies:
    - install
  script:
    - npm run build
  artifacts:
    expire_in: 1 days
    when: on_success

tests:
  image: cypress/browsers:node14.15.0-chrome86-ff82
  stage: tests
  script:
    - npm ci
    - npm run test:ci
这里是相关的 package.json上述配置在 CI 中运行的脚本:
  "scripts": {
    "build": "webpack --config webpack.prod.js",
    "dev": "webpack serve --config webpack.dev.js",
    "start:ci": "export NODE_OPTIONS=--max_old_space_size=4096 serve dist --no-clipboard --listen ${PORT:-3000}",
    "test": "cross-env NODE_ENV=test && npm run test:cypress && npm run test:jest",
    "test:ci": "cross-env NODE_ENV=test && start-server-and-test start:ci http-get://localhost:3000 test",
    "test:cypress": "cypress run --headless --browser chrome",
    "test:jest": "jest",
  },
最后阶段tests目前正在失败。这是 Gitlab 运行程序的控制台输出,您可以看到它在哪里显示“已杀死”,然后是“错误没有 137”,它似乎只是停止了 start:ci运行我的本地服务器的进程,以便集成测试可以针对它们运行。
enter image description here
最后这里是我测试的一小段,我使用了 cy.visit服务器被杀死时从不响应的命令:
describe('Code entry page - API responses are managed correctly', () => {
  beforeEach(() => {
    cy.visit(routes.APP.HOME); // this just times out
  });
...
编辑
我尝试在本地(不在 gitlabci 中)使用的完全相同的 docker 容器( cypress/browsers:node14.15.0-chrome86-ff82 )中运行 test:ci 脚本,并且没有问题。问题肯定出在 Gitlab 上?

最佳答案

错误 137 通常意味着您的 Docker 容器由于没有足够的资源而被终止。正如我在评论中提到的,您当前的容器使用 4GB 内存运行。由于您定义的不是 tag您的 CI/CD 中的 key ,您可能正在 GitLab 上运行 Linux runner cloud ,它使用 n1-standard-1 运行GCP 上的实例,其内存限制为 3.75 GB。本质上,只要您的测试容器启动,它就会立即消耗运行器上的所有可用内存,并且您的容器将被杀死。
要解决内存限制,您必须运行自己的 gitlab-runner。无法在共享运行器云上使用更多内存来运行。您可以通过在本地机器上启动 gitlab-runner 来轻松测试(see instructions here 用于安装 gitlab runner)。安装运行器后,将运行器注册到 high-memory标签,然后更新您的 CI/CD 以在最后一个作业中使用以下语法使用该标签:

tests:
  image: cypress/browsers:node14.15.0-chrome86-ff82
  stage: tests
  tags:
    - high-memory
  script:
    - npm ci
    - npm run test:ci
您的作业可以使用与运行程序分配的内存一样多的内存。如果您的机器有 8Gb 内存,则作业将被允许使用最多 8Gb 内存。
如果您的机器本身没有足够的内存,您可以随时临时启动一个具有足够内存的云实例。例如,您可以尝试以 0.11c/小时的速度使用 16GB 内存的 digital ocean 水滴。这将允许您运行一个实例几个小时来测试解决方案,然后再确定什么是长期可行的。

关于javascript - Gitlab CI - 服务器在 Cypress 测试可以运行之前获取 'killed',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69795131/

相关文章:

powershell - 将 Gitlab CI Trigger Curl 转换为 Powershell Invoke-RestMethod

javascript - 使用 Ramda 减少 "position"属性

javascript - 在 View 页面加载执行 Controller 函数,AngularJS方式

javascript - 匿名函数和带函数表达式的变量语句有什么区别?

javascript - Node 服务器正在运行但本地主机拒绝连接

node.js - Watson Discovery 服务 - 查询数据收集 Node.js - 段落缺失

Javascript 推送到本地存储数组在 React 中不起作用

node.js - 我们如何使用node.js连接sqlite?

ruby - Gitlab Rack 攻击安装

kubernetes - 无法在GKE上使用BackendConfig