Estoy creando un gitlab-ci para ejecutar pruebas e2e sobre mi aplicación, entonces, dado que tengo este docker-compose.yml:
services: chrome: image: zenika/alpine-chrome:latest command: [ chromium-browser, "--headless", "--no-sandbox", "--disable-gpu", "--ignore-certificate-errors", "--reduce-security-for-testing", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222", "https://google.com/", ] ports: - "9222:9222" networks: - test-e2e networks: test-e2e: ipam: driver: default config: - subnet: 172.28.0.0/16 cuando ejecuto docker-compose up todo funciona bien, y en mi máquina local puedo visitar localhost:9222 y acceder al depurador de Chrome.
Sin embargo, cuando ejecuto el mismo trabajo en gitlab-ci, aparece un error ECONNREFUSED :
F---F Failures: 1) Scenario: List of Profiles # src/features/profile.feature:3 ✖ Before # dist/node/development/webpack:/hooks/puppeteer.hooks.ts:17 Failed to fetch browser webSocket url from http://localhost:9222/json/version: connect ECONNREFUSED 127.0.0.1:9222 Error: connect ECONNREFUSED 127.0.0.1:9222 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14) Entonces, está claro que no puedo unirme a la red docker-compose y acceder a localhost:9222 desde el trabajo
Mi gitlab-ci.yml es bastante sencillo y se ve así:
E2E tests: stage: test end-to-end image: name: docker/compose:1.24.1 entrypoint: ["/bin/sh", "-c"] services: - docker:dind before_script: - apk --update add nodejs yarn - docker-compose -f test-e2e.yaml up -d script: - yarn test:cucumber after_script: - docker-compose -f test-e2e.yaml down yarn test:cucumber básicamente ejecuta pepino y titiritero tratando de acceder a localhost:9222 para obtener los metadatos de Chrome.
TL; DR En CI, se puede acceder a su contenedor de chrome usando docker:9222 (o más generalmente <name-of-the-dind-service-on-ci>:<exposed-port> ), no localhost:9222
Explicación
Según su gitlab-ci.yml , comenzará 2 contenedores:
docker/compose:1.24.1 desde el que ejecutará los comandos docker-compose e yarndocker:dind en el que se ejecutará un Docker Daemon . Se podrá acceder a este contenedor desde docker/compose:1.24.1 container a través de la ventana docker de nombre de host ( consulte el documento de GitlabCI sobre cómo acceder a los servicios )Cuando se ejecuta un contenedor en Docker, el demonio de Docker inicia el contenedor y se ejecutará y expondrá puertos en el host en el que se ejecuta el demonio.
chrome a través de localhost .docker/compose:1.24.1 pero el demonio Docker se está ejecutando en otro contenedor (un host diferente): el contenedor docker:dind . El contenedor chrome se creará dentro de docker:dind container y su puerto se expondrá desde este mismo contenedor. Simplemente necesita acceder al contenedor docker:dind que expondrá los puertos chrome . Al usar localhost desde su contenedor docker/compose:1.24.1 , no podrá llegar a chrome porque su puerto no está expuesto en el contenedor docker/compose:1.24.1 sino desde docker:dind container. Debe especificar su host ( docker ) y el puerto expuesto ( 9222 )
Si está utilizando ejecutores compartidos de gitlab, probablemente no tenga permitido crear redes por razones de seguridad.
Trate de usar sus propios corredores privados. Es realmente fácil configurarlos: https://docs.gitlab.com/runner/install/
Una alternativa son los servicios .
me parece buena idea empezar
docker-compose updentro del script de CI.
Después podrás acceder. Y si vuelve a ejecutar CI, iniciará los mismos contenedores.