How to send Slack notification after Jenkins pipeline build failed?

后端 未结 3 464
情书的邮戳
情书的邮戳 2020-12-23 16:48

I have a pipeline groovy script in Jenkins v2.19. Also I have a
\"Slack Notification Plugin\" v2.0.1 and \"Groovy Postbuild Plugin\".

I have successfully send a

相关标签:
3条回答
  • 2020-12-23 17:19

    Just in case if in Declarative Syntax,

    Now, Jenkins provides post. You can check result at the end of pipeline.

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

    Using like:

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

    It would be used in every stage also. See the document link please.

    0 讨论(0)
  • 2020-12-23 17:34

    Based on Liam Newman's blog post, have a look at this cleaned up snippet for Slack only in scripted pipelines (declarative pipeline users scroll down). It uses original Jenkins results, message formatting, better colors (based on EclEmma), and some Groovy features like default arguments:

    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)
        }
    }
    

    The output will be something like this (play around with different formatting styles here):

    Maybe env.JOB_NAME contains encoded slashes (%2F) which can be fixed with replaceAll("%2F", "/"). Check out this Gist to see how to notify HipChat as well.

    If you have a declarative pipeline, have a look at the Jenkins documentation on "Cleaning up and notifications" or Liam Newman's follow-up post "Declarative Pipeline: Notifications and Shared Libraries".

    0 讨论(0)
  • 2020-12-23 17:35

    You could do something like this and use a try catch block.

    Here is some example 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)
    }
    

    Complete snippet can be found here Jenkinsfile Template

    0 讨论(0)
提交回复
热议问题