71 votes

Annuler la construction actuelle du pipeline à Jenkins

J'ai un pipeline Jenkins qui comporte plusieurs étapes, par exemple:

 node("nodename") {
  stage("Checkout") {
    git ....
  }
  stage("Check Preconditions") {
    ...
    if(!continueBuild) {
      // What do I put here? currentBuild.xxx ?
    }
  }
  stage("Do a lot of work") {
    ....
  }
}
 

Je veux pouvoir annuler (ne pas échouer) la construction si certaines conditions préalables ne sont pas remplies et qu'il n'y a pas de travail réel à faire. Comment puis-je faire ceci? Je sais que la variable currentBuild est disponible, mais je ne trouve pas la documentation la concernant.

133voto

Christopher Orr Points 58514

Vous pouvez marquer les construire comme ABANDONNÉ, et ensuite utiliser l' error étape pour provoquer la génération d'arrêt:

if (!continueBuild) {
    currentBuild.result = 'ABORTED'
    error('Stopping early…')
}

Dans la Vue de la Scène, ce sera montrer que la construction s'est arrêté à ce stade, mais la construire ensemble sera marqué comme abandonnée, plutôt que d'échec (voir l'icône de couleur grise pour construire n ° 9):

Pipeline Stage View

17voto

CSchulz Points 2374

Après quelques tests j'ai trouvé la solution suivante:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build to prevent a loop.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'ABORTED'
    echo('Skipping mail notification')
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Cela se traduira dans l'étape suivante de la vue:

enter image description here

échec de la scène

Si vous n'aimez pas l'échec de l'étape, vous devez utiliser le retour. Mais sachez que vous avez à sauter chaque étape ou l'emballage.

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      return
    }
  }
  if (autoCancelled) {
    error('Aborting the build to prevent a loop.')
    // return would be also possible but you have to be sure to quit all stages and wrapper properly
    // return
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'ABORTED'
    echo('Skipping mail notification')
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Le résultat:

enter image description here

d'erreur personnalisé comme indicateur

Vous pouvez également utiliser un message personnalisé au lieu d'une variable locale:

final autoCancelledError = 'autoCancelled'

try {
  stage('checkout') {
    ...
    if (your condition) {
      echo('Aborting the build to prevent a loop.')
      error(autoCancelledError)
    }
  }
} catch (e) {
  if (e.message == autoCancelledError) {
    currentBuild.result = 'ABORTED'
    echo('Skipping mail notification')
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

2voto

segalaj Points 376

En suivant cette documentation de Jenkins, vous devriez pouvoir générer une erreur pour arrêter la génération et définir le résultat de la construction comme ceci:

currentBuild.result = 'ABORTED'

J'espère que ça t'as aidé.

2voto

ShreePrakash Points 247

J'ai géré de manière déclarative comme indiqué ci-dessous:

Basé sur le bloc catchError, il exécutera le bloc post. Si le résultat du post tombe dans la catégorie d'échec, le bloc d'erreur sera exécuté pour arrêter les étapes à venir comme la production, PreProd, etc.

 pipeline {

agent any

stages{
    stage('Build') {
        steps{
             catchError {
                sh 'sudo bash path/To/Filename.sh'
               }
         }
         post {
            success {
                echo 'Build stage successful'
            }
            failure {
                echo 'Compile stage failed'
                error('Build is aborted due to failure of build stage')

             }
    }
   }
  stage ('Production'){
        steps {
                sh 'sudo bash path/To/Filename.sh'              
              }
        }
   }
 

}

1voto

Wim Rutgeerts Points 39

La chose que nous utilisons est:

 try {
 input 'Do you want to abort?'
} catch (Exception err) {
 currentBuild.result = 'ABORTED';
 return;
}
 

Le "retour" à la fin s'assure qu'aucun autre code n'est exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X