web-dev-qa-db-fra.com

Abandonner 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 (pas échouer) la construction si certaines conditions préalables ne sont pas remplies et qu’il n’ya pas de travail à faire. Comment puis-je faire ceci? Je sais que la variable currentBuild est disponible, mais je ne trouve pas la documentation correspondante.

39
tmlye

Vous pouvez marquer la construction comme étant ABORTED, puis utiliser l’étape error pour arrêter la construction:

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

Dans la vue de la scène, cela montrera que la construction s'est arrêtée à ce stade, mais que l'ensemble de la construction sera marqué comme abandonné plutôt qu'échoué (voir l'icône grise de la construction n ° 9):

Pipeline Stage View

76
Christopher Orr

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 par la vue d'étape suivante:

enter image description here

étape ratée

Si vous n'aimez pas l'étape en échec, vous devez utiliser return. Mais sachez que vous devez sauter chaque étape ou 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

erreur personnalisée comme indicateur

Vous pouvez également utiliser un message personnalisé à la place 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
}
9
CSchulz

Suite à cela documentation de Jenkins, vous devriez être capable de générer une erreur pour arrêter la construction et définir le résultat de la construction comme ceci:

currentBuild.result = 'ABORTED'

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

2
segalaj

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

Basé sur le bloc catchError, il exécutera un bloc post. Si le résultat de post tombe dans la catégorie d'échec, le bloc d'erreur sera exécuté pour arrêter les étapes à venir telles que Production, PréProd, 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'              
              }
        }
   }

}

1
ShreePrakash

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é.

1
Wim Rutgeerts