Search code examples
jenkinsgroovyjenkins-pipeline

how can I get the value of a global variable within a function in a pipeline?


I have a declarative pipeline with a few steps. at the end I send a message to slack with some statistics of the compilation times and some more information. I want to send in case it fails the stage at which it fails. I have set a global variable but the function does not seem to be able to read its value. This is a simplified version of what I have:

def FAILED_STAGE

def sendSlackNotifcation() 
{
    if ( currentBuild.currentResult == "SUCCESS" ) {
        slackSend message: "${currentBuild.result}", channel: '#jenkins_bot2'
    }
        
    else {
        slackSend color : "#FF0000", message: "${FAILED_STAGE}", channel: '#jenkins_bot2'

    }
}

pipeline {
    agent any

    stages {
        stage('stage1') {
            steps{
                echo "stage1"
            }
        }     
        
        stage('stage2') {
            steps{
                echo "stage2"
            }
        }
        
        stage("Stage 3") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "${FAILED_STAGE}"
                    error "failed for some reason."
                }
            }
        }
    }
    post {
    failure {
        sendSlackNotifcation()
        }
    }

}

And this is the output I get:

13:38:53  [Pipeline] {
13:38:53  [Pipeline] stage
13:38:53  [Pipeline] { (stage1)
13:38:53  [Pipeline] echo
13:38:53  stage1
13:38:53  [Pipeline] }
13:38:53  [Pipeline] // stage
13:38:53  [Pipeline] stage
13:38:53  [Pipeline] { (stage2)
13:38:53  [Pipeline] echo
13:38:53  stage2
13:38:53  [Pipeline] }
13:38:53  [Pipeline] // stage
13:38:53  [Pipeline] stage
13:38:53  [Pipeline] { (Stage 3)
13:38:53  [Pipeline] script
13:38:53  [Pipeline] {
13:38:53  [Pipeline] echo
13:38:53  Stage 3
13:38:53  [Pipeline] error
13:38:53  [Pipeline] }
13:38:53  [Pipeline] // script
13:38:53  [Pipeline] }
13:38:53  [Pipeline] // stage
13:38:53  [Pipeline] stage
13:38:53  [Pipeline] { (Declarative: Post Actions)
13:38:53  Error when executing failure post condition:
13:38:53  groovy.lang.MissingPropertyException: No such property: FAILED_STAGE for class: WorkflowScript

Solution

  • It will work , if you do like this

    def failIn
    def printStatus(def msg) {
        echo "msg : ${msg}"
    }
    pipeline {
        agent any;
        stages {
            stage("01") {
                steps {
                    script {
                        failIn=env.STAGE_NAME    
                    }
                }
            }
        }
        post {
            always {
                printStatus(failIn)
            }
        }
    }