web-dev-qa-db-fra.com

Arrêtez tôt un travail sur le pipeline Jenkins

Dans notre travail Jenkins Pipeline, nous avons quelques étapes, et ce que j'aimerais, c'est si l'une des étapes échoue, alors arrêter la construction et ne pas continuer vers les étapes suivantes.

Voici un exemple d'une des étapes:

stage('Building') {
    def result = sh returnStatus: true, script: './build.sh'
    if (result != 0) {
        echo '[FAILURE] Failed to build'
        currentBuild.result = 'FAILURE'
    }
}

Le script échouera et le résultat de la construction sera mis à jour, mais le travail se poursuivra aux étapes suivantes. Comment puis-je abandonner ou interrompre le travail lorsque cela se produit?

13
Ian Spence

Fondamentalement, c'est ce que fait l'étape sh. Si vous ne capturez pas le résultat dans une variable, vous pouvez simplement exécuter:

sh "./build"

Cela se fermera si le script contient un code de sortie différent de zéro.

Si vous devez d'abord effectuer des tâches et capturer le résultat, vous pouvez utiliser une étape Shell pour quitter le travail

stage('Building') {
    def result = sh returnStatus: true, script: './build.sh'
    if (result != 0) {
        echo '[FAILURE] Failed to build'
        currentBuild.result = 'FAILURE'
        // do more stuff here

        // this will terminate the job if result is non-zero
        // You don't even have to set the result to FAILURE by hand
        sh "exit ${result}"  
    }
}

Mais ce qui suit vous donnera la même chose, mais semble plus sensé à faire

stage('Building') {
    try { 
         sh './build.sh'
    } finally {
        echo '[FAILURE] Failed to build'
    }
}

Il est également possible d'appeler le retour dans votre code. Cependant, si vous êtes dans un stage, il ne sortira que de cette étape. Alors

stage('Building') {
   def result = sh returnStatus: true, script: './build.sh'
   if (result != 0) {
      echo '[FAILURE] Failed to build'
      currentBuild.result = 'FAILURE'
      return
   }
   echo "This will not be displayed"
}
echo "The build will continue executing from here"

ne quittera pas le travail, mais

stage('Building') {
   def result = sh returnStatus: true, script: './build.sh'
}
if (result != 0) {
  echo '[FAILURE] Failed to build'
  currentBuild.result = 'FAILURE'
  return
}

volonté.

11
Rik

Une autre façon d'obtenir ce comportement consiste à lever une exception. En fait, c'est exactement ce que Jenkins fait. De cette façon, vous pouvez également définir l'état de la génération sur ABORTED ou FAILURE. Cet exemple abandonne la génération:

stage('Building') {
    currentBuild.rawBuild.result = Result.ABORTED
    throw new hudson.AbortException('Guess what!')
    echo 'Further code will not be executed'
}

Sortie:

[Pipeline] stage
[Pipeline] { (Building)
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
ERROR: Guess what!
Finished: ABORTED
8
Jazzschmidt

Depuis Jenkins v2, cela devrait également fonctionner

error('Failed to build')

Le travail se terminera par:

ERROR: Failed to build
Finished: ERROR
2
sobi