Как запустить Postgres как сервис в задании gitlab с использованием собственного бегуна? - PullRequest
0 голосов
/ 09 января 2019

Я хочу настроить конвейер gitlab для запуска моих интеграционных тестов с базой данных Postgres с использованием Maven. Я попытался следовать этой документации , но потом заметил, что это работает только с общими бегунами gitlab, но я использую свой собственный gitlab runner, который работает в Kubernetes.

Мой 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 без использования общего бегуна?

1 Ответ

0 голосов
/ 09 января 2019

Вы столкнулись с разницей в том, как сеть обрабатывается в Docker Executor и Kubernetes Executor.

Исполнитель Docker работает почти как docker-compose, поднимая все ваши контейнеры в одной сети. Каждый контейнер получает IP, и создается DNS : если ваша служба имеет имя postgres, команда nc postgres разрешит IP-адрес контейнера postgres и свяжется с ним (например, 172.17.0.15:5432).

Исполнитель kubernetes создаст бегунка. Все ваши контейнеры будут запущены в одном модуле с одним 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
...