GitLab CI的docker:dind如何配置卷挂载解决Selenium下载测试失败问题
错误根因
你遇到的问题是两个配置错误共同导致的:
- RemoteWebDriver下载路径配置错误:你使用的是远程Chrome浏览器(跑在独立的docker容器中),
download.default_directory配置的是浏览器所在容器的内部路径,而不是Java测试代码运行的CI Job容器的路径,你之前配置的/target在Chrome容器中不存在、且无写入权限,实际应该配置Chrome容器内的默认下载路径/home/seluser/Downloads。 - dind模式下卷挂载路径不互通:GitLab CI中
docker:dind是独立的服务容器,你在CI Job容器中创建的/target是Job容器的本地路径,docker-compose启动的Chrome容器的卷挂载默认读取的是dind容器的文件系统,两边路径不互通导致文件无法同步。
具体修改步骤
1. 修改Java测试代码的Chrome下载路径配置
@BeforeMethod public void setUp() throws MalformedURLException { // 检查文件的路径改为CI Job容器内的项目target目录 String directory = "./target"; folder = new File(directory); System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); ChromeOptions options = new ChromeOptions(); Map<String, Object> prefs = new HashMap<String, Object>(); prefs.put("profile.default_content_settings.popups", 0); prefs.put("download.prompt_for_download", "false"); prefs.put("download.directory_upgrade", "true"); // 下载路径改为Chrome容器内部的可写下载目录 prefs.put("download.default_directory", "/home/seluser/Downloads"); // 其余代码保持不变 }
2. 修改docker-compose.yml的卷挂载配置
将绝对路径挂载改为相对当前CI工作目录的路径挂载,GitLab Runner会自动将Job的工作目录$CI_PROJECT_DIR同步挂载到dind容器的同路径下,保证两边目录互通:
version: "3" services: chrome: image: selenium/node-chrome:4.0.0-20211013 container_name: chrome shm_size: 2gb depends_on: - selenium-hub # 仅修改volumes字段,其余保持不变 volumes: - ./target:/home/seluser/Downloads environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_GRID_URL=http://localhost:4444 ports: - "6900:5900" # 其余服务配置保持不变
3. 修改gitlab-ci.yml中chrome-test阶段的目录创建逻辑
将根目录的target改为当前工作目录下的target,并给足权限保证Chrome容器的seluser用户可以写入:
chrome-test: # 其余配置保持不变,仅修改script段的目录创建命令 script: - apk add --no-cache docker-compose - apk add openjdk11 # 把原来的mkdir /target替换为下面两行 - mkdir -p ./target - chmod -R 777 ./target - docker-compose down - docker-compose up --build --force-recreate --no-deps -d - echo "Hello, chrome-test" - chmod +x ./gradlew - ./gradlew :test --tests "LoginTest_chrome_ci"
验证逻辑
修改后文件同步流程为:
- Chrome容器的下载目录
/home/seluser/Downloads挂载到了dind容器的$CI_PROJECT_DIR/target - dind容器的
$CI_PROJECT_DIR/target和CI Job容器的./target是Runner同步挂载的同一份目录 - Java测试代码检查Job容器内的
./target就能读到Chrome下载的文件
内容的提问来源于stack exchange,提问作者AutoBeginner
相关产品推荐
相关产品推荐

