2016-09-29 2 views

ответ

2

Если mvn test не работает, он вернет ненулевой код выхода. В этом случае шаг sh выдает AbortException с «кодом возврата сценария X», в результате чего Трубопровод прекратит выполнение и будет отмечен как FAILURE.

Итак, вам нужно найти конфигурацию 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}.") 
} 
+0

Ваше решение не может работать, потому что, поскольку вы упоминаете, что выполнение 'mvn test' будет вызывать' AbortException', если он терпит неудачу, поэтому ваш тест 'exitCode' недостижим. – Pom12

+2

@ Pom12 Не используется флаг 'returnStatus'. Из документации: «Обычно сценарий, который выходит с ненулевым кодом состояния, приведет к тому, что шаг будет сбой с исключением. Если этот параметр [returnStatus] отмечен, возвращаемое значение этого шага будет вместо этого кодом статуса». –

+0

Я этого не знал, спасибо за подсказку, что хорошо знать :) – Pom12

1

следующих работ, но должна быть лучшим решением. Я довольно разочарован поддержкой конвейера до сих пор на 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 && testResult.failCount > 0) ? 'UNSTABLE' : 'FAILURE' 
    } 
} 
1

добиваюсь точно такое же поведение, используя junit шаг и возможность Maven -Dmaven.test.failure.ignore=true.

Вот пример из моего Jenkinsfile:

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 вариант сделать Maven возвращать 0, если тесты не удалось, вместо 1.

Если код возврата команды побежал с sh является отличается от 0, статус сборки установлен на FAILED, а сборка останавливается.

С помощью этой опции Maven возвращает 0, если тесты не пройдены, поэтому сборка переходит к следующему шагу.

junit затеняет архив результатов испытаний и устанавливает статус сборки UNSTABLE, если некоторые тесты не удались.

Смежные вопросы