#jenkins #jenkins-pipeline
#дженкинс #дженкинс-конвейер
Вопрос:
Я хочу получить «НЕСТАБИЛЬНУЮ» сборку вместо
//currentBuild.result='UNSTABLE'
stage 'Publish Reports'
allowMissing: false
])
}
может ли кто-нибудь дать мне решение.
Ответ №1:
В случае mvn test
сбоя он вернет ненулевой код выхода. В этом случае на sh
шаге выдается сообщение AbortException
с «сценарий вернул код выхода X», в результате чего конвейер прекращает выполнение и помечается как СБОЙ.
Итак, вам нужно найти конфигурацию Maven, которая возвращает код выхода 0
, даже если есть ошибки тестирования. Затем конвейер будет продолжен, и вы сможете проанализировать результаты тестирования.
Или вы можете проверить код выхода самостоятельно, например, предполагая, что Maven возвращает код выхода 123
для обозначения сбоев тестирования:
// Attempt to execute the tests
int exitCode = sh script: 'mvn test', returnStatus: true
// Check whether testing succeeded, or a known failure code was returned
if (exitCode == 0 || exitCode == 123) {
// Attempt to parse the test results, if they exist
junit '**/test-results-dir/TEST-*.xml'
// At this point, the pipeline will have been marked as 'UNSTABLE',
// assuming that parsing the results found at least one test failure
} else {
// Something unexpected happened (e.g. compile failure); stop pipeline.
// This will cause the pipeline to be marked as 'FAILURE'
error("Testing failed with exit code ${exitCode}.")
}
Комментарии:
1. Ваше решение не может работать, потому что, как вы упомянули, выполнение
mvn test
приведетAbortException
к сбою, если оно завершится неудачей, поэтому вашexitCode
тест недоступен.2. @Pom12 Нет, если вы используете
returnStatus
флаг. Из документации: «Обычно сценарий, который завершается с ненулевым кодом состояния, приведет к сбою шага с исключением. Если этот параметр [returnStatus] установлен, возвращаемым значением шага вместо этого будет код состояния «.3. Я этого не знал, спасибо за совет, который полезно знать 🙂
Ответ №2:
Я добиваюсь точно такого же поведения, используя junit
шаг и опцию Maven -Dmaven.test.failure.ignore=true
.
Вот пример из моего файла Jenkins :
stage('Build') {
...
// Run Maven build and don't fail on errors
withMaven(
maven: 'Maven3',
mavenSettingsConfig: 'provided-config-file') {
sh "mvn clean install -Dmaven.test.failure.ignore=true"
}
// publish test results
junit '**/target/surefire-reports/*.xml'
}
-Dmaven.test.failure.ignore=true
Опция make Maven возвращает 0, если тесты завершились неудачно, вместо 1.
Если код возврата команды, запущенной с sh
, отличается от 0, статус сборки устанавливается FAILED
равным и сборка останавливается.
С помощью этого параметра Maven возвращает 0, если тесты завершились неудачно, поэтому сборка переходит к следующему шагу.
junit
Шаг архивирует результаты тестов и устанавливает статус сборки UNSTABLE
, если некоторые тесты завершились неудачей.
Ответ №3:
Следующее работает, но должно быть лучшее решение. Я очень разочарован поддержкой конвейера на данный момент в Jenkins 2.19.2, он выглядит немного недоделанным.
def runTests() {
setTestStatus(sh (returnStatus: true, script: 'mvn clean test'))
}
@NonCPS
def setTestStatus(testStatus) {
if (testStatus == 0) {
currentBuild.result = 'SUCCESS'
} else {
def testResult = currentBuild.rawBuild.getAction(hudson.tasks.junit.TestResultAction.class)
currentBuild.result = (testResult != null amp;amp; testResult.failCount > 0) ? 'UNSTABLE' : 'FAILURE'
}
}
Ответ №4:
Вы пробовали использовать этот флаг?
-DtestFailureIgnore=true