javascript - Gitlab CI - 在赛普拉斯测试可以运行之前服务器被“杀死”
问题描述
我在 Gitlab 中运行一个 CI 管道,它运行一些 Cypress 集成测试作为测试阶段的一部分。这些测试在我的本地机器上运行得非常好,但是当我尝试在 Gitlab CI 中运行它们时,似乎 Gitlab 运行程序正在杀死我的本地服务器,然后我才能对其运行赛普拉斯测试。这是我的 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 运行器的控制台输出,您可以看到它在哪里显示“已杀死”,然后是“err no 137”,它似乎只是停止了start:ci
运行我的本地服务器的进程,因此集成测试可以针对它们运行。
最后,这是我测试的一小段,我使用了cy.visit
在服务器被杀死时从不响应的命令:
describe('Code entry page - API responses are managed correctly', () => {
beforeEach(() => {
cy.visit(routes.APP.HOME); // this just times out
});
...
编辑cypress/browsers:node14.15.0-chrome86-ff82
我已经尝试在本地(不在 gitlabci 中)
使用的完全相同的 docker 容器内运行 test:ci 脚本,并且它没有问题。问题肯定出在 Gitlab 上吗?
解决方案
错误 137 通常意味着您的 Docker 容器由于没有足够的资源而被杀死。正如我在评论中提到的,您当前的容器使用 4GB 内存运行。由于您没有在 CI/CD 中定义任何tag
密钥,因此您可能在 GitLab 的Linux 运行器 cloud上运行,该运行器使用n1-standard-1
GCP 上的实例运行,内存限制为 3.75 GB。本质上,一旦您的测试容器启动,它会立即消耗运行器上的所有可用内存,并且您的容器会被终止。
要绕过内存限制,您必须运行自己的 gitlab-runner。无法在共享运行器云上使用更多内存来运行。您可以通过在本地机器上启动 gitlab-runner 来相当容易地测试这一点(请参阅此处的安装 gitlab 运行器的说明)。安装运行器后,将运行器注册到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 内存的数字海洋水滴。这将允许您运行一个实例几个小时来测试解决方案,然后再确定什么是长期可行的。
推荐阅读
- amazon-ec2 - 使用 docker 在 AWS ray 集群上启动一个简单的 python 脚本
- python - 无法使用 graphviz 渲染决策树
- kubernetes - kubectl 突然询问用户名
- python - `set_index()` 不排序索引?
- amazon-web-services - 修复“用户:匿名无权执行”
- node.js - 通过代理将客户端标头、isp、geo 转发到服务器
- python - for循环中的Python过滤器函数
- javascript - JavaScript 对象自动排序
- flutter - 如何在 Dart Flutter 中使日期选择器“确定”和“取消”按钮文本变黑?
- python - Django:将 HTML(包含表单)解析为字典