首页 > 解决方案 > 如何使用自己的跑步者在 gitlab 作业中将 Postgres 作为服务运行?

问题描述

我想配置 gitlab 管道以使用 Maven 针对 Postgres DB 运行我的集成测试。我尝试遵循此文档,但后来我注意到这仅适用于共享的 gitlab 运行器,但我使用的是我自己的在 Kubernetes 中运行的 gitlab 运行器。

我的gitlab-ci.yml

cache:
  key: "$CI_COMMIT_REF_NAME"
  untracked: true
  paths:
  - .m2/repository/

variables:
  MAVEN_CLI_OPTS: "-s .m2/settings.xml "
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository/"
  POSTGRES_DB: postgres
  POSTGRES_USER: runner
  POSTGRES_PASSWORD: runner

stages:
- build
- verify

build:
  image: maven:3.6.0-jdk-8
  stage: build
  script:
  - "mvn $MAVEN_CLI_OPTS --quiet clean package -Dmaven.test.skip=true"
  artifacts:
    paths:
    - "target/*"

test:
  image: maven:3.6.0-jdk-8
  services:
  - postgres:latest
  stage: verify
  script:
  - "mvn $MAVEN_CLI_OPTS --quiet -Dspring.profiles.active=dev clean test"
使用共享运行器此配置工作正常,但我必须使用来自 Kubernetes 的运行器。有没有办法在不使用共享运行器的情况下对 postgres 数据库执行我的测试?

标签: javapostgresqlmavengitlabgitlab-ci-runner

解决方案


您在 docker executor 和 Kubernetes executor 上处理网络的方式有所不同。

docker executor 的工作方式非常类似于docker-compose在同一个网络中升级所有容器。每个容器都获得一个 IP 并创建一个 DNS:如果您的服务被命名postgres,该命令nc postgres将解析 postgres 容器 IP 并联系它(172.17.0.15:5432例如)。

kubernetes 执行器将创建一个 pod 运行器。您的所有容器都将在同一个 pod 中启动,并且只有一个 IP 地址。同一个 pod 中的容器之间的网络是通过联系来完成的127.0.0.1如果您想联系您可能想要联系的 postgres 容器127.0.0.1:5432。因此,如果您使用127.0.0.1而不是postgres它应该可以工作。

为了让您的管道在两个执行器上工作,您可以:

  • 检测您正在使用哪种跑步者标签$CI_RUNNER_TAGS
  • $POSTGRES_URL在所有执行程序上定义自定义变量
  • 尝试解决postgres并回退到 127.0.0.1

推荐阅读