Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jenkinsfile not passing env to sh

I am trying to set environment variable in Jenkinsfile following way,

pipeline {
    agent { label 'slave1' }

    stages {
        stage ('Build') {
            steps {
                script {
                    BUILD_VERSION = sh (
                        script: 'python get_firmware_version.py',
                        returnStdout: true
                    ).trim()
                }
                echo "${BUILD_VERSION}"
                withCredentials([file(credentialsId: 'image-sign', variable: 'IMAGE_SIGN')]) {
                    dir('firmware/') {
                        echo "${BUILD_VERSION}"
                        sh '''
                           echo "Building"
                           echo "${BUILD_VERSION}"
                           echo "${env.BUILD_VERSION}"
                        '''
                    }
                }
            }
        }
    }
    post {
        failure {
            script {
                echo "Pipeline Failed"
            }
        }
    }
}

But its failing with following error Bad substitution

[Pipeline] echo
0_2_0
[Pipeline] sh
+ echo Building
Building
/home/jenkins/jenkins_slave/workspace/Firmware/Branch/firmware@tmp/durable-54e04481/script.sh: 3: /home/jenkins/jenkins_slave/workspace/Firmware/Branch/firmware@tmp/durable-54e04481/script.sh: Bad substitution

Why I can't set ENV Var and use it in sh step ?

like image 862
roy Avatar asked Jan 02 '23 04:01

roy


1 Answers

This is Jenkins thing I think. When you use the sh block with '; it will not have access to things like environment variables. Try using the " instead. That should work

sh """
    echo "Building"
    echo "${env.BUILD_VERSION}"
    echo "${env}"
"""

Jenkins should recognise the shell block and escape the " within the """ automatically.

pipeline {
    agent { label 'slave1' }

    stages {
        stage ('Build') {
            steps {
                script {
                    BUILD_VERSION = sh (
                        script: 'python get_firmware_version.py',
                        returnStdout: true
                    ).trim()
                }
                echo "${BUILD_VERSION}"
                withCredentials([file(credentialsId: 'image-sign', variable: 'IMAGE_SIGN')]) {
                    dir('firmware/') {
                        echo "${BUILD_VERSION}"
                        sh """
                           echo "Building"
                           echo "${BUILD_VERSION}"
                           echo "${env.BUILD_VERSION}"
                        """
                    }
                }
            }
        }
    }
    post {
        failure {
            script {
                echo "Pipeline Failed"
            }
        }
    }
}

My test case

pipeline {
  agent {
    node {
      label 'devops-jenkins-slave'
    }
  }

  options {
    timestamps()
  }

  stages {

    stage('Setup'){
      steps {
        dir("${WORKSPACE}/"){
          script {
            BUILD_VERSION = "1"
          }

          sh """
           echo "${BUILD_VERSION}"
          """
        }
      }
    }

  }

    post {
      always {
        dir("${WORKSPACE}/"){
          deleteDir()
        }
      }
    }
}

Result

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on devops-jenkins-slave in /home/jenkins/workspace/Samples/Test
[Pipeline] {
[Pipeline] timestamps
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Setup)
[Pipeline] dir
22:09:55 Running in /home/jenkins/workspace/Samples/Test
[Pipeline] {
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] sh
22:09:56 [Test] Running shell script
22:09:56 + echo 1
22:09:56 1
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] dir
22:09:56 Running in /home/jenkins/workspace/Samples/Test
[Pipeline] {
[Pipeline] deleteDir
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // timestamps
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
like image 174
Praveen Premaratne Avatar answered Jan 04 '23 17:01

Praveen Premaratne