web-dev-qa-db-fra.com

Continuer le pipeline Jenkins après l'échec

J'ai une série d'étapes qui effectuent des vérifications rapides. Je veux toutes les exécuter, même s'il y a des échecs. Par exemple:

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

L'étape two échoue, donc l'étape three par défaut n'est pas exécutée.

Normalement, ce serait un travail pour parallel, mais je souhaite les afficher dans la vue de la scène. Dans la maquette ci-dessous:

  • La construction n ° 4 montre ce qui se passe normalement. La tâche two échoue et three ne s'exécute pas.
  • Je Photoshopped Build # 6 pour montrer ce que j'aimerais voir. Le travail two échoue et est affiché comme tel, mais three est toujours exécuté. Le vrai Jenkins afficherait probablement toute la compilation n ° 6 légèrement teintée de rouge, ce qui est bien sûr parfait.

Mock up of desired Stage View result

29
John McGehee

C'est maintenant possible. Vous trouverez ci-dessous un exemple de pipeline déclaratif, mais catchError fonctionne également pour les pipelines scriptés.

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'
            }
        }
    }
}

Dans l'exemple ci-dessus, toutes les étapes seront exécutées, le pipeline réussira, mais l'étape 2 s'affichera comme ayant échoué:

Pipeline Example

Comme vous l'avez peut-être deviné, vous pouvez choisir librement le buildResult et le stageResult, au cas où vous voudriez qu'il soit instable ou autre. Vous pouvez même échouer à la construction et continuer l'exécution du pipeline.

Assurez-vous simplement que votre Jenkins est à jour, car il s'agit d'une fonctionnalité relativement nouvelle.

EDIT: Vous avez besoin de "Pipeline: étapes de base" 2.16 (14 mai 2019)

17
Erik B

J'avais le même souci, j'ai pu le résoudre en procédant de la sorte.

La deuxième étape sera indiquée en rouge et marquée comme ayant échoué. Le reste des étapes continuera à fonctionner Vous pouvez définir un indicateur et, à la fin des étapes, en vérifiant cet indicateur, vous pouvez indiquer le statut de la construction entière.

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"
    }
}
8
Pablo DC

Cela devrait marcher. Cependant, toutes les cases sont rouges si une seule échoue, mais vous pouvez voir les cases avec une erreur marquée, vous permettant ainsi de distinguer facilement les tâches ayant échoué.

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

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

Utilisation

propager: faux

flag pour passer à l’étape suivante lorsque l’étape précédente échoue.

exemple:

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

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

Cela dépend si vous utilisez syntaxe de pipeline déclarative ou syntaxe de pipeline scriptée .

syntaxe déclarative du pipeline :

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

Les blocs de post-condition contiennent étapes identiques à la section étapes .

syntaxe de pipeline scriptée :

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"
    }
}
2
Dirk

J'ai résolu le problème en utilisant les actions postées: https://jenkins.io/doc/pipeline/tour/post/

           post {
            always {
                ...
            }
           }
1
Frank Escobar