如何访问gitlab CI中正在测试的dockerized应用程序



我有一个带硒的testng项目,用于vuejsspringboot后端的前端应用程序集成测试。因此,为了运行测试,我需要首先提出所有依赖的项目:

  • 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环境的位置,并且可以利用撰写文件中的服务别名(如frontendappdemoapi等(,而不是依赖于发布的端口。

例如,您可以选择将测试容器添加到撰写堆栈中。一些测试库(如Testcontainers(也可以帮助设置此功能。

最新更新