我正在创建一个gitlab-ci以在我的应用程序上运行e2e测试, 因此,鉴于我有这个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
当我运行docker-compose up
时,一切正常
在我的本地计算机上,我可以访问localhost:9222
并访问chrome调试器。
但是,当我在gitlab-ci上运行相同的作业时,出现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)
因此很明显,我无法加入docker-compose网络并无法通过工作访问localhost:9222
我的gitlab-ci.yml
非常简单,看起来像这样:
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
基本上是运行黄瓜和木偶试图访问localhost:9222
以获得chrome的元数据。
答案 0 :(得分:8)
TL; DR 在CI上,您可以使用chrome
(或更常见的是docker:9222
)而不是<name-of-the-dind-service-on-ci>:<exposed-port>
localhost:9222
容器
说明
根据您的gitlab-ci.yml
,您将启动2个容器:
docker/compose:1.24.1
容器,您将从中运行docker-compose
和yarn
命令docker:dind
,其中一个Docker Daemon will run。可通过主机名docker/compose:1.24.1
(see GitlabCI doc on accessing services)从docker
容器访问此容器在Docker中运行容器时,该容器实际上是由Docker守护程序启动的,并将运行并公开运行该守护程序的主机上的端口。
chrome
来访问localhost
容器docker/compose:1.24.1
容器中运行命令,但是Docker守护进程正在另一个容器(不同的主机)中运行:docker:dind
容器。 chrome
容器将在docker:dind
容器内创建,并且其端口从同一容器暴露。您只需要访问docker:dind
容器即可公开chrome
端口。通过使用localhost
容器中的docker/compose:1.24.1
,您将无法访问chrome
,因为其端口不在docker/compose:1.24.1
容器中,而是从{{1 }} 容器。您需要指定其主机(docker:dind
)和公开端口(docker
)
答案 1 :(得分:0)
我认为好主意是开始
docker-compose up
内部CI脚本。
之后,您将可以访问。如果再次运行CI,它将启动相同的容器。
答案 2 :(得分:0)
如果您使用的是gitlab共享运行程序,则出于安全原因,可能不允许创建网络。
尝试使用自己的私人跑步者。设置它们真的很容易:https://docs.gitlab.com/runner/install/
另一个选择是services。