web-dev-qa-db-fra.com

Ignorer les échecs dans l'étape de construction du pipeline

Avec jenkins build flow plugin, cela était possible:

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

Comment faire cela avec la syntaxe Declarative Pipeline?

26
lenkovi

Pour ignorer une étape ayant échoué dans le pipeline déclaratif, vous avez essentiellement deux options:

  1. Utilisez script step et try-catch block (similaire à la proposition précédente de R_K mais dans un style déclaratif)
stage('someStage') {
    steps {
        script {
            try {
                build job: 'system-check-flow'
            } catch (err) {
                echo err
            }
        }
        echo currentBuild.result
    }
}
  1. Utilisez catchError
stage('someStage') {
    steps {
        catchError {
            build job: 'system-check-flow'
        }
        echo currentBuild.result
    }
}

Dans les deux cas, la construction ne sera pas abandonnée sauf exception dans build job: 'system-check-flow'. Dans les deux cas, l'étape echo (et toute autre action suivante) sera exécutée.

Mais il y a un différence importante entre ces deux options. Dans le premier cas, si la section try lève une exception, l’état général de la construction ne sera pas modifié (donc echo currentBuild.result => SUCCESS). Dans le second cas, votre construction globale échouera (donc echo currentBuild.result => FAILURE).

Ceci est important, car vous pouvez toujours échouer la construction globale dans le premier cas (en définissant currentBuild.result = 'FAILURE') mais vous ne pouvez pas réparer créez une deuxième option (currentBuild.result = 'SUCCESS' _ ne fonctionnera pas).

43
user1053510

En plus de simplement faire passer l'étape, il est maintenant également possible de faire échouer l'étape, mais de continuer le pipeline et de passer la construction:

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 vont s'exécuter, 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 cette fonctionnalité n'est disponible que depuis "Pipeline: étapes de base" 2.16 (14 mai 2019) . Avant cela, catchError est toujours disponible mais sans paramètres:

        steps {
            catchError {
                sh "exit 1"
            }
        }
8
Erik B

Je cherchais une réponse depuis longtemps et j'ai trouvé un hack pour ça! Je mets le bloc try/catch sur toute la scène:

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

En conséquence, vous obtiendrez quelque chose comme ceci: enter image description here

Ce n'est toujours pas idéal, mais cela donne les résultats nécessaires.

7
Stacy

Dans les versions récentes, il est possible de passer propogate=false option pour construire l’étape.

lien: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

exemple: build job:"jobName", propagate:false

5
Vano

Pour mon pipeline de décalcomanies, j'ai trouvé une autre solution:

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

Il en va de même pour la commande sh afin d’exécuter des scripts sur les plates-formes Unix.

L'exemple ignore l'état de retour, car Tomcat est peut-être déjà arrêté en raison d'une exécution de pipeline ayant échoué précédemment.

1
PowerStat

Dans le nouveau pipeline, vous pouvez utiliser try-catch pour y parvenir.

node{
   try{
      build job: 'system-check-flow'
   }    
   catch (err){
      echo "system-check-flow failed"
   }
   try{
      build job: 'job2'
   }    
   catch (err){
      echo "job2 failed"
   }
}

Ici, il créera le travail 'System-Check-Flow'. Si cela échoue, l'erreur sera détectée, ignorée, puis passera à la génération 'job2'

1
R_K