如何在 gitlab CI 中访问被测试的 dockerized 应用程序
Posted
技术标签:
【中文标题】如何在 gitlab CI 中访问被测试的 dockerized 应用程序【英文标题】:How to access dockerized app under test in gitlab CI 【发布时间】:2021-12-24 18:43:48 【问题描述】:我有一个带有 selenium 的 testng
项目,用于在 vuejs
和 springboot
后端进行前端应用程序的集成测试。因此,为了运行测试,我首先需要调出所有依赖项目:
每个项目都在自己的仓库中。
所以我创建了 springboot 和前端应用程序的 docker 镜像,并将其放在gitlab container registry
中。
然后在testeng项目中计划在.gitlab-ci.yml
中使用docker-compose。这里是 docker-compose.yml
用于 testng 项目:
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 是什么? 当我在本地执行此操作时,我使用以下网址进行测试:
前端应用:http://localhost:8080 api:http://localhost:8082但如果在 gitlab ci 上运行,访问前端和 api 的 url 是什么?
【问题讨论】:
您能否提供您的.gitlab-ci.yml
的相关部分——您是否使用docker:dind
服务?
【参考方案1】:
TL;DR 而不是使用localhost
,您需要使用您的 docker 守护程序 (docker:dind
) 服务的主机名。如果您按照常规设置为 GitLab 作业设置 docker-in-docker,则很可能是 docker
。
所以你需要根据你的撰写文件使用的网址是:
前端应用程序: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-in-docker 时,此环境中的重要区别在于 docker 守护进程是远程的。因此,当您通过 docker API 公开端口时,这些端口会在 docker 守护进程主机上而不是在您的作业容器中本地公开。
因此,您必须使用 docker 守护程序的主机名,而不是 localhost
,才能访问您启动的容器。
替代解决方案
另一种方法是在您使用 compose 堆栈创建的同一 docker 网络内部进行测试。这样一来,您的测试就与 docker 环境所在的位置无关,例如,可以利用 compose 文件中的服务别名(如 frontendapp
、demoapi
等),而不是依赖已发布的端口。
例如,您可以选择将测试容器添加到您的撰写堆栈。 Testcontainers 等一些测试库也可以帮助进行设置。
【讨论】:
以上是关于如何在 gitlab CI 中访问被测试的 dockerized 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Gitlab CI 中捕获结构化的 xUnit 测试输出?
如何使用 CodeceptJS 在 GitLab CI 中实现自动测试阶段?