Django не может подключиться к базе данных postgres в gitlab ci - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть следующий .gitlab-ci.yml:

image: python:3.6

stages:
  - lint
  - test

services:
  - postgres:10.1-alpine

cache:
  paths:
  - /root/.local/share/virtualenvs/

before_script:
  - python -V
  - pip install pipenv
  - pipenv install --dev

lint:
  stage: lint
  script:
  - pipenv run pylint --output-format=text --load-plugins pylint_django project/ | tee pylint.txt
  - score=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' pylint.txt)
  - echo "Pylint score was $score"
  - pipenv run anybadge --value=$score --file=pylint.svg pylint
  artifacts:
    paths:
      - pylint.svg

test:
  stage: test
  script:
  - pipenv run python manage.py test

И я подключаюсь к базе данных так:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': 'db', # set in docker-compose.yml
        'PORT': 5432 # default postgres port
    }
}

Пока у меня есть только эти тесты в users/tests.py:

from .models import CustomUser
from django.test import TestCase

class LogInTest(TestCase):
    def setUp(self):
        self.credentials = {
            'username': 'testuser',
            'password': 'secret'}
        CustomUser.objects.create_user(**self.credentials)
    def testLogin(self):
        # send login data
        response = self.client.post('/users/login/', self.credentials, follow=True)
        # should be logged in now
        self.assertTrue(response.context['user'].is_authenticated)

, которая завершается со следующей ошибкой:

psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known 

В разработке я использую следующий файл docker-compose.yml:

version: '3.3'

services:
  db:
    image: postgres:10.1-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/

  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    environment:
      - SECRET_KEY=changemeinprod
    depends_on:
      - db

volumes:
  postgres_data:

С этим Dockerfile:

FROM python:3.6

# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /code

# Install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
COPY ./Pipfile /code/Pipfile
RUN pipenv install --deploy --system --skip-lock --dev

# Copy project
COPY . /code/

Я не понимаю, почему приложение не может подключиться к базе данных в CI, но просто отлично работает в ENV разработки с докером

1 Ответ

0 голосов
/ 03 ноября 2018

В вашем docker-compose.yml вы устанавливаете имя сервиса как db, а django settings.py для использования db, но в gitlab будет использовать имя изображения в качестве имени сервиса, postgres в случае.

У вас есть два варианта:

1 - использовать переменные окружения в settings.py, пример здесь

2 - Установите alias в gitlab-ci.yml, например:

services: - name: postgres:10.1-alpine alias: db ссылка: gitlab docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...