Gitlab CI服务端口是如何暴露的?

SLO*_*OBY 11 continuous-integration imap docker gitlab-ci gitlab-ci-runner

我有一个.gitlab-ci.yml文件:

integration_test:
  services:
    - name: registry.gitlab.com/group/project/testmailserver:1.1
      alias: "mail.email"
  stage: test
  script:
    - ./gradlew -g /cache/.gradle --stacktrace --info integrationTest
Run Code Online (Sandbox Code Playgroud)

该服务是基于此的完整堆栈电子邮件服务器:tvial/docker-mailserver:latest.在我的docker-compose配置本地,我能够运行它并连接到它.

version: '2'

services:
  mail:
    image: registry.gitlab.com/group/project/testmailserver:1.1
    hostname: mail
    domainname: localhost
    ports:
      - "25:25"
      - "143:143"
      - "587:587"
      - "993:993"
    environment:
      - ONE_DIR=1
      - DMS_DEBUG=0
      - MAIL_USER=invoicereader
      - MAIL_PASS=invoicereader
    cap_add:
      - NET_ADMIN
Run Code Online (Sandbox Code Playgroud)

如果我运行它docker-compose up并通过端口993上的IMAP连接到它,它工作正常.集成测试也顺利进行

但是,如果集成测试由gitlab CI执行,则会失败.我唯一能得到的例外是Connection拒绝.

可能是服务的端口没有正确暴露?CI服务器如何确定它必须向所述服务打开的端口?

使用CI运行时可能出现什么问题?我该如何以不同方式测试?

对不起,很多问题,我只是绝望地失去了..

小智 9

来自官方文档

services关键字仅定义在您的作业期间运行的另一个 Docker 映像,并链接到该image关键字定义的 Docker 映像。这允许您在构建期间访问服务映像。

image您的文件中没有关键字.gitlab-ci.yml。因此,您的工作在哪里运行实际上是不可预测的integration_test

如果您的作业在 Docker 容器内运行,则该容器将链接到您的服务的容器。链接是 Docker 的一项传统功能,但它与通过单独网络连接的两个容器非常相似。这与一个组合文件中相互通信的多个服务非常相似。

在作业容器中执行的所有内容都可以通过其名称或别名 ( mail.email) 访问您的服务。查看邮件服务器的 Dockerfile以了解该服务侦听哪些端口:

EXPOSE 25 587 143 465 993 110 995 4190
Run Code Online (Sandbox Code Playgroud)

这里不需要手动公开任何端口。撰写文件中的关键字ports将容器的端口公开给主机系统。如果您在 CI 管道中执行类似的操作,它将向运行作业的系统公开端口。这当然不是你想要的。

简而言之:使用类似的方法mail.email:993从 CI 作业中通过 IMAP 连接到邮件服务器。


San*_*ani 5

我正面临这个问题。EXPOSE <port>如果您拥有 docker 镜像并且能够更新 Dockerfile ,那么它将起作用。就我而言,我将使用多个wiremock 图像在服务部分下的.gitlab-ci.yml 中启动。

services 没有任何直接的端口映射方式,如 docker-compose.yml 中的 8080:8080。

但是,有一种解决方法可以将其作为命令传递,如下所示

services:
- name: wiremock/wiremock:main-alpine
  alias: mock-server1
  command: [ "--port","9010","--https-port","9040","--verbose"]
- name: wiremock/wiremock:main-alpine
  alias: mock-server2
  command: [ "--port","9020","--https-port","9050","--verbose"]
- name: wiremock/wiremock:main-alpine
  alias: mock-server3
  command: [ "--port","9030","--https-port","9060","--verbose"]
Run Code Online (Sandbox Code Playgroud)

请阅读GitLab关于服务的官方文档,下面是命令选项 的片段https://docs.gitlab.com/ee/ci/services/

在此输入图像描述