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

Java 如何使用自己的runner在gitlab作业中将Postgres作为服务运行?,java,postgresql,maven,gitlab,gitlab-ci-runner,Java,Postgresql,Maven,Gitlab,Gitlab Ci Runner,我想配置gitlab管道,以便使用Maven对Postgres DB运行集成测试。我试着遵循这一点,但后来我注意到这只适用于共享的gitlab runner,但我使用的是我自己的gitlab runner,它在Kubernetes中运行 Mygitlab ci.yml: cache: key: "$CI_COMMIT_REF_NAME" untracked: true paths: - .m2/repository/ variables: MAVEN_CLI_OPTS: "

我想配置gitlab管道,以便使用Maven对Postgres DB运行集成测试。我试着遵循这一点,但后来我注意到这只适用于共享的gitlab runner,但我使用的是我自己的gitlab runner,它在Kubernetes中运行

My
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执行我的测试?docker executor和Kubernetes executor处理网络的方式有所不同

docker executor的工作方式非常类似于在同一网络中添加所有容器的docker compose每个容器获得一个IP并创建一个DNS:如果您的服务名为
postgres
,则命令
nc postgres
将解析postgres容器IP并与之联系(例如
172.17.0.15:5432

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

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

  • 检测您正在使用哪种跑步者标签
    $CI\u runner\u标签
  • 在所有执行器上定义自定义变量
    $POSTGRES\u URL
  • 尝试解析
    postgres
    并返回到127.0.0.1

您收到了什么错误?我建议您将postgres实现为k8s部署,并在需要时触发它,并在测试运行后将其删除。这比在运行的gitlab runner pod中安装postgres更像k8s风格。当我的测试尝试连接到它时,找不到postgres主机。但我甚至从日志中看到,在使用我自己的runner时,没有部署任何服务。谢谢你的建议,我想在这里问一次,希望有一种方法可以做到这一点,就像gitlab shared runner一样。
127.0.0.1:5432
。谢谢你,特别是你的完美描述