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

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

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

Затем я попытался настроить свой файл 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: // docker: 2375 - он работает? Если он находится в нестандартном месте, укажите URL-адрес с помощью переменной среды DOCKER_HOST.

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

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

0
задан 8 October 2019 в 16:04
1 ответ

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

  • Во-первых, 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

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

0
ответ дан 5 December 2019 в 00:28

Теги

Похожие вопросы