Игнорировать неудачу в шаге построения трубопровода

С помощью jenkins build flow plugin это было возможно:

ignore(FAILURE){
    build( "system-check-flow" )
}

Как это сделать с помощью синтаксиса Declarative Pipeline?

Ответ 1

Чтобы игнорировать неудачный шаг в декларативном конвейере, у вас в основном есть два варианта:

  1. Используйте script шаг и блок try-catch (аналогично предыдущему предложению R_K, но в декларативном стиле)
stage('someStage') {
    steps {
        script {
            try {
                build job: 'system-check-flow'
            } catch (err) {
                echo err
            }
        }
        echo currentBuild.result
    }
}
  1. Использовать 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 будет отображаться как сбойный:

Pipeline Example

Как вы уже догадались, вы можете свободно выбирать 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"
 }

В результате вы получите что-то вроде этого: enter image description here

Это все еще не идеально, но дает необходимые результаты.

Ответ 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.

В этом примере игнорируется возвращаемое состояние, потому что кот может быть уже остановлен из-за ранее неудачного запуска конвейера.