java - 如何使用自己的跑步者在 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 数据库执行我的测试?
解决方案
您在 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
推荐阅读
- node.js - 如何避免在 google api 中出现“'ReadGroup' 的配额超出”错误
- javascript - Fullcalendar : minTime 错误地计算 fc-not-start
- javascript - 我无法在 vue 项目中使用 Echarts Zrender 绘制图像,但可以在 html 中使用
- javascript - React 无限滚动组件性能
- javascript - 如何在 td click 上打开现有的 fancybox 3 图像
- typo3 - smartreach 错误调用成员函数
- php - APCu 数据是存储在硬盘还是内存中?
- android - 如何将第三方库引用添加到文档中
- flutter - RefreshIndicator 不适用于 FutureBuilder?
- javascript - Webpack 4 - 拆分块