GitLab CI中使用Docker-in-Docker无法连接Selenium Grid 4的问题
问题原因
- 用
docker作为主机名时解析失败:junit任务的容器无法正确连通docker:dind服务,或者dind容器内的Selenium Hub未完成启动就被发起连接。 - 用
localhost时连接被拒绝:junit任务的容器和运行Selenium的dind容器是独立实例,localhost仅指向junit容器自身,无法跨容器访问Selenium服务。
解决方案
方案一:修正GitLab CI配置,确保跨容器连通性
1. 更新.gitlab-ci.yml配置
补充docker:dind的标准环境变量,添加Selenium Hub就绪等待步骤:
variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" SELENIUM_GRID_URL: "http://docker:4444" # 新增docker:dind必备变量 DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" cache: paths: - .m2/repository/ - target/ stages: - build - test compile: stage: build image: maven:3.8.7-eclipse-temurin-17 script: mvn compile docker-selenium: stage: test image: docker:23.0.0 services: - docker:23.0.0-dind script: - docker compose up -d # 验证容器启动状态 - docker compose ps junit: stage: test needs: ["docker-selenium"] image: maven:3.8.7-eclipse-temurin-17 script: # 等待Selenium Hub完全就绪,避免提前发起连接 - until curl -s $SELENIUM_GRID_URL/status | grep -q "ready"; do sleep 5; done - mvn test -Dparallel-enabled=true -Dthread-count=7 -Dselenium.grid.url=$SELENIUM_GRID_URL
2. 修正测试代码的Grid地址读取逻辑
确保代码能读取maven传入的系统变量:
String gridUrl = System.getProperty("selenium.grid.url", "http://localhost:4444"); WebDriver driver = new RemoteWebDriver(new URL(gridUrl), options);
方案二:直接将Selenium作为GitLab CI服务(更简洁)
不需要单独维护docker-compose,直接在junit任务中配置Selenium服务:
variables: MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" SELENIUM_GRID_URL: "http://selenium-hub:4444" cache: paths: - .m2/repository/ - target/ stages: - build - test compile: stage: build image: maven:3.8.7-eclipse-temurin-17 script: mvn compile junit: stage: test needs: ["compile"] image: maven:3.8.7-eclipse-temurin-17 services: - name: selenium/hub:latest alias: selenium-hub - name: selenium/node-chrome:latest variables: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 SE_NODE_MAX_SESSIONS: 8 SE_NODE_OVERRIDE_MAX_SESSIONS: "true" - name: selenium/node-firefox:latest variables: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 SE_NODE_MAX_SESSIONS: 8 SE_NODE_OVERRIDE_MAX_SESSIONS: "true" script: - until curl -s $SELENIUM_GRID_URL/status | grep -q "ready"; do sleep 5; done - mvn test -Dparallel-enabled=true -Dthread-count=7 -Dselenium.grid.url=$SELENIUM_GRID_URL
这种方式下GitLab会自动管理Selenium服务的网络,junit容器可直接通过selenium-hub主机名访问Grid。
内容的提问来源于stack exchange,提问作者k_rollo
相关产品推荐
相关产品推荐

