Как реализовать системный тест gradle, который выполняется после развертывания jenkins?

У меня есть проект gradle, созданный Дженкинсом в следующие шаги:

  1. Соберите проект, запустите юнит- и интеграционные тесты
  2. Создавайте и публикуйте образы докеров
  3. Развертывание приложения в пре-продакшене
  4. Запустите системные тесты на пре-продакшене
  5. Развертывание приложения в рабочей среде

Теперь шаг 4 еще не готов, и мне интересно, как это реализовать наиболее удобным способом..?

Я хочу использовать JUnit5, и тесты должны быть внутри самого проекта, поэтому либо в одном из модулей, либо с отдельным модулем, который также включен и имеет некоторые другие модули в качестве зависимостей.

Когда я создаю для него отдельный модуль с обычными тестами JUnit5, эти тесты автоматически выполняются на шаге 1. Итак, чего я хочу добиться, так это пользовательского шага градации для этих системных тестов.

"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
0
1 361
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошим способом сделать это было бы реализовать новую задачу gradle и новый исходный набор с тем же именем, например «systemTest». Вот пример кода для многомодульного проекта Gradle с простым системным тестом:

моя файловая иерархия:

├── application
│   ├── build.gradle
│   └── src
│       ├── main
│       │   └── java
│       │       └── de
│       │           └── mycompany
│       │               └── mydepartment
│       │                   └── projectname
│       │                       └── Application.java
│       └── test
│           └── java
│               └── de
│                   └── mycompany
│                       └── mydepartment
│                           └── projectname
│                               └── ApplicationTest.java
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── Jenkinsfile
├── settings.gradle
└── systemtests
    ├── build.gradle
    └── src
        └── systemTest
            └── java
                └── de
                    └── mycompany
                        └── mydepartment
                            └── projectname
                                └── SystemTest.java

Application.java содержит мою бизнес-логику (которая должна каким-то образом развернуть приложение в докере или что-то еще).

ApplicationTest.java — это модульный тест JUnit5, который будет выполняться в процессе сборки.

SystemTest.java — это тест JUnit5, предназначенный для запуска после развертывания. Мы можем сделать это (вручную или автоматически, если команда добавлена ​​в скрипт сборки) через ./gradlew systemTest.

Теперь давайте посмотрим на файлы gradle:

build.gradle (корень):

subprojects {
    apply plugin: 'java'

    repositories {
        maven {
            name 'Nexus-Internal Access'
            url 'http://m2repo.system.local/content/groups/full/'
        }
    }

    dependencies {
        testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.6.0'
        testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.6.0'
    }

    sourceSets {
        main {
            java { output.resourcesDir = outputDir }
        }
        test {
            java { output.resourcesDir = outputDir }
        }
    }

    test {
        useJUnitPlatform()
    }
}

settings.gradle(корень):

rootProject.name = 'service'

include 'application'
include 'systemtests'

приложение/build.gradle:

apply plugin: 'application'

application {
    mainClassName = 'de.mycompany.mydepartment.projectname.Application'
}

системные тесты/build.gradle:

configurations {
    systemTestImplementation.extendsFrom testImplementation
}

sourceSets {
    systemTest {
        java { output.resourcesDir = outputDir }
    }

    jar.duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

task systemTest(type: Test) {
    useJUnitPlatform()
    group = 'verification'
    testClassesDirs = sourceSets.systemTest.output.classesDirs
    classpath = sourceSets.systemTest.runtimeClasspath
}

Jenkinsfile (непроверенные фразы для вашего вдохновения):

#!groovy

node {
    stage("Build") {
        sh """
            ./gradlew clean build
        """
    }
    stage("Build docker containers") {
        sh """
            docker build application
        """
    }
    stage("Deploy to pre-prod") {
        sh """
            oc rollout application to testserver
        """
    }
    stage("System Tests") {
        sh """
            ./gradlew clean systemTest --info
        """
    }
    stage("Deploy to prod") {
        sh """
            oc rollout application to prod
        """
    }
}

Обратите внимание, что я использую --info в задаче /gradlew systemTest, чтобы я мог читать журналы, поступающие из системного теста в консоли Jenkins. Я также использую системные свойства, чтобы передать некоторые учетные данные из нашего Jenkins в gradle. с другим параметром -Pname=${var} для задачи systemTest. Здесь опущено, чтобы никто не запутался :)

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