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

466 views
Skip to first unread message

jesus fernandez

unread,
Feb 11, 2021, 12:56:40 PM2/11/21
to Jenkins Users
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
```

Ven H

unread,
Feb 11, 2021, 1:11:24 PM2/11/21
to jenkins...@googlegroups.com
Try defining it inside the "environment" stage / step.

Regards,
Venkatesh


--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/91e7dbcd-c806-4d55-bc31-bc9a9ad4057cn%40googlegroups.com.

jesus fernandez

unread,
Feb 11, 2021, 1:14:11 PM2/11/21
to Jenkins Users
Thanks for replying, any example or any link where to get information about how to do so? I am a bit new to Jenkins

Ven H

unread,
Feb 11, 2021, 1:35:01 PM2/11/21
to jenkins...@googlegroups.com

Jesus Fernandez

unread,
Feb 11, 2021, 2:13:42 PM2/11/21
to Jenkins Users

Victor Martinez

unread,
Feb 11, 2021, 4:11:15 PM2/11/21
to Jenkins Users
You can simplify it quite a bit with the post stage event https://www.jenkins.io/doc/book/pipeline/syntax/#post

The example pipeline uses the post stages section, you can use the one specific the stage 3


Environment variables within an environment section are immutable, though you can use the script closure with the env map to set a new env variable that can be override

For instance:

stage(“stage 3”) {
  steps{
     script{
       env.FAILED_STAGE=env.STAGE_NAME
     }
     error ...
  }
}

Cheers





See 

jesus fernandez

unread,
Feb 12, 2021, 5:13:13 AM2/12/21
to Jenkins Users
Thanks a lot Victor, the links provided made it much clear now and the example worked just fine. You are always saving me hehe
Reply all
Reply to author
Forward
0 new messages