Using global variables in Jenkins Pipeline
Solution 1
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
Solution 2
sh '''
'''
should be
sh """
"""
with single quotes the variables don't get processed.
Solution 3
Global environments on jenkins should be outside the pipeline ,can be initialized/used inside the scripts, and of course known by all scopes inside the pipeline:
example:
def internal_ip
pipeline {
agent { node { label "test" } }
stages {
stage('init') {
steps {
script {
def x
if(env.onHold.toBoolean() == true){
x=1
}else{
x=2
}
internal_ip = sh (
script: "echo 192.168.0.${x}",
returnStdout: true
).trim()
}
}
}
stage('test') {
steps {
script {
echo "my internal ip is: ${internal_ip}"
}
}
}
}
}
}
Solution 4
In addition to @avivamg's answer which is correct.
One remaining problem is that if you want to access Jenkins' environment variables (see http://<JENKINS_URL>/env-vars.html/
) to initialize these globals, e.g.:
def workspaceDir=${WORKSPACE}
you get:
groovy.lang.MissingPropertyException: No such property: WORKSPACE for class: groovy.lang.Binding
The idea of :
def workspaceDir
pipeline {
environment {
workspaceDir=${WORKSPACE}
}
stages {
stage('Globals test') {
steps {
script {
echo "workspaceDir=${workspaceDir}"
echo workspaceDir
}
}
}
}
}
leads to the output:
workspaceDir=null
null
since there are two different contexts involved: environment and Groovy, which apparently are independent from each other.
It works with:
environment {
workspaceDir=${WORKSPACE}
}
but that's an environment variable then, not a variable in the Groovy context.
Declaring and initializing in the Groovy context works via stage(s):
def workspaceDir
pipeline {
stages {
stage('Initializing globals') {
steps {
script {
workspaceDir = "${WORKSPACE}"
}
}
}
stage('Globals test') {
steps {
script {
echo "workspaceDir=${workspaceDir}"
echo workspaceDir
}
}
}
}
}
Output:
workspaceDir=C:\Users\jenkins\AppData\Local\Jenkins\.jenkins\workspace\Globals-test-project
C:\Users\jenkins\AppData\Local\Jenkins\.jenkins\workspace\Globals-test-project
Sunil
Updated on September 20, 2021Comments
-
Sunil over 2 years
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 ''' } }