Игнорировать неудачу в шаге построения трубопровода
С помощью jenkins build flow plugin это было возможно:
ignore(FAILURE){
build( "system-check-flow" )
}
Как это сделать с помощью синтаксиса Declarative Pipeline?
Ответы
Ответ 1
Чтобы игнорировать неудачный шаг в декларативном конвейере, у вас в основном есть два варианта:
- Используйте
script
шаг и блок try-catch
(аналогично предыдущему предложению R_K, но в декларативном стиле)
stage('someStage') {
steps {
script {
try {
build job: 'system-check-flow'
} catch (err) {
echo err
}
}
echo currentBuild.result
}
}
- Использовать
catchError
stage('someStage') {
steps {
catchError {
build job: 'system-check-flow'
}
echo currentBuild.result
}
}
В обоих случаях сборка не будет прервана после исключения в build job: 'system-check-flow'
. В обоих случаях будет выполнен шаг echo
(и любой другой следующий).
Но есть одно важное различие между этими двумя вариантами. В первом случае, если try
раздела вызывает исключение статус общей сборки не будет изменена (так echo currentBuild.result
=> SUCCESS
). Во втором случае вы полностью echo currentBuild.result
ошибку (так что echo currentBuild.result
=> FAILURE
).
Это важно, потому что вы всегда можете currentBuild.result = 'FAILURE'
общую сборку в первом случае (установив currentBuild.result = 'FAILURE'
), но вы не можете восстановить сборку во втором варианте (currentBuild.result = 'SUCCESS'
не будет работать).
Ответ 2
Помимо простого прохождения этапа, теперь также можно провалить этап, но продолжить конвейер и передать сборку:
pipeline {
agent any
stages {
stage('1') {
steps {
sh 'exit 0'
}
}
stage('2') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "exit 1"
}
}
}
stage('3') {
steps {
sh 'exit 0'
}
}
}
}
В приведенном выше примере все этапы будут выполнены, конвейер будет успешным, но этап 2 будет отображаться как сбойный:
Как вы уже догадались, вы можете свободно выбирать buildResult
и stageResult
, если вы хотите, чтобы он был нестабильным или что-то еще. Вы даже можете не выполнить сборку и продолжить выполнение конвейера.
Просто убедитесь, что ваш Jenkins обновлен, поскольку эта функция доступна только после "Конвейер: основные действия" 2.16 (14 мая 2019 г.). До этого catchError
все еще доступен, но без параметров:
steps {
catchError {
sh "exit 1"
}
}
Ответ 3
Я долго искал ответ и нашел для него взлом! Я помещаю блок try/catch на всю сцену:
try {
stage('some-stage') {
//do something
}
} catch (Exception e) {
echo "Stage failed, but we continue"
}
try {
stage("some-other-stage") { // do something }
} catch (Exception e) {
echo "Stage failed, but we still continue"
}
В результате вы получите что-то вроде этого:
Это все еще не идеально, но дает необходимые результаты.
Ответ 4
В последних версиях можно пропустить параметр propogate=false
для этапа сборки.
ссылка: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
пример: build job:"jobName", propagate:false
Ответ 5
В новом конвейере вы можете использовать try-catch для достижения этого.
node{
try{
build job: 'system-check-flow'
}
catch (err){
echo "system-check-flow failed"
}
try{
build job: 'job2'
}
catch (err){
echo "job2 failed"
}
}
Здесь он построит задание "проверка системы". Если он терпит неудачу, он поймает ошибку, проигнорирует, а затем перейдет к созданию 'job2'
Ответ 6
Для моего декалярного конвейера я нашел другое решение:
stage('Deploy test')
{
steps
{
bat returnStatus: true, script: 'sc stop Tomcat9'
// The return value of the step will be the status code!
// evaluate return status yourself, or ignore it
}
}
То же самое работает для команды sh для выполнения скриптов на платформах Unix.
В этом примере игнорируется возвращаемое состояние, потому что кот может быть уже остановлен из-за ранее неудачного запуска конвейера.