У меня есть проект gradle, созданный Дженкинсом в следующие шаги:
Теперь шаг 4 еще не готов, и мне интересно, как это реализовать наиболее удобным способом..?
Я хочу использовать JUnit5, и тесты должны быть внутри самого проекта, поэтому либо в одном из модулей, либо с отдельным модулем, который также включен и имеет некоторые другие модули в качестве зависимостей.
Когда я создаю для него отдельный модуль с обычными тестами JUnit5, эти тесты автоматически выполняются на шаге 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. Здесь опущено, чтобы никто не запутался :)