我有一个带硒的testng
项目,用于vuejs
和springboot
后端的前端应用程序集成测试。因此,为了运行测试,我需要首先提出所有依赖的项目:
- springboot和mongodb
- vuejs-frrontend应用程序
每个项目都在自己的回购中。所以我已经创建了springboot和前端应用程序的docker镜像,并将其放在gitlab container registry
中。然后在testeng项目中计划使用docker编写.gitlab-ci.yml
。以下是测试项目的docker-compose.yml
:
version: '3.7'
services:
frontendapp:
image: demo.app-frontend-selenium
container_name: frontend-app-selenium
depends_on:
- demoapi
ports:
- 8080:80
demoapi:
image: demo.app-backend-selenium
container_name: demo-api-selenium
depends_on:
- mongodb
environment:
- SPRING_PROFILES_ACTIVE=prod
- SCOUNT_API_ENDPOINTS_WEB_CORS_OPTIONS_ALLOWEDORIGINS=*
- SPRING_DATA_MONGODB_HOST=mongodb
- SPRING_DATA_MONGODB_DATABASE=demo-api-selenium
- KEYCLOAK_AUTH-SERVER-URL=https://my-keycloak-url/auth
ports:
- 8082:80
mongodb:
image: mongo:4-bionic
container_name: mongodb-selenium
environment:
MONGO_INITDB_DATABASE: demo-api-selenium
ports:
- 27017:27017
volumes:
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
在gitlab-ci.yml中运行docker compose后,为了执行测试,前端应用程序的url是什么?当我在本地进行测试时,我使用以下URL进行测试:
- 前端应用程序:http://localhost:8080
- api:http://localhost:8082
但如果在gitlab ci上运行,访问前端和api的url是什么?
TL;DR而不是使用localhost
,您需要使用docker守护进程(docker:dind
(服务的主机名。如果你按照通常的设置在docker中为你的GitLab作业设置docker,这很可能是docker
。
因此,根据您的撰写文件,您需要使用的URL是:
- 前端应用程序:
http://docker:8080
- api:
http://docker:8082
my_job:
services:
- name: docker:dind
alias: docker # this is the hostname of the daemon
variables:
DOCKER_TLS_CERTDIR: ""
DOCKER_HOST: "tcp://docker:2375"
image: docker:stable
script:
- docker run -d -p 8000:80 strm/helloworld-http
- apk update && apk add curl # install curl and let server start
- curl http://docker:8000 # use the daemon to reach your containers
关于这方面的完整解释,请继续阅读。
Gitlab CI与本地的Docker端口映射
本地工作方式
通常,当您在系统上本地使用docker-compose
时,您通常在本地主机上运行docker守护程序(例如使用docker桌面(。
当您提供像8080:80
这样的端口映射时,意味着在绑定到容器中端口80的守护进程主机上发布端口8080。当在本地运行时,这意味着您可以通过localhost
访问容器。
在GitLab中
但是,当您在GitLab CI上的docker中运行docker时,此环境中的重要区别在于docker守护进程是远程的。因此,当您通过docker API公开端口时,这些端口将在docker守护进程主机上公开,而不是在作业容器的本地公开。
因此,必须使用docker守护进程的主机名,而不是localhost
来访问启动的容器。
替代解决方案
另一种选择是在内进行测试,与您使用compose堆栈创建的docker网络相同。这样,您的测试就不知道docker环境的位置,并且可以利用撰写文件中的服务别名(如frontendapp
、demoapi
等(,而不是依赖于发布的端口。
例如,您可以选择将测试容器添加到撰写堆栈中。一些测试库(如Testcontainers(也可以帮助设置此功能。