Продолжить трубопровод Дженкинса после неудачной стадии

У меня есть ряд этапов, которые выполняют быстрые проверки. Я хочу выполнить их все, даже если есть сбои. Например:

stage('one') {
    node {
        sh 'exit 0'
    }
}
stage('two') {
    node {
        sh 'exit 1'   // failure
    }
}
stage('three') {
    node {
        sh 'exit 0'
    }
}

Этап two выходит из строя, поэтому на этапе по умолчанию three не выполняются.

Обычно это была бы parallel, но я хочу отобразить их в виде сцены. В макете ниже:

  • Сборка № 4 показывает, что обычно происходит. Работа two не удается, так что three не работает.
  • Я сделал фотошоп Build # 6, чтобы показать то, что я хотел бы увидеть. Задание two не выполняется и отображается как таковое, но three все еще выполняется. Настоящий Дженкинс, вероятно, будет отображать весь Build # 6 с оттенком красного цвета, что, конечно, хорошо.

Mock up of desired Stage View result

Ответ 1

Теперь это возможно. Ниже приведен пример декларативного конвейера, но catchError работает и для скриптовых конвейеров.

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 г.)

Ответ 2

У меня была такая же проблема, я смог решить это, сделав это.

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

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    ....

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}

Ответ 3

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

def indexes = ['one', 'two', 'three']

node() {
    for (index in indexes) {
        catchError {
            stage(index) {
                println index
                sh '''echo "123"'''
            }
        }
    }
}

Ответ 4

использование

распространять: ложь

флаг, чтобы перейти к следующему этапу, когда предыдущий этап не удается

пример:

stage('<stage-name>'){
    node('<node-name>'){
        build job: '<job-name>', propagate: false
    }
}

stage('<stage-name>'){
    node('<node-name>'){
        build job: '<job-name>'
    }
}

Ответ 5

Это зависит от того, используете ли вы декларативный конвейерный синтаксис или скриптовый конвейерный синтаксис.

Синтаксис декларативного конвейера:

pipeline {
    agent any
    stages {
        stage('one') {
            steps {
                sh 'exit 0'
            }
        }
        stage('two') {
            steps {
                sh 'exit 1'   // failure
            }
        }
    }
    post {
        always {
            sh 'exit 0'
        }
    }
}

Блоки постусловия содержат шаги, аналогичные разделу шагов.

Синтаксис скриптового конвейера:

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}