83 votes

Afficher une étape de pipeline Jenkins comme ayant échoué sans échouer tout le travail

Voici le code avec lequel je joue

 node {
    stage 'build'
    echo 'build'

    stage 'tests'
    echo 'tests'

    stage 'end-to-end-tests'
    def e2e = build job:'end-to-end-tests', propagate: false
    result = e2e.result
    if (result.equals("SUCCESS")) {
        stage 'deploy'
        build 'deploy'
    } else {
        ?????? I want to just fail this stage
    }
}
 

Est-il possible pour moi de marquer l'échec de l'étape 'tests de bout en bout' sans échouer tout le travail? Propager faux marque toujours la scène comme vraie, ce qui n'est pas ce que je veux, mais propager vrai marque le travail comme ayant échoué, ce que je ne veux pas non plus.

27voto

vaza Points 181

Stage prend un bloc maintenant, alors enveloppez-le dans try-catch. La prise d'essai à l'intérieur de la scène la fait réussir.

La nouvelle fonctionnalité mentionnée plus tôt sera plus puissante. Pendant ce temps:

 try {
   stage('end-to-end-tests') {
     node {      
       def e2e = build job:'end-to-end-tests', propagate: false
       result = e2e.result
       if (result.equals("SUCCESS")) {
       } else {
          sh "exit 1" // this fails the stage
       }
     }
   }
} catch (e) {
   result = "FAIL" // make sure other exceptions are recorded as failure too
}

stage('deploy') {
   if (result.equals("SUCCESS")) {
      build 'deploy'
   } else {
      echo "Cannot deploy without successful build" // it is important to have a deploy stage even here for the current visualization
   }
}
 

14voto

Jesse Glick Points 3877

Cela ressemble à JENKINS-26522 . Actuellement, le mieux que vous puissiez faire est de définir un résultat global:

 if (result.equals("SUCCESS")) {
    stage 'deploy'
    build 'deploy'
} else {
    currentBuild.result = e2e.result
    // but continue
}
 

14voto

grenix Points 1

J'ai récemment essayé d'utiliser vaza réponse Montrer un Jenkins étape du pipeline d'échec, sans échec de l'ensemble du travail comme modèle pour écrire une fonction qui excutes un emploi dans un stade nommé comme le nom de la tâche. Étonnamment, il a travaillé, mais peut-être que certains groovy, les experts ont un coup d'oeil :)

Voici à quoi il ressemble si l'un des emplois est abandonnée: enter image description here

def BuildJob(projectName) {
    try {
       stage(projectName) {
         node {      
           def e2e = build job:projectName, propagate: false
           result = e2e.result
           if (result.equals("SUCCESS")) {
           } else {
              error 'FAIL' //sh "exit 1" // this fails the stage
           }
         }
       }
    } catch (e) {
        currentBuild.result = 'UNSTABLE'
        result = "FAIL" // make sure other exceptions are recorded as failure too
    }
}

node {
    BuildJob('job1')
    BuildJob('job2')
}

3voto

anyone.can.test Points 39

Vous pouvez ajouter une tâche d'échec explicite, telle que "sh" pas de commande "" dans la phase.

 if (result.equals("SUCCESS")) {
   stage 'deploy'
   build 'deploy'
} else {
   try {
       sh "not exist command"
   }catch(e) {
   }
}
 

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