GitLab+Docker-Compose环境下Gradle测试及目录挂载问题求助
GitLab CI中Docker-Compose部署后测试的问题解决
一、直接跑测试连不上Spring Boot的问题
你遇到的localhost连接拒绝,核心原因是GitLab CI Runner如果以容器模式运行,localhost指向的是Runner容器本身,而非docker-compose启动的Spring Boot容器。
解决办法:
- 给docker-compose加自定义网络
把所有服务(Postgres、Spring Boot、后续的测试容器)放到同一个自定义网络里,这样就能用服务名互相访问。修改docker-compose.yml:version: '3.8' networks: app-net: driver: bridge services: postgres: image: postgres:14-alpine networks: [app-net] # 你的Postgres配置(环境变量、数据卷等) spring-boot-app: build: . networks: [app-net] # 不需要端口映射到宿主(CI环境里内部访问就行) healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] interval: 10s timeout: 5s retries: 5 - 用服务名代替localhost访问
测试命令里把http://localhost:8080换成http://spring-boot-app:8080(spring-boot-app是你docker-compose里的服务名):./gradlew test -Dapp.base.url=http://spring-boot-app:8080 - 等应用完全启动再跑测试
别刚启动docker-compose就跑测试,用docker-compose up --wait等待服务健康就绪:docker-compose up -d docker-compose up --wait # 会等所有带healthcheck的服务就绪 ./gradlew test
二、测试容器挂载GitLab工作目录为空的问题
这个一般是挂载路径配置错了或者权限不匹配导致的。
解决步骤:
- 先确认CI的工作目录
在CI脚本里先打印当前路径,确保你挂载的是正确的目录:echo "CI工作目录: $PWD" - 正确配置docker-compose的挂载
用绝对路径挂载,别用相对路径,避免上下文混乱。比如测试容器的配置:services: test-runner: image: gradle:7.6-jdk17 networks: [app-net] volumes: - ${PWD}:/app # 用环境变量PWD获取CI工作目录的绝对路径 working_dir: /app command: ./gradlew test -Dapp.base.url=http://spring-boot-app:8080 - 处理权限问题
GitLab CI Runner的用户是gitlab-runner(UID通常是1000),而gradle容器里的用户UID可能不一样,导致读不到挂载的目录。最简单的办法是让测试容器用root用户运行:
或者在CI脚本里先给工作目录加权限:test-runner: image: gradle:7.6-jdk17 user: root volumes: - ${PWD}:/app working_dir: /app command: ./gradlew test -Dapp.base.url=http://spring-boot-app:8080chmod -R 777 $PWD docker-compose run test-runner - 别用相对路径构建上下文
如果你的docker-compose里有build字段,确保上下文是./(CI工作目录),不要用其他相对路径,否则会导致挂载的内容不对。
内容的提问来源于stack exchange,提问作者MatWdo
相关产品推荐
相关产品推荐

