Выполнение тестов 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 /
Преимущества - минимальный доступ к конфигурации, который у вас есть в Jenkins - требуется только конфигурация SCM для клонирования репозитория GIT. Поскольку каждое задание Jenkins использует клиент Docker напрямую, вы можете использовать для каждого проекта один или образ Docker для создания и / или тестирования, БЕЗ дальнейшей настройки Jenkins.
Если вам нужна дополнительная настройка, например, ключи SSH или настройки Maven, просто поместите их на хост Docker и запустите контейнер Jenkins с дополнительными томами, которые содержат эти файлы конфигурации.
Используя эту опцию Docker при выполнении оболочки ваших заданий сборки:
--volumes-from jenkins
Автоматически добавляет рабочее пространство и файлы конфигурации для каждого из ваших заданий по сборке.