Как настроить .gitlab-ci.yml для тестового конвейера, когда я добавляю Postgresql - PullRequest
0 голосов
/ 10 октября 2019

У меня есть настройка с docker-compose, которая создает веб-контейнер с Django и контейнер postgresql с postgresql. Все работает нормально, и у меня нет оснований думать, что он не будет работать на производстве. Postgres - это недавнее дополнение, до того как sqlite3 работал внутри веб-контейнера.

Я застрял в тестах. У меня есть репозиторий gitlab, где я отправляю изменения, и каждое нажатие запускает тестовый конвейер, настроенный с помощью .gitlab_ci.yml. Я не могу понять, что именно мне нужно изменить в этом файле (и / или других задействованных файлах), чтобы в этой (TEST!) Среде веб и db общались друг с другом.

Независимо от того, что я делаю (включая исходные нетронутые версии), конвейер неизменно умирает с той же ошибкой:

django.db.utils.OperationalError: не удалось перевести имя хоста«db» для адреса: имя или служба неизвестна

Ошибка возникает при выполнении следующей директивы Dockerfile:

RUN python manage.py migrate

Мне не нужны тесты, если запускается postgresqlвнутри веб-контейнера или в другом контейнере, если они находят друг друга. Однако в производстве он будет работать на моей локальной машине: два контейнера, web и postgresql.

Мои файлы:

Оригинал .gitlab-ci.yml

image: docker:stable

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2
  CONTAINER_TEST_IMAGE: registry.gitlab.com/<my_repo>:$CI_COMMIT_REF_SLUG
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/<my_repo>:latest
  CONTAINER_DEVELOP_IMAGE: registry.gitlab.com/<my_repo>:develop

services:
  - docker:dind

stages:
- test

test:
  stage: test
  script:
    - docker pull postgres:9.6
    - docker run --name db -d postgres:9.6
    - sleep 5

    - docker build --pull -t test_image .
    - docker run --net=host test_image /bin/bash -c "coverage run --source='.' manage.py test --verbosity 2 && coverage html && coverage report"

  artifacts:
    paths:
      - htmlcov/
    expire_in: 5 days

Модифицированный .gitlab-ci.yml

image: docker:stable

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2
  CONTAINER_TEST_IMAGE: registry.gitlab.com/<my_repo>:$CI_COMMIT_REF_SLUG
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/<my_repo>:latest
  CONTAINER_DEVELOP_IMAGE: registry.gitlab.com/<my_repo>:develop
  POSTGRES_DB:<my_db_name>
  POSTGRES_USER:<my_user>
  POSTGRES_PASSWORD: <my_password>

services:
  - docker:dind
  - postgres:9.6


stages:
- test

test:
  stage: test
  script:
    - docker pull postgres:9.6
    - docker run --name db -d postgres:9.6
    - sleep 5

    - docker build --pull -t test_image .

    #here in DB_HOST I also tried 'db', '<my_db_name>' and couple of other options instead of 'localhost', the error is the same
    - docker run --net=host -e DB_HOST=localhost test_image /bin/bash -c "coverage run --source='.' manage.py test --verbosity 2 && coverage html && coverage report"

  artifacts:
    paths:
      - htmlcov/
    expire_in: 5 days

Мои settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '<my_db_name>',
        'USER': '<my_user>',
        'PASSWORD': '<my_password>',
        'HOST': 'db',
        'PORT': '',
        #yes, I tried port 5432 and 5432:5432, makes no difference
    }
}

Dockerfile

# Dockerfile
FROM python:3.6
MAINTAINER me

# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONUNBUFFERED 1

# install nginx
RUN apt-get update
RUN apt-get -y install nginx gettext-base libsasl2-dev libldap2-dev libssl-dev

#overwrite configuration files
COPY helper_functions/nginx_docker.template.conf /etc/nginx/nginx.template.conf
COPY helper_functions/nginx_docker.conf /etc/nginx/nginx.conf


WORKDIR /usr/src/app/
COPY requirements.txt /usr/src/app/
COPY . /usr/src/app

RUN pip install -r requirements.txt
RUN python setup.py install
RUN python manage.py collectstatic
#THIS LINE (MIGRATE) produces that "could not translate host name "db" to address" error!!!
RUN python manage.py migrate

# COPY startup script into known file location in container
COPY start_gunicorn.sh /start_gunicorn.sh

# EXPOSE port 8080 to allow communication to/from server
EXPOSE 8080

# CMD specifies the command to execute to start the server running.
CMD ["/start_gunicorn.sh"]

Опять же, все это работает с отдельными контейнерами докеров локально, и я верю в другом месте. Я думаю, что только тестовый конвейер с его gitalb-cy.yml нуждается в некоторых корректировках.

ОБНОВЛЕНИЕ В конце система была переработана таким образом, что все связанные с БД вещи (миграции, в основном) выполняются непосредственно из .gitlab-ci.yml вместо o из Dockerfile во время сборки,Это избавило от необходимости перетаскивать несколько переменных среды для БД, а другой файл настроек можно настроить только для тестов, проще из .gitlab-ci.yml.

...