Juge
Juge

Reputation: 586

How to use Jenkins Pipeline global variable on another stages?

I have defined global variable in Jenkins pipeline

def BUILDNRO = '0'
pipeline { ...

Then i manipulate variable with shell script to enable running builds parallel by using job build number as identifier so we don't mix different docker swarms.

    stage('Handle BUILD_NUMBER') {
        steps {
            script {
            BUILDNRO = sh( script: '''#!/bin/bash
            Build=`echo ${BUILD_NUMBER} | grep -o '..$'`
            # Check if BUILD first character is 0
            if [[ $Build:0:1 == "0" ]]; then
                # replace BUILD first character from 0 to 5
                Build=`echo $Build | sed s/./5/1`
            fi
            echo $Build
            ''',returnStdout: true).trim()
            }
        }
    }

i get value out from previos stage and trying to get global variable on next stage

    stage('DOCKER: Init docker swarm') {
        steps {
            echo "BUILDNRO is: ${BUILDNRO}"  --> Value is here.
            sh '''#!/bin/bash
            echo Buildnro is: ${BUILDNRO}   --> This is empty.
            ...
        }
    }

This will out give global variable empty. why? in previous stage there was value in it.

EDIT 1. Modified code blocks to reflect current status.

Upvotes: 3

Views: 7753

Answers (2)

Juge
Juge

Reputation: 586

I managed to figure it out. Here is solution how i managed to did it. BUILDNRO is groovy variable and if wanting to used in bash variable it have to pass using withEnv. BUILD_NUMBER in first stage is bash variable hence it can be used directly script in first stage.

def BUILDNRO = '0'

pipeline {
  ....
  stages {
    stage('Handle BUILD_NUMBER') {
      steps {
        script {
          BUILDNRO = sh( script: '''#!/bin/bash
          Build=`echo ${BUILD_NUMBER} | grep -o '..$'`
          ''',returnStdout: true).trim()
        }
      }
    }
    stage('DOCKER: Init docker swarm') {
      steps {
        dir("prose_env/prose_api_dev_env") {
          withEnv(["MYNRO=${BUILDNRO}"]) {
            sh(returnStdout: false, script: '''#!/bin/bash
            echo Buildnro is: ${MYNRO}`
            '''.stripIndent())
          }
        }
      }     
    }
  }
}

Upvotes: 5

rafal1337
rafal1337

Reputation: 184

If you are using single quotes(```) in the shell module, Jenkins treats every variable as a bash variable. The solution is using double quotes(""") but then if you made bash variable you have to escape it. Below an example with working your use case and escaped bash variable

pipeline {
    agent any
    stages {
        stage('Handle BUILD_NUMBER') {
            steps {
                script {
                    BUILDNRO = sh(script: 'pwd', returnStdout: true).trim()
                    echo "BUILDNRO is: ${BUILDNRO}"
                }
            }
        }
        stage('DOCKER: Init docker swarm') {
            steps {
                sh """#!/bin/bash
            echo Buildnro is: ${BUILDNRO}
            variable=world
            echo "hello \${variable}"
            sh """
            }
        }

    }
}

output of the second stage:

Buildnro is: /var/lib/jenkins/workspace/stack1
hello world

Upvotes: 0

Related Questions