如何在 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 项目,用于在 vuejsspringboot 后端进行前端应用程序的集成测试。因此,为了运行测试,我首先需要调出所有依赖项目:

springboot 和 mongodb vuejs 前端应用

每个项目都在自己的仓库中。 所以我创建了 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 文件中的服务别名(如 frontendappdemoapi 等),而不是依赖已发布的端口。

例如,您可以选择将测试容器添加到您的撰写堆栈。 Testcontainers 等一些测试库也可以帮助进行设置。

【讨论】:

以上是关于如何在 gitlab CI 中访问被测试的 dockerized 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gitlab CI 中捕获结构化的 xUnit 测试输出?

如何使用 CodeceptJS 在 GitLab CI 中实现自动测试阶段?

Gitlab CI Python运行测试-ModuleNotFoundError:没有名为xxx的模块

Gitlab CI/CD配置-并发送消息到飞书

在 Gitlab-CI 中启用并行构建

在 gitlab CI 中连接到 kubernetes 集群时出现禁止错误