wake-up-neo.com

Wie sende ich eine Slack-Benachrichtigung, wenn der Jenkins-Pipeline-Build fehlgeschlagen ist?

Ich habe ein fetziges Skript für die Pipeline in Jenkins v2.19. Auch ich habe eine
"Slack Notification Plugin" v2.0.1 und "Groovy Postbuild Plugin".

Ich habe erfolgreich eine Nachricht "build started" und "build finished" gesendet (falls vorhanden).

Wenn ein Build-Schritt fehlgeschlagen ist - wie kann ich eine Meldung "Build failed" (Build fehlgeschlagen) an den Slack-Kanal senden?

28
kivagant

Sie könnten so etwas tun und einen try catch-Block verwenden.

Hier ist ein Beispielcode:

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

Das vollständige Snippet finden Sie hier Jenkinsfile Template

35
Fahl-Design

Basierend auf Liam Newmans Blogpost , schauen Sie sich dieses aufgeräumte Snippet für Slack nur in geskripteten Pipelines (deklarative Pipeline-Benutzer) an runterscrollen). Es verwendet original Jenkins Ergebnisse , Nachrichtenformatierung, bessere Farben (basierend auf EclEmma ) und einige Groovy-Funktionen wie Standardargumente :

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

Die Ausgabe wird ungefähr so ​​aussehen (spielen Sie mit verschiedenen Formatierungsstilen herum hier ):

enter image description here

Möglicherweise enthält env.JOB_NAME Codierte Schrägstriche (%2F), Die mit replaceAll("%2F", "/") korrigiert werden können. Schauen Sie sich this Gist an, um zu erfahren, wie Sie HipChat ebenfalls benachrichtigen können.

Wenn Sie eine deklarative Pipeline haben, lesen Sie die Jenkins-Dokumentation unter "Aufräumen und Benachrichtigungen" oder folgen Sie den Anweisungen von Liam Newman -up post "Deklarative Pipeline: Benachrichtigungen und gemeinsam genutzte Bibliotheken" .

25
beatngu13

Nur für den Fall, dass in deklarativer Syntax

Jetzt liefert Jenkins post. Sie können das Ergebnis am Ende der Pipeline überprüfen.

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

Verwendung wie:

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

Es würde auch in jedem stage verwendet. Siehe bitte den Link zum Dokument.

13
Rakk