Назад | Перейти на главную страницу

Настройте gitlab-ci.yml для запуска pytest в контейнере докеров на Gitlab CI

У меня есть проект django Cookiecutter, который использует Docker. Я пишу свои тесты, используя pytest и я запускаю свои тесты, используя docker-compose -f local.yml run django pytest. Мой local.yml файл находится в моем корневом каталоге (где manage.py)

Я хочу запускать эти тесты автоматически с помощью Gitlab CI. Для этого я настроил свой собственный сервер gitlab, установил и настроил бегунов. В качестве исполнителя использую докер.

Затем я попытался настроить свой gitlab-ci.yml файл, но я не совсем уверен, как это сделать правильно. Вот что у меня есть на данный момент:

image: docker

services:
 - docker:dind

stages:
 - test

tests-website:
 stage: test
 before_script:
   - apk update
   - apk upgrade
   - apk add python python-dev py-pip build-base libffi-dev openssl-dev libgcc
   - pip install docker-compose
 script:
   - docker-compose -f local.yml build
   - docker-compose -f local.yml run django pytest

 tags:
   - docker

Мой конвейер работает нормально, пока docker-compose -f local.yml build. Тогда я получаю

не удалось подключиться к демону Docker в http: // докер: 2375 - он работает? Если он находится в нестандартном месте, укажите URL-адрес в переменной среды DOCKER_HOST.

Я предполагаю, что это вводящая в заблуждение ошибка, так как я немного пытаюсь понять, как я могу выполнить свой файл local.yml. Или как я могу запустить свои тесты в конвейере. Может быть, мне нужно сделать еще несколько конфигураций, чтобы запустить тесты? Или может быть то, что у меня до сих пор совершенно не так? Я не уверена...

Может ли кто-нибудь помочь мне с этим? Помощь очень ценится! Большое спасибо заранее!

Есть две потенциальные проблемы:

  • Во-первых, docker: dind требует привилегированного режима
  • Во-вторых, начиная с версии 19.03 docker: dind слушает сокет TLS только по умолчанию (порт 2376).
/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::2376                 :::*                    LISTEN      1/dockerd

Таким образом, вы можете выбрать использование аутентификации TLS и каким-то образом передать сертификат внутри клиентского контейнера или отключить TLS, выполнив что-то подобное:

tests-website:
 stage: test
 variables:
  DOCKER_TLS_CERTDIR: ""
 before_script:
   - apk update
   - apk upgrade
...

Затем он деградирует до простого TCP (порт 2375)

/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::2375                 :::*                    LISTEN      1/dockerd

Что меня интересует, если вы не используете кубернеты или что-то подобное для выполнения своих заданий (я имею в виду простой докер), то почему бы просто не использовать оболочку runner и не поговорить с докером через сокет unix, доступный на этой машине? Если это не вариант, вы можете просто передать сокет докера машины внутрь контейнера клиента, используя средства монтирования, а не запускать дополнительный экземпляр сервера докеров.