Estoy ejecutando una canalización de CI en Gitlab que ejecuta algunas pruebas de integración de Cypress como parte de la etapa de prueba. Las pruebas funcionan absolutamente bien en mi máquina localmente, pero cuando intento ejecutarlas en Gitlab CI, parece que el ejecutor de Gitlab está matando mi servidor local antes de que pueda ejecutar mis pruebas de Cypress en él. Aquí está mi configuración de 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 Y aquí están los scripts relevantes de package.json que la configuración anterior ejecuta en 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", }, Es la etapa final de tests la que actualmente está fallando. Aquí está la salida de la consola del corredor Gitlab, puede ver donde dice 'matado' y luego 'err no 137', parece que simplemente detiene el proceso start:ci , que es lo que ejecuta mi servidor local para que las pruebas de integración puedan ejecutarse contra a ellos.
Finalmente, aquí hay un pequeño fragmento de mi prueba, uso el comando cy.visit que nunca responde cuando el servidor se apaga:
describe('Code entry page - API responses are managed correctly', () => { beforeEach(() => { cy.visit(routes.APP.HOME); // this just times out }); ... EDITAR He intentado ejecutar el script test:ci dentro del mismo contenedor docker que usa ( cypress/browsers:node14.15.0-chrome86-ff82 ) localmente (no en gitlabci) y funciona sin problemas. ¿El problema debe estar en Gitlab seguramente?
El error 137 generalmente significa que su contenedor Docker se eliminó debido a que no tenía suficientes recursos. Como mencioné en los comentarios, su contenedor actual se ejecuta con 4 GB de memoria. Dado que no está definiendo claves de tag dentro de su CI/CD, es probable que esté ejecutando en la nube del corredor de Linux de GitLab, que se ejecuta con una instancia n1-standard-1 en GCP, que está limitada a 3,75 GB de RAM. Esencialmente, tan pronto como se inicia su contenedor de prueba, consume instantáneamente toda la memoria disponible en el corredor y su contenedor se elimina.
Para sortear la limitación de memoria, debe ejecutar su propio gitlab-runner. No hay forma de ejecutar usando una mayor cantidad de memoria en la nube del corredor compartido. Puede probar esto con bastante facilidad activando un gitlab-runner en su máquina local ( consulte las instrucciones aquí para instalar un gitlab runner). Una vez que haya instalado su corredor, registre su corredor en la etiqueta high-memory , luego actualice su CI/CD para usar esa etiqueta usando la siguiente sintaxis en ese último trabajo:
tests: image: cypress/browsers:node14.15.0-chrome86-ff82 stage: tests tags: - high-memory script: - npm ci - npm run test:ciSus trabajos pueden usar tanta memoria como haya asignado su ejecutor. Si su máquina tiene 8 Gb de memoria, los trabajos podrán usar hasta 8 Gb de memoria.
Si su máquina no tiene suficiente memoria por sí misma, siempre puede activar temporalmente una instancia en la nube con suficiente memoria. Podrías probar una gota digital del océano con 16GB de memoria por 0.11c/hora, por ejemplo. Esto le permitiría ejecutar una instancia durante un par de horas para probar la solución antes de determinar qué es viable a largo plazo.