Не удается подключиться к postgres в Gitlab CI - PullRequest
3 голосов
/ 02 марта 2020

Я пытаюсь использовать GitLab CI PostgreSQL для моих интеграционных тестов, но он не работает.

Вот код этапа:

integration_test:
  stage: test
  tags:
    - custom_tag
  services: 
    - postgres
  variables: 
    POSTGRES_DB: test
    POSTGRES_HOST: postgres
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: postgres
    POSTGRES_HOST_AUTH_METHOD: trust
  script:
    - docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} ${DOCKER_REGISTRY}
    - docker pull ${DOCKER_IMAGE_CI}
    - export PGPASSWORD=${POSTGRES_PASSWORD}
    - docker run --rm postgres psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT 'OK' AS status;" 

Возвращает ошибку как это:

psql: ошибка: не удалось подключиться к серверу: не удалось перевести имя хоста "postgres" в адрес: имя или служба неизвестна Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Возможно, лучше взглянуть на тестирование функций докеризации. Этот подход также обеспечивает лучший контроль над сетью с помощью моста docker. Таким образом, ваша конфигурация может выглядеть следующим образом:

.gitlab-ci.yml:

stages:
 - test
before_script:
 - docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} ${DOCKER_REGISTRY}
integration_test:
  stage: test
  script:
    - docker-compose build
    - docker-compose up

docker-compose.yml:

version: '3'
networks:
  database:
services:
  postgres-db:
    image: ${DOCKER_IMAGE_CI}
    networks:
      - database
    container_name: postgres

  test-container:
    build:
      context: .
      dockerfile: Dockerfile
    networks:
      - database
    container_name: testcon

Dockerfile:

FROM postgres
ENV POSTGRES_DB=test \
    POSTGRES_HOST=postgres \
    POSTGRES_USER=postgres \
    POSTGRES_PASSWORD=postgres \
    POSTGRES_HOST_AUTH_METHOD=trust
CMD psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT 'OK' AS status;"
0 голосов
/ 02 марта 2020

Ваш конвейер выглядит так, как будто он использует shell executor со службами gitlab.

Команда docker run --rm postgres <docker command> не подключается автоматически к postgres сети. Вы можете попробовать запустить docker изображение с --link postgres, подробнее здесь . Обратите внимание, что ссылка является устаревшей функцией и может быть удалена в будущем.

Лично я попытался бы запустить свое конвейерное задание, используя docker изображение. Если ваше изображение не является общедоступным, вы можете обойти его с помощью DOCKER_AUTH_CONFIG

Если вы использовали docker бегун с защищенным паролем образом , тогда yaml будет выглядеть так:

integration_test:
  image: ${DOCKER_IMAGE_CI}
  stage: test
  tags:
    - custom_tag
  services: 
    - postgres
  variables: 
    POSTGRES_DB: test
    POSTGRES_HOST: postgres
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: postgres
    POSTGRES_HOST_AUTH_METHOD: trust
  script:
    - PGPASSWORD=${POSTGRES_PASSWORD} psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT 'OK' AS status;" 

DOCKER_AUTH_CONFIG переменная окружения будет выглядеть следующим образом ( gitlab docs ):

{
    "auths": {
        "${DOCKER_REGISTRY}": {
            "auth": "(Base64 content from ${DOCKER_USER}:${DOCKER_PASSWORD})"
        }
    }
}

и для генерации base64 auth вы можете использовать echo -n "${DOCKER_USER}:${DOCKER_PASSWORD}" | base64

...