0
votes

Section de publication conditionnelle dans le pipeline Jenkins

Disons que j'ai un simple fichier de pipeline Jenkins comme ci-dessous:

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
                sh ...
            }
        }

        stage('Build') {
            steps {
                sh ...
            }
        }

        stage('Publish') {
            when {
                buildingTag()
            }

            steps {
                sh ...
                send_slack_message("Built tag")
            }
        }
    }

    post {
        failure {
            send_slack_message("Error building tag")
        }
    }
}

Puisqu'il y a beaucoup de builds sans balises tous les jours, je ne veux pas envoyer de message mou sur les builds sans balises . Mais pour les builds de balises, je veux envoyer soit un message de réussite, soit un message d'échec, quelle que soit l'étape où il a échoué.

Donc, pour l'exemple ci-dessus, je veux:

  1. Quand il s'agit d'une construction de balise et que l'étape 'Test' a échoué, je verrai un message "Erreur lors de la construction de la balise". (C'est un oui dans l'exemple)
  2. Quand il s'agit d'une construction de balise, et que toutes les étapes ont réussi, je verrai un message "Balise construite". (C'est aussi un oui dans l'exemple)
  3. Lorsqu'il ne s'agit pas d'une création de balise, aucun message de relâche ne sera jamais envoyé. (Ce n'est pas le cas dans l'exemple, par exemple, lorsque l'étape 'Test' échoue, il y aura un message "Erreur lors de la construction de la balise")

Pour autant que je sache, il n'y a pas de "section de message conditionnelle" dans la syntaxe du pipeline Jenkins, ce qui pourrait vraiment m'aider ici. Ma question est donc la suivante: y a-t-il une autre façon de faire cela?


0 commentaires

3 Réponses :


0
votes

Dans l'étape de post-construction, vous pouvez également utiliser l'action de script à l'intérieur et utiliser if. Et à l'intérieur de cette étape, vous pouvez ajouter le plugin emailext.


0 commentaires

3
votes
    post {
        failure {
            script {
                if (isTagBuild) {
                    send_slack_message("Error building tag")
                }
            }
        }
    }
where isTagBuild is whatever way you have to differentiate between a tag or no tag build.You could also apply the same logic, and move send_slack_message("Built tag") down to a success post stage.

0 commentaires

0
votes

Eh bien, pour ceux qui veulent juste du code copiable, voici ce que j'ai fini avec la réponse de @ eez0.

pipeline {
    agent any

    environment {
        BUILDING_TAG = 'no'
    }

    stages {
        stage('Setup') {
            when {
                buildingTag()
            }

            steps {
                script {
                    BUILDING_TAG = 'yes'
                }
            }
        }

        stage('Test') {
            steps {
                sh ...
            }
        }

        stage('Build') {
            steps {
                sh ...
            }
        }

        stage('Publish') {
            when {
                buildingTag()
            }

            steps {
                sh ...
            }
        }
    }

    post {
        failure {
            script {
                if (BUILDING_TAG == 'yes') {
                    slackSend(color: '#dc3545', message: "Error publishing")
                }
            }
        }

        success {
            script {
                if (BUILDING_TAG == 'yes') {
                    slackSend(color: '#28a745', message: "Published")
                }
            }
        }
    }
}

Comme vous pouvez le voir, je compte vraiment sur la fonction buidingTag () intégrée de Jenkins pour m'aider à trier les choses, en utilisant un env-var comme "pont". Je ne suis vraiment pas doué pour le pipeline Jenkins, alors laissez des commentaires si vous avez des suggestions.


0 commentaires