Annual Open Tech Conference - ISsoft Insights 2021. June 19. Learn more.
×Закрыть

Запуск автотестов в Docker-контейнере

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Написание статьи мотивировано очередным релизом 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: 'git@github.com: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: 'git@github.com: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.

👍НравитсяПонравилось8
В избранноеВ избранном4
Подписаться на автора
LinkedIn

Похожие статьи

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

дякую! Як раз розбирався, як написати пайплайн для своїхтестів з алюр

интересная статья, немного поверхностно, пили еще!

Подписаться на комментарии