Выполнение тестов Jenkins в контейнерах Docker, собранных из dockerfile в кодовой базе

Я хочу развернуть платформу непрерывной интеграции на основе Jenkins. Поскольку у меня есть различные виды проектов (PHP / Symfony, node, angular и т. Д.), И поскольку я хочу, чтобы эти тесты выполнялись как локально, так и на Jenkins, я подумывал об использовании контейнеров Dockers.

Процесс, к которому я стремлюсь:

  • Запрос на слияние открывается на Github / Gitlab
  • Webhook уведомляет Jenkins о запросе на слияние
  • Дженкинс тянет репо, строит контейнеры и запускает сценарий оболочки для выполнения тестов
  • После завершения испытаний Jenkins извлекает результаты из одного из контейнеров (через общий том) и обрабатывает результаты.

Я не хочу, чтобы Дженкинс был в контейнере.

С таким процессом я надеюсь, что смогу очень легко запустить тесты на каждой машине разработчика с чем-то вроде docker-composer up а затем в одном из контейнера ./tests all,

Я не очень знаком с Дженкинсом. Я прочитал много документации, но большинство из них предложили заранее определить подчиненных Jenkins для каждого типа проектов. Мне бы хотелось, чтобы все было как можно более динамичным и требовало как можно меньше настроек в Jenkins.

Буду признателен за описание вашего процесса тестирования, если вы когда-нибудь реализовывали нечто подобное. Если вы думаете, к чему я стремлюсь, невозможно, я также был бы признателен, если бы вы объяснили мне, почему.

1 ответ

Я предлагаю настроить Docker в Docker.

Основой является производное изображение Docker, которое расширяет образ jenkins:2.x путем добавления клиента командной строки Docker. Jenkins запускается как контейнер с его домашней папкой (папка, например, /var/jenkins_home, смонтированная с хоста Docker) и файлом сокета Docker, позволяющим запускать контейнеры Docker из заданий сборки Jenkins.

docker run -d --name jenkins -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock ... <yourDerivedJenkinsImage>

Чтобы проверить, работает ли эта настройка, просто выполните следующую команду после запуска контейнера Jenkins:

docker exec jenkins docker version

Если вывод "версия докера" НЕ показывает:

Демон docker работает на этом хосте?

Все в порядке.

В ваших работах по сборке вы можете настроить процесс, который вы упомянули выше. Пусть Дженкинс просто проверит хранилище. Репозиторий должен содержать ваши сценарии сборки и тестирования.

Используйте работу по фристайлу с использованием оболочки. Выполнение оболочки может выглядеть так:

docker run --rm --volumes-from jenkins <yourImageToBuildAndTestTheProject> bash $WORKSPACE/<pathToYourProjectWithinTheGitRepository>/build.sh 

Эта команда просто запускает новый контейнер (для сборки и / или тестирования вашего проекта) с томами от jenkins. Это означает, что клонированный репозиторий будет доступен в $WORKSPACE. Поэтому, если вы запустите "bash $ WORKSPACE //build.sh", ваш проект будет построен в контейнере "yourImageToBuildAndTestTheProject". После этого вы можете запустить другие контейнеры для интеграционных тестов или объединить их с "docker-compose", установив его в производный образ Jenkins.

Преимущества - минимальный доступ к конфигурации, который у вас есть в Jenkins - требуется только конфигурация SCM для клонирования репозитория GIT. Поскольку каждое задание Jenkins использует клиент Docker напрямую, вы можете использовать для каждого проекта один или образ Docker для создания и / или тестирования, БЕЗ дальнейшей настройки Jenkins.

Если вам нужна дополнительная настройка, например, ключи SSH или настройки Maven, просто поместите их на хост Docker и запустите контейнер Jenkins с дополнительными томами, которые содержат эти файлы конфигурации.

Используя эту опцию Docker при выполнении оболочки ваших заданий сборки:

--volumes-from jenkins

Автоматически добавляет рабочее пространство и файлы конфигурации для каждого из ваших заданий по сборке.

Другие вопросы по тегам