Сборка конвейера Jenkins с использованием Jenkinsfile не завершается ошибкой

У меня есть декларативный этап конвейера, как показано ниже,

stage('build') {
    steps {
        echo currentBuild.result
        script {
                try {
                    bat 'ant -f xyz\\build.xml'
                } catch (err) {
                    echo "Caught: ${err}"
                    currentBuild.result = 'FAILURE'
                }
            }
        echo currentBuild.result
    }
}

Я ожидаю, что конвейер выйдет из строя, так как сборка завершается с ошибкой с сообщением ниже.

BUILD FAILED
C:\...\build.xml:8: The following error occurred while executing this line:
C:\...\build.xml:156: The following error occurred while executing this line:
C:\...\build.xml:111: Problem creating jar: C:\...\xyz.war (The system cannot find the path specified) (and the archive is probably corrupt but I could not delete it)

currentBuild.result имеет значение null, когда я его печатаю.
Является ли вызов муравья неправильным?
Почему статус возврата не перехватывается конвейером автоматически?
Может ли вызов муравья не возвращать статус «сбой»?

Я попробовал catchError вместо try..catch, но сбой сборки все равно не обнаружен.

catchError {
    bat 'ant -f xyz\\build.xml'
}

person user2891264    schedule 01.06.2017    source источник
comment
Похоже, муравей не передает ошибку в конвейер. Возможно, это может помочь stackoverflow.com/questions/22395597/.   -  person haschibaschi    schedule 02.06.2017
comment
Спасибо haschibaschi, страница в вашем комментарии дала мне несколько советов попробовать, а именно echo %ERRORLEVEL%. Я использовал его в одном из решений, перечисленных ниже в ответе.   -  person user2891264    schedule 02.06.2017


Ответы (1)


Решение состояло в том, чтобы добавить ключевое слово «вызов» к вызову муравья, как показано ниже, это распространяет код выхода из муравья в пакетный вызов.

stage('build') {
    steps {
        bat 'call ant -f xyz\\build.xml'
    }
}

Существует еще одно решение с использованием пакетного сценария, см. ниже,
Jenkinsfile.

stage('build') {
    steps {
        bat 'xyz\\build.bat'
    }
}

- build.bat

call ant -f "%CD%\xyz\build.xml"
echo ELVL: %ERRORLEVEL% 
IF NOT %ERRORLEVEL% == 0 ( 
    echo ABORT: %ERRORLEVEL%
    call exit /b %ERRORLEVEL%
) ELSE (
    echo PROCEED: %ERRORLEVEL%
)

В этом build.bat, если вы не используете ключевое слово call, будет выполнена только первая команда, а остальные будут проигнорированы. Я адаптировал это непосредственно к вызову муравья в конвейере, и это сработало.

person user2891264    schedule 02.06.2017