Как сделать так, чтобы сборка Jenkins завершилась сбоем, если модульные тесты Maven терпят неудачу?

Я использую Jenkins, Maven 3.1 и Java 1.6. У меня в Jenkins настроена следующая работа Maven со следующими целями и параметрами ...

clean install -U -P cloudbees -P qa

ниже моя верная конфигурация pom.xml ...

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.17</version>
        <configuration>
                <reuseForks>true</reuseForks>
                <argLine>-Xmx2048m -XX:MaxPermSize=512M </argLine>
                <skipTests>false</skipTests>
        </configuration>
</plugin>

Однако, когда мои модульные тесты терпят неудачу, в выводе консоли Jenkins по-прежнему написано «BUILD SUCCESS», и сборка помечается как «нестабильная» вместо полной неудачи. Как мне настроить что-то в Jenkins (или Maven, если так оно и есть), чтобы моя сборка завершилась сбоем (не стала нестабильной или успешной), если какой-либо из модульных тестов не прошел?

Ниже показано, что выводится на консоль.

17:08:04   MyProjectOrganizationControllerTest.testRecoverFromError » IllegalState Failed to...
17:08:04   MyProjectOrganizationControllerTest.testVerifyDistrictListPopulated » IllegalState
17:08:04   MyProjectOrganizationControllerTest.testUpdateSchool » IllegalState Failed to loa...
17:08:04   MyProjectOrganizationControllerTest.testDeleteSchool » IllegalState Failed to loa...
17:08:04   MyProjectOrganizationControllerTest.testVerifyOrgListPopulatedPrivateSchoolOrgType » IllegalState
17:08:04   MyProjectOrganizationControllerTest.testSubmitMultipleParams » IllegalState Faile...
17:08:04 
17:08:04 Tests run: 155, Failures: 0, Errors: 154, Skipped: 1
17:08:04 
17:08:04 [ERROR] There are test failures.
17:08:04 
17:08:04 Please refer to /scratch/jenkins/workspace/MyProject/MyProject/target/surefire-reports for the individual test results.
17:08:04 [JENKINS] Recording test results
17:08:07 log4j:WARN No appenders could be found for logger (org.apache.commons.beanutils.converters.BooleanConverter).
17:08:07 log4j:WARN Please initialize the log4j system properly.
17:08:14 [INFO] 
17:08:14 [INFO] --- maven-war-plugin:2.4:war (default-war) @ MyProject ---
17:08:15 [INFO] Packaging webapp
17:08:15 [INFO] Assembling webapp [MyProject] in [/scratch/jenkins/workspace/MyProject/MyProject/target/MyProject]
17:08:15 [INFO] Processing war project
17:08:15 [INFO] Copying webapp resources [/scratch/jenkins/workspace/MyProject/MyProject/src/main/webapp]
17:08:15 [INFO] Webapp assembled in [662 msecs]
17:08:15 [INFO] Building war: /scratch/jenkins/workspace/MyProject/MyProject/target/MyProject.war
17:08:20 [INFO] 
17:08:20 [INFO] --- maven-failsafe-plugin:2.17:integration-test (default) @ MyProject ---
17:08:20 [JENKINS] Recording test results
17:08:25 [INFO] 
17:08:25 [INFO] --- maven-failsafe-plugin:2.17:verify (default) @ MyProject ---
17:08:25 [INFO] Failsafe report directory: /scratch/jenkins/workspace/MyProject/MyProject/target/failsafe-reports
17:08:25 [JENKINS] Recording test results[INFO] 
17:08:25 [INFO] --- maven-install-plugin:2.4:install (default-install) @ MyProject ---
17:08:25 
17:08:25 [INFO] Installing /scratch/jenkins/workspace/MyProject/MyProject/target/MyProject.war to /home/jenkins/.m2/repository/org/mainco/subco/MyProject/76.0.0-SNAPSHOT/MyProject-76.0.0-SNAPSHOT.war
17:08:25 [INFO] Installing /scratch/jenkins/workspace/MyProject/MyProject/pom.xml to /home/jenkins/.m2/repository/org/mainco/subco/MyProject/76.0.0-SNAPSHOT/MyProject-76.0.0-SNAPSHOT.pom
17:08:26 Started calculate disk usage of build
17:08:26 Finished Calculation of disk usage of build in 0 seconds
17:08:26 Started calculate disk usage of workspace
17:08:26 Finished Calculation of disk usage of workspace in 0 seconds
17:08:26 [INFO] ------------------------------------------------------------------------
17:08:26 [INFO] BUILD SUCCESS
17:08:26 [INFO] ------------------------------------------------------------------------
17:08:26 [INFO] Total time: 11:00.616s
17:08:26 [INFO] Finished at: Mon Feb 23 17:08:26 UTC 2015
17:08:27 [INFO] Final Memory: 90M/414M
17:08:27 [INFO] ------------------------------------------------------------------------
17:08:27 Waiting for Jenkins to finish collecting data
17:08:28 [JENKINS] Archiving /scratch/jenkins/workspace/MyProject/MyProject/pom.xml to org.mainco.subco/MyProject/76.0.0-SNAPSHOT/MyProject-76.0.0-SNAPSHOT.pom
17:08:28 [JENKINS] Archiving /scratch/jenkins/workspace/MyProject/MyProject/target/MyProject.war to org.mainco.subco/MyProject/76.0.0-  SNAPSHOT/MyProject-76.0.0-SNAPSHOT.war
17:08:31 channel stopped
17:08:31 Started calculate disk usage of build
17:08:31 Finished Calculation of disk usage of build in 0 seconds
17:08:31 Started calculate disk usage of workspace
17:08:31 Finished Calculation of disk usage of workspace in 0 seconds
17:08:31 Finished: UNSTABLE

person Dave A    schedule 23.02.2015    source источник


Ответы (3)


Вы можете добавить -Dmaven.test.failure.ignore=false в MAVEN_OPTS, если нажмете кнопку «Дополнительно» в разделе «Сборка» своего задания Jenkins.

Для справки см. Параметры Подключаемый модуль Maven Surefire - surefire: test.

person Torsten    schedule 23.02.2015
comment
Но действительно ли мы должны указывать этот флаг как ложный? Насколько я понимаю, если мы не укажем этот плоский, то значение по умолчанию будет только FALSE. Пожалуйста, предложите. Спасибо! - person OverrockSTAR; 09.11.2015
comment
По умолчанию Дженкинс устанавливает для этого значения значение true. Взгляните на issues.jenkins-ci.org/browse/JENKINS-24655 - person Torsten; 09.11.2015
comment
Помните, что в документации говорится, что Его использование НЕ РЕКОМЕНДУЕТСЯ. - person Kai; 19.01.2017
comment
@Kai Для ясности, установка -Dmaven.test.failure.ignore = true - это то, что не рекомендуется на основании документации в вашей ссылке. Если Дженкинс устанавливает для него значение, которое не рекомендуется, то возвращение его к false соответствует духу предупреждения в документации. - person Meadowlark Bradsher; 25.01.2017
comment
Но это не показывает, какие тесты в пользовательском интерфейсе Jenkins завершились неудачно. - person vitro; 06.12.2019

Используйте подключаемый модуль Text Finder. Настройте поиск There are test failures и понизьте версию сборки до FAILED

person Slav    schedule 23.02.2015
comment
Хороший хак, но тем не менее хакерский. - person Alexey; 20.07.2016
comment
Я обнаружил, что это не только взлом, но и невозможность понизить для меня версию UNSTABLE до FAILED. Я подумал, что это может быть связано с задокументированным: реклассификация применяется только к сборкам, которые вернули нулевой общий статус выхода. - person bdeniker; 06.09.2016
comment
Для конвейеров Jenkins я нашел этот прием как единственное управляемое решение: запустить mvn с -Dmaven.test.failure.ignore=true в try-finally. В конце концов есть findText regexp: 'There are test failures', alsoCheckConsoleOutput: true, unstableIfFound: true и junit allowEmptyResults: true, testResults: 'target/surefire-reports/*.xml' - person Terran; 03.07.2019

Еще один полезный прием - использовать Groovy после сборки для проверки и установки результата теста.

например этот Groovy получает результат сборки, добавляет полезные вещи к описанию сборки и устанавливает для результата сборки значение НЕСТАБИЛЬНЫЙ в случае, если нет пройденных или неудачных попыток, но все тесты пропущены.

def currentBuild = Thread.currentThread().executable
// must be run groovy post-build action AFTER harvest junit xml  if you use junit xml test results
testResult1 = currentBuild.testResultAction

currentBuild.setDescription(currentBuild.getDescription() + "\n pass:"+testResult1.result.passCount.toString()+", fail:"+testResult1.result.failCount.toString()+", skip:"+testResult1.result.skipCount.toString())

// if no pass, no fail all skip then set result to unstable
if (testResult1.result.passCount == 0 && testResult1.result.failCount == 0 && testResult1.result.skipCount > 0) {
   currentBuild.result = hudson.model.Result.UNSTABLE
}

currentBuild.setDescription(currentBuild.getDescription() + "\n" + currentBuild.result.toString())

def ws = manager.build.workspace.getRemote()
myFile = new File(ws + "/VERSION.txt")
desc = myFile.readLines()
currentBuild.setDescription(currentBuild.getDescription() + "\n" + desc)
person gaoithe    schedule 31.08.2017