web-dev-qa-db-fra.com

Comment envoyer une notification Slack après l'échec de la génération du pipeline Jenkins?

J'ai un script groovy de pipeline dans Jenkins v2.19. J'ai aussi un
"Plugin Notification Slack" v2.0.1 et "Plugin Groovy Postbuild".

J'ai envoyé avec succès un message "build started" et "build completed" (si c'était le cas).

Quand une étape de construction a échoué - comment puis-je envoyer un message "Build failed" au canal Slack?

28
kivagant

Vous pouvez faire quelque chose comme ça et utiliser un bloc catch try.

Voici quelques exemples de code:

node {
    try {
        notifyBuild('STARTED')

        stage('Prepare code') {
            echo 'do checkout stuff'
        }

        stage('Testing') {
            echo 'Testing'
            echo 'Testing - publish coverage results'
        }

        stage('Staging') {
            echo 'Deploy Stage'
        }

        stage('Deploy') {
            echo 'Deploy - Backend'
            echo 'Deploy - Frontend'
        }

  } catch (e) {
    // If there was an exception thrown, the build failed
    currentBuild.result = "FAILED"
    throw e
  } finally {
    // Success or failure, always send notifications
    notifyBuild(currentBuild.result)
  }
}

def notifyBuild(String buildStatus = 'STARTED') {
  // build status of null means successful
  buildStatus =  buildStatus ?: 'SUCCESSFUL'

  // Default values
  def colorName = 'RED'
  def colorCode = '#FF0000'
  def subject = "${buildStatus}: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'"
  def summary = "${subject} (${env.BUILD_URL})"

  // Override default values based on build status
  if (buildStatus == 'STARTED') {
    color = 'YELLOW'
    colorCode = '#FFFF00'
  } else if (buildStatus == 'SUCCESSFUL') {
    color = 'GREEN'
    colorCode = '#00FF00'
  } else {
    color = 'RED'
    colorCode = '#FF0000'
  }

  // Send notifications
  slackSend (color: colorCode, message: summary)
}

Un extrait complet peut être trouvé ici Modèle Jenkinsfile

35
Fahl-Design

Sur la base de billet de blog de Liam Newman , jetez un coup d'œil à cet extrait nettoyé pour Slack uniquement dans pipelines scriptés (utilisateurs déclarants du pipeline défiler vers le bas). Il utilise l'original résultats Jenkins , le formatage du message, de meilleures couleurs (basées sur EclEmma ), ainsi que certaines fonctionnalités de Groovy telles que arguments par défaut :

def notifySlack(String buildStatus = 'STARTED') {
    // Build status of null means success.
    buildStatus = buildStatus ?: 'SUCCESS'

    def color

    if (buildStatus == 'STARTED') {
        color = '#D4DADF'
    } else if (buildStatus == 'SUCCESS') {
        color = '#BDFFC3'
    } else if (buildStatus == 'UNSTABLE') {
        color = '#FFFE89'
    } else {
        color = '#FF9FA1'
    }

    def msg = "${buildStatus}: `${env.JOB_NAME}` #${env.BUILD_NUMBER}:\n${env.BUILD_URL}"

    slackSend(color: color, message: msg)
}

node {
    try {
        notifySlack()

        // Existing build steps.
    } catch (e) {
        currentBuild.result = 'FAILURE'
        throw e
    } finally {
        notifySlack(currentBuild.result)
    }
}

La sortie ressemblera à ceci (jouez avec différents styles de formatage ici ):

enter image description here

Peut-être que env.JOB_NAME Contient des barres obliques (%2F) Qui peuvent être corrigées avec replaceAll("%2F", "/"). Découvrez this Gist pour voir comment notifier également HipChat.

Si vous avez un pipeline déclaratif , consultez la documentation de Jenkins sur "Nettoyage et notifications" ou suivez Liam Newman -up post "Pipeline déclaratif: notifications et bibliothèques partagées" .

25
beatngu13

Juste au cas où si dans la syntaxe déclarative,

Jenkins fournit maintenant post. Vous pouvez vérifier le résultat à la fin du pipeline.

https://jenkins.io/doc/book/pipeline/syntax/#post-example

Utilisant comme:

pipeline {
    stages { ... }
    post {
       // only triggered when blue or green sign
       success {
           slackSend ...
       }
       // triggered when red sign
       failure {
           slackSend ...
       }
       // trigger every-works
       always {
           slackSend ...
       }
    }
}

Il serait également utilisé dans chaque stage. Voir le lien du document s'il vous plaît.

13
Rakk