нестабильная сборка с нестабильной с

#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