Запуск автотестов в Docker-контейнере
Усі статті, обговорення, новини про тестування — в одному місці. Підписуйтеся на DOU | QA!
Написание статьи мотивировано очередным релизом Java. Прочитав release notes, захотелось пересобрать проекты автотестов с новым JDK и пустить в работу.
Апгрейд Java — это не только изменения в коде, но и в инфраструктуре. Локальные правки никого не затронут, а с изменениями на CI сервере возможны нюансы, например, если CI сервер используется несколькими командами с множеством проектов и персональными требованиями к окружению.
Скорее всего, команды используют группы билд-агентов с разными конфигурациями, в таком случае, необходимо подготовить апгрейд для каждой. Если же используется один набор агентов, требуется согласовывать изменения и делать синхронный переход. Разумеется, возможен плавный процесс перехода. Оговаривается дедлайн, подымается пулл новых агентов рядом со старым и осуществляется переключение по мере готовности, но это влечет дополнительные расходы и время на менеджмент.
Запуская тесты в Docker контейнере, можно существенно упростить зависимость от инфраструктуры. В таком случае необходимы агенты с возможностью запуска Docker, а настройка окружения будет происходить при помощи разворачивания образа, собранного под нужды проекта. Рассмотрим, как легко произвести докеризацию запуска тестов на примере джобы, которая скачивает проект, запускает тесты и генерирует Allure Report.
Технологический стек — Java / Maven / TestNG с вариациями инструментов под проекты UI / API. В качестве CI сервера используем Jenkins с предустановленными Maven и JDK.
pipeline { agent any tools { maven 'my_maven' jdk 'my_jdk' } stages { stage('Checkout') { steps { git credentialsId: 'git_ssh', url: '[email protected]:your-company/cool-tests.git' } } stage('Run Tests') { steps { sh "mvn clean test -Dsuite=coolSuite.xml" } } } post { always { allure includeProperties: false, jdk: '', results: [[path: 'target/allure-results']] } } }
Java и Maven, необходимые для запуска таких тестов, легко докеризируются, а на dockerhub залиты готовые образы с разными конфигурациями. Также, можно лично собрать образ с требуемыми инструментами и хранить в private registry.
Идея в том, чтобы поднять контейнер с необходимым окружением, пробросить в него исходники, сделать прогон и получить артефакты для генерации отчетов. Такой подход можно реализовать при помощи Docker команд или Docker Pipeline плагина, который предлагает DSL для выполнения Docker операций в пайплайнах.
После перехода на запуск тестов внутри контейнера, пайплайн выглядит так:
pipeline { agent any stages { stage('Checkout') { steps { git credentialsId: 'git_ssh', url: '[email protected]:your-company/cool-tests.git' } } stage('Run Tests') { steps { script { docker.image("maven:3.6.3-openjdk-16-slim").inside { sh "mvn clean test -Dsuite=coolSuite.xml" } } } } } post { always { allure includeProperties: false, jdk: '', results: [[path: 'target/allure-results']] } } }
Что изменилось?
В tools
теперь нет необходимости, а maven
команда разместилась внутри inside
блока запуска контейнера.
docker.image("maven:3.6.3-openjdk-16-slim").inside { sh "mvn clean test -Dsuite=coolSuite.xml" }
Этот скрипт:
- скачает образ
maven:3.6.3-openjdk-16-slim
с hub.docker.com, если его нет в кэше; - запустит контейнер с пробросом workspace как volume;
- выполнит
sh
команду блокаinside
; - остановит и удалит контейнер по окончанию тестов.
Логи будут содержать:
docker inspect -f . maven:3.6.3-openjdk-16-slim $ docker run -t -d -u 0:0 -w /home/jenkins/workspace/my_job/ --volumes-from 4bb6ef21ba4ad9979ba12ff9b0560de39f9123ce0327af51df936a6f6a87df66 -e ******** -e ******** maven:3.6.3-openjdk-16-slim $ docker top 096b047b1954a7c4e53b8ac0b3404306b992b3ab4d46ecfe324124025e473792 -eo pid,comm mvn clean test -B -Dsuite=coolSuite.xml //logs produced by tests [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0 [INFO] BUILD SUCCESS $ docker stop --time=1 096b047b1954a7c4e53b8ac0b3404306b992b3ab4d46ecfe324124025e473792 $ docker rm -f 096b047b1954a7c4e53b8ac0b3404306b992b3ab4d46ecfe324124025e473792
По итогу, build steps будут работать как и раньше, за исключением того, что сам запуск и прогон тестов произойдет внутри контейнера с Java и Maven. Результаты появятся внутри workspace, после чего запустятся post conditions и сгенерируется отчет.
Таким образом, без кардинальных изменений, пайплайн приобретает гибкость в настройке окружения и независимость от инфраструктуры. При внесении изменений не потребуется пересоздавать и настраивать агенты, будет достаточно использовать новый Docker image.
2 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів