如何使用自己的运行程序在gitlab作业中将Postgres作为服务运行?

时间:2019-01-09 13:57:53

标签: java postgresql maven gitlab gitlab-ci-runner

我想配置gitlab管道以使用Maven针对Postgres DB运行集成测试。我尝试遵循此documentation,但之后我注意到这仅适用于共享的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 DB执行测试吗?

1 个答案:

答案 0 :(得分:2)

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

泊坞窗执行器的工作就像docker-compose一样,在同一网络中扩展所有容器。 每个容器获取一个IP并创建一个DNS :如果您的服务名为postgres,则命令nc postgres将解析postgres容器IP并与之联系(172.17.0.15:5432例如)。

kubernetes执行器将创建一个pod赛跑者。您所有的容器都将在只有一个IP地址的同一容器中启动。 通过联系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