Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using global variables in Jenkins Pipeline

I have tried all sort of ways but nothing seems to be working. Here is my jenkinsfile.

def ZIP_NODE def CODE_VERSION pipeline{     /*A declarative pipeline*/      agent {         /*Agent section*/          // where would you like to run the code          label 'ubuntu'          }     options{         timestamps()         }     parameters {         choice(choices: ['dev'], description: 'Name of the environment', name: 'ENV')         choice(choices: ['us-east-1', 'us-west-1','us-west-2','us-east-2','ap-south-1'], description: 'What AWS region?', name: 'AWS_DEFAULT_REGION')         string(defaultValue: "", description: '', name: 'APP_VERSION')          }     stages{         /*stages section*/         stage('Initialize the variables') {             // Each stage is made up of steps             steps{                 script{                     CODE_VERSION='${BUILD_NUMBER}-${ENV}'                     ZIP_NODE='abcdefgh-0.0.${CODE_VERSION}.zip'                 }             }                         }         stage ('code - Checkout') {             steps{                 checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.git']]])              }           }          stage ('code - Build'){             steps{                 sh '''                      echo ${JOB_NAME}                     pwd                     echo ${ZIP_NODE}                     echo 'remove alraedy existing zip files'                     rm -rf *.zip                     zip -r ${ZIP_NODE} .                      chmod 777 $ZIP_NODE                  '''              }         }         stage('Deploy on Beanstalk'){             steps{                 build job: 'abcdefgh-PHASER' , parameters: [[$class: 'StringParameterValue', name: 'vpc', value: ENV], [$class: 'StringParameterValue', name: 'ZIP_NODE', value: ZIP_NODE], [$class: 'StringParameterValue', name: 'CODE_VERSION', value: CODE_VERSION], [$class: 'StringParameterValue', name: 'APP_VERSION', value: BUILD_NUMBER], [$class: 'StringParameterValue', name: 'AWS_DEFAULT_REGION', value: AWS_DEFAULT_REGION], [$class: 'StringParameterValue', name: 'ParentJobName', value: JOB_NAME]]             }         }     }   } 

The output of step script in stage ('Initialize the variables') gives me nothing, It is not setting the value of global variable ZIP_NODE:

[Pipeline] stage [Pipeline] { (Initialize the variables) [Pipeline] script [Pipeline] { [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage 

And then we go to stage (code - Build) we do not get the value of ZIP_NODE. See echo statement at 22:34:17

[Pipeline] stage [Pipeline] { (code - Build) [Pipeline] sh 22:34:16 [abcdefgh-ci-dev-pipeline] Running shell script 22:34:17 + echo abcdefgh-ci-dev-pipeline 22:34:17 abcdefgh-ci-dev-pipeline 22:34:17 + pwd 22:34:17 /home/advisor/Jenkins/workspace/abcdefgh-ci-dev-pipeline 22:34:17 + echo 22:34:17  22:34:17 + echo remove alraedy existing zip files 

Thanks to @awefsome, I had some observation which I would like add in details: When I use below code I get desired output i.e. correct value of ZIP_NODE:

 stage ('code - Build'){             steps{                 sh "echo ${JOB_NAME} && pwd && echo ${ZIP_NODE} && echo 'remove alraedy existing zip files' && rm -rf *.zip && zip -r ${ZIP_NODE} . && chmod 777 $ZIP_NODE"             }         } 

But when I use below code I do not get the value of ZIP_NODE:

stage ('code - Build'){             steps{                  sh '''                          echo ${ZIP_NODE}                         echo ${JOB_NAME}                         pwd                         echo ${ZIP_NODE}                         echo ${CODE_VERSION}                         #rm -rf .ebextensions                         echo 'remove alraedy existing zip files'                         rm -rf *.zip                         zip -r ${ZIP_NODE} .                          chmod 777 $ZIP_NODE                      '''             }         } 
like image 985
user271418 Avatar asked Aug 28 '18 18:08

user271418


People also ask

How does Jenkins Pipeline define global variable?

To access the Jenkins environment variables in a pipeline, you can use the env object, eg. env.BUILD_NUMBER will give the current build number of a pipeline. The reference to Jenkins pipeline environment variables is made by surrounding it by ${} in the following way: ${env.BUILD_NUMBER}

How do you call a global variable in Jenkins?

After installing, in your job choose Add Parameter and select Global Variable String Parameter. Use $VARIABLE or ${VARIABLE} in either the default value or on the build now page to substitute global node parameters.

How do you set environment variables in Jenkins pipeline script?

Jenkins Environment Variable is a global variable exposed through the env variable and used anywhere in the Jenkins file. Any value stored in the env variable gets stored as a String type. Environment Variables can be set either at the pipeline top level, at the specific stage level, or inside the script block.


2 Answers

sh ''' ''' 

should be

sh """ """ 

with single quotes the variables don't get processed.

like image 135
Simon Avatar answered Sep 20 '22 11:09

Simon


Try following and see how it goes:

def ZIP_NODE def CODE_VERSION pipeline{     /*A declarative pipeline*/      agent {         /*Agent section*/          // where would you like to run the code          label 'master'          }     options{         timestamps()         }     parameters {         choice(choices: ['dev'], description: 'Name of the environment', name: 'ENV')         choice(choices: ['us-east-1', 'us-west-1','us-west-2','us-east-2','ap-south-1'], description: 'What AWS region?', name: 'AWS_DEFAULT_REGION')         string(defaultValue: "", description: '', name: 'APP_VERSION')          }     stages{         /*stages section*/         stage('Initialize the variables') {             // Each stage is made up of steps             steps{                 script{                     CODE_VERSION="${BUILD_NUMBER}-${ENV}"                     ZIP_NODE="abcdefgh-0.0.${CODE_VERSION}.zip"                 }             }                         }         stage ('code - Checkout') {             steps{                 println "checkout skipped"                 //checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.git']]])              }           }          stage ('code - Build'){             steps{                 sh "echo ${JOB_NAME} && pwd && echo ${ZIP_NODE} && echo 'remove alraedy existing zip files' && rm -rf *.zip && zip -r ${ZIP_NODE} . && chmod 777 $ZIP_NODE"             }         }         stage('Deploy on Beanstalk'){             steps{                 println "build job skipped"                 //build job: 'abcdefgh-PHASER' , parameters: [[$class: 'StringParameterValue', name: 'vpc', value: ENV], [$class: 'StringParameterValue', name: 'ZIP_NODE', value: ZIP_NODE], [$class: 'StringParameterValue', name: 'CODE_VERSION', value: CODE_VERSION], [$class: 'StringParameterValue', name: 'APP_VERSION', value: BUILD_NUMBER], [$class: 'StringParameterValue', name: 'AWS_DEFAULT_REGION', value: AWS_DEFAULT_REGION], [$class: 'StringParameterValue', name: 'ParentJobName', value: JOB_NAME]]             }         }     }  } 

I got following output:

Started by user jenkins Running in Durability level: MAX_SURVIVABILITY [Pipeline] node Running on Jenkins in /Users/Shared/Jenkins/Home/workspace/test [Pipeline] { [Pipeline] timestamps [Pipeline] { [Pipeline] stage [Pipeline] { (Initialize the variables) [Pipeline] script [Pipeline] { [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (code - Checkout) [Pipeline] echo 21:19:06 checkout skipped [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (code - Build) [Pipeline] sh 21:19:06 [test] Running shell script 21:19:06 + echo test 21:19:06 test 21:19:06 + pwd 21:19:06 /Users/Shared/Jenkins/Home/workspace/test 21:19:06 + echo abcdefgh-0.0.17-dev.zip 21:19:06 abcdefgh-0.0.17-dev.zip 21:19:06 + echo 'remove alraedy existing zip files' 21:19:06 remove alraedy existing zip files 21:19:06 + rm -rf '*.zip' 21:19:06 + zip -r abcdefgh-0.0.17-dev.zip . 21:19:06  21:19:06 zip error: Nothing to do! (try: zip -r abcdefgh-0.0.17-dev.zip . -i .) [Pipeline] } [Pipeline] // stage 
like image 24
awefsome Avatar answered Sep 21 '22 11:09

awefsome