Практика Docker: знакомимся с docker-maven-plugin
Олег Накрайников рассказал, как запускать внешние зависимости в Docker для интеграционных тестов в spring-boot-проекте.
Фото: Bloomberg / Getty Images
Запускать интеграционные тесты можно по-разному, но в работе я ориентируюсь на следующие требования:
- способ должен позволять запускать тесты и локально, и на CI;
- развёртывание зависимостей не должно чрезмерно увеличивать время сборки;
- не должно возникать проблем с поиском сборок зависимостей (баз данных, брокеров и так далее).
Поэтому я использую maven — это фреймворк для автоматизации сборки проектов от Apache, в котором структура проекта описывается на подмножестве XML, языке POM. Далее расскажу, как запускать интеграционные тесты с его помощью, и поделюсь конфигурациями плагинов.
Как запустить интеграционный тест в maven
Интеграционные тесты в maven запускаются одной строкой:
Теперь настроим maven. Если прописать свойство docker_host, то сборщик активирует профиль IT:
Профиль включает плагины maven-failsafe-plugin и docker-maven-plugin.
Первый необходим для запуска самих тестов:
А второй — как раз для запуска зависимостей в контейнерах Docker:
В конфигурации docker-maven-plugin необходимо указать образы нужных нам зависимостей:
Также укажем, что перед проведением тестов контейнеры нужно собрать и запустить, а по завершении — остановить и удалить:
Зачем нужно свойство docker_host
В docker_host указывается адрес, по которому расположен docker engine — на нём плагин и будет работать с контейнерами. Данное свойство позволит запускать интеграционные тесты как локально на машине разработчика, так и на CI.
Статья написана на основе треда Олега в Twitter.
Всё чаще в современных CI воркеры разворачиваются в виде docker-контейнеров. Поэтому для сборки нашего проекта необходимо развернуть два контейнера: maven и Docker in Docker (dind). В maven собирается проект и запускаются интеграционные тесты, а в dind — контейнеры с зависимостями. Адрес dind-контейнера как раз указывается в свойстве docker_host.
Что сделать, чтобы тесты добрались до зависимостей?
Через плагин maven-failsafe-plugin устанавливаем переменные окружения и прописываем настройки в application.yml:
Здесь on-profile: tests-local нужен для запуска тестов из IDE, а on-profile: tests-remote — через maven.
Чтобы писать и запускать тесты из IDE, придётся поднять зависимости вручную двумя командами:
Изложенный подход обладает следующими преимуществами:
- Вы сможете запускать тесты и локально, и на CI.
- Контейнеры будут создаваться только перед тестами и удаляться сразу после их окончания.
- Через docker-maven-plugin можно строить достаточно сложное окружение с множеством контейнеров и сетью между ними.
Пример проекта, собранного с помощью docker-maven-plugin, можно посмотреть в моём GitHub-репозитории, а почитать документацию к плагину — здесь.