withMaven НЕУСТАВЛЯЕМЫЙ результат сборки не сохраняется в декларативном конвейере Jenkins - PullRequest
0 голосов
/ 21 января 2020

Я хочу установить результат сборки на UNSTABLE, когда шаг сборки maven завершается из-за неудачных тестов. Я использую шаг сборки withMaven, который обеспечивает специальную обработку результатов теста maven: в случае неудачных тестов он устанавливает результат сборки на UNSTABLE, прежде чем выполнить шаг.

Это отлично работает при использовании скриптов трубопровод. Однако в случае декларативного конвейера результат сборки устанавливается на FAILURE.

. Это иллюстрируется следующими примерами кода.

Редактировать: Обратите внимание, что блоки try / catch и post не требуются для примера. Они присутствуют только для того, чтобы значение currentBuild.result могло быть проверено сразу после вызова withMaven.

Декларативное

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                withMaven() {
                    sh 'mvn clean verify' // -> Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
                }
            }

            post {
                always {
                    echo "CurrentResult: $currentBuild.currentResult" // -> FAILURE
                    echo "Result: $currentBuild.result"               // -> FAILURE
                                                                      // overall build result -> FAILURE
                }
            }
        }
    }
}

Сценарий

node() {
    stage('Build') {
        try {
            withMaven() {
                sh 'mvn clean verify'  // -> Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
            }
        } catch (e) {
            echo "CurrentResult: $currentBuild.currentResult" // -> UNSTABLE
            echo "Result: $currentBuild.result"               // -> UNSTABLE
                                                              // overall build result -> UNSTABLE
        }
    }
}

Как сохранить результат сборки UNSTABLE из шага сборки maven в декларативном конвейере?

Используемые версии: Jenkins 2.204.1, Плагин интеграции Pipeline Maven 3.8.2, Maven 3.6.3 (установлен на агенте сборки), AdoptOpenJDK 1.8.0_222.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Как заметил Фредерикус, разница - пойманное исключение. Если исключение не обнаружено в Jenkinsfile, то результат будет установлен на FAILED .

Я не эксперт, но я придумал чистый декларативный подход, который решает эту проблему взамен более загроможденного Jenkinsfile.

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                catchError(buildResult: null, catchInterruptions: false) {
                    withMaven() {
                        sh 'mvn clean verify' // -> Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
                    }
                }
            }

            post {
                always {
                    echo "CurrentResult: $currentBuild.currentResult" // -> UNSTABLE
                    echo "Result: $currentBuild.result"               // -> UNSTABLE
                }
            }
        }

        stage('Deploy') {
            when {
                expression {
                    currentBuild.result == "SUCCESS"
                }
            }
            steps {
                echo 'Deploy'
            }
        }
    }
}

Пояснение

catchError(buildResult: null, catchInterruptions: false)

buildResult: null, что эквивалентно buildResult: 'SUCCESS', не позволяет установить catchError buildResult для FAILURE , независимо от значения до.

catchInterruptions: false указывает catchError не перехватывать и не перезагружать определенные типы исключений, которые используются для прерывания потока выполнения для конвейеров .

"Недостатком" перехвата исключения является то, что выполняется текущий и все последующие stages. Чтобы пропустить этап в отношении результата, к этапам можно добавить декларацию when.

Вот как это выглядит на виде этапа

Stage View

0 голосов
/ 21 января 2020

Разница между вашими конвейерами в том, что вы использовали try / catch для скриптового. Что бы я сделал, это следующее

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                script {
                    try {
                        withMaven() {
                            sh 'mvn clean verify' // -> Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
                        }
                    } catch (e) {
                        echo "CurrentResult: $currentBuild.currentResult" // -> UNSTABLE
                        echo "Result: $currentBuild.result"               // -> UNSTABLE
                    }
                }
            }

            post {
                always {
                    echo "CurrentResult: $currentBuild.currentResult" // -> UNSTABLE
                    echo "Result: $currentBuild.result"               // -> UNSTABLE
                                                                      // overall build result -> UNSTABLE
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...