web-dev-qa-db-fra.com

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.

43
techgnosis

Stage prend un bloc maintenant, alors enveloppez la scène en 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
   }
}
21
vaza

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
}
13
Jesse Glick

J'ai récemment essayé d'utiliser la réponse de vaza Afficher un stade de pipeline Jenkins comme ayant échoué sans échouer tout le travail comme modèle pour l'écriture d'une fonction qui exécute un travail dans une étape propre nommée comme le nom du travail. Étonnamment, cela a fonctionné, mais peut-être que quelques grands experts l’ont regardé :)

Voici à quoi cela ressemble si l’un des emplois est annulé: 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')
}
11
grenix

C'est désormais possible, même avec des pipelines déclaratifs:

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 il s'agit d'une fonctionnalité relativement nouvelle.

3
Erik B

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) {
   }
}
2
anyone.can.test

Étapes de la solution

  • Vous devez émettre une erreur dans une étape pour la marquer comme une erreur.
  • En dehors de la portée de stage, gérez l'exception et choisissez le statut de construction.
  • Cela donne l’effet souhaité par quelques utilisateurs ici, dont moi-même, @ user3768904, @Sviatlana

Succès avec échec Exemple d'étape

node("node-name") {
  try {
    stage("Process") {
      error("This will fail")
    }
  } catch(Exception error) {
    currentBuild.result = 'SUCCESS'
    return
  }
  stage("Skipped") {
     // This stage will never run
  }
}

enter image description here

Abandonné avec échec Étape Exemple

node("node-name") {
  try {
    stage("Process") {
      error("This will fail")
    }
  } catch(Exception error) {
    currentBuild.result = 'ABORTED'
    return
  }
  stage("Skipped") {
     // This stage will never run
  }
}

enter image description here

1
Marcello de Sales