3
votes

Jenkinsfile échoue une étape et continue le reste

J'ai un fichier Jenkins comme celui-ci:

pipeline {
    agent any

    options {
        buildDiscarder(logRotator(numToKeepStr: '7'))
        disableConcurrentBuilds()
        timeout(time: 10, unit: 'MINUTES')
        timestamps()
    }

    stages {
        stage('Admin') {
            steps {
                script {
                    try {
                        result = "FAIL"
                    } catch(error) {
                        result = "FAIL"
                    }
                }
            }
        }
        stage('Normal') {
            steps {
                script {
                    try {
                sh("echo 'hi'")
                    } catch(error) {

                    }
                }
            }
        }
    }
}

Comment puis-je échouer à la première étape et l'afficher en rouge et faire continuer le pipeline pour plus d'étapes?

I ont regardé toutes les réponses SO pour cela et ne peuvent pas le faire fonctionner.

La configuration de result = "FAIL" ne provoque pas l'échec de l'étape. Comment puis-je faire cela sans passer à l'étape suivante?


0 commentaires

3 Réponses :


3
votes

Vous pouvez marquer un état de construction comme ayant échoué en définissant une nouvelle valeur pour la variable globale jenkins currentBuild . La variable a 3 états: SUCCESS (vert), FAILURE (rouge) et UNSTABLE (jaune). Le catch devrait empêcher la construction de se terminer afin que vous puissiez définir le statut de currentBuild et continuer simplement.

           try {
               //so something
            } catch(error) {
                //mark build as failed
                currentBuild.result = 'FAILURE'
            }
        }

Je pense que cela devrait travail. Malheureusement, je n'ai aucun moyen de valider ce guichet automatique. Si cela ne fonctionne pas, veuillez me le dire.


2 commentaires

Cela marque l'échec de la construction mais ne me dit pas quelle étape a échoué.


Je pensais ainsi. Vous pouvez utiliser une commande «echo» avec un message d'erreur pour afficher qu'un échec s'est produit. D'un autre côté, vous pouvez toujours quitter le pipeline avec «exit 1» qui affichera également «l'échec en gras» sur l'interface graphique. Alors peut-être mettez votre autre étape dans catch () {} et utilisez la sortie 1 à la fin de catch ()?



0
votes

Selon mes connaissances, nous pouvons mettre en œuvre la même chose que ci-dessous.

  1. Utiliser l'action de script et le bloc try-catch

    stage("example") {
        b = build(job: "example-job", propagate: false).result
        if(b == 'FAILURE') {
            echo "First job failed"
            currentBuild.result = 'FAILURE' // of FAILURE
        }
    }
    stage("test") {
        build("test-job")
    }
    
  2. Vous pouvez utiliser propagate: false qui est disponible à l'étape de construction. Quelque chose comme ci-dessous

    stage('someStage') {
    steps {
        script {
            try {
                //Do something
            } catch (err) {
                echo err
            }
        }
        echo currentBuild.result = 'FAILURE'
      }
    }
    

Liens:
https://jenkins.io/doc/pipeline/steps/pipeline-build -step /

https://medium.com/@Lenkovits/jenkins-pipelines-and-their-dirty-secrets-1-9e535cd603f4


1 commentaires

Vous remarquerez que je n'utilise pas build et que l'étape 'sh' n'a pas de paramètre propogate , j'en ai bien peur: jenkins.io/doc/pipeline/steps/workflow-durable-task-step/… < / a>



0
votes

Voulez-vous afficher une étape "rouge" et toutes les autres (sans échec) "vertes"? Autant que je sache, ce n'est pas possible.

Voulez-vous savoir quelle étape échoue et laquelle fonctionne correctement? Eh bien, cela dépend de la façon dont vous voulez qu'il soit affiché

Le moyen le plus simple: comme suggéré dans une réponse précédente, vous pouvez utiliser "echo" pour l'imprimer dans la console

La méthode 'Je veux la pleine puissance': encapsulez un try-catch dans un autre try-catch et utilisez le signal "error":

stages {
    try {
        stage ('Normal') {
            try {
            /* Do your thing */
            } catch (err) {
                /* Mark this stage as "failure" using error
                error 'Stage Normal failing'
            }
        }  // stage 'Normal'
    } catch (err) {
        // here is the 'error' signal captured and omitted by now
    }

Stage Failing apparaît avec le texte "failed" affiché dans la case et dans un plus sombre rouge


0 commentaires