devops84uk
devops84uk

Reputation: 741

Passing variables extracted from shell in Jenkinsfile

I am trying to pass variables extracted in a stage in Jenkinsfile between stages. For example:

   stage('Dummy Stage') {
    sh '''#!/bin/bash -l
        export abc=`output of some command`
        .....
        .....
       '''

Now, how can I pass the variable abc to a subsequent stage? I have tried setting the variable by adding a def section at the top of the file but looks like it doesnt work. In the absence of a neater way, I am having to retype the commands

Upvotes: 12

Views: 23289

Answers (4)

Ken Roy
Ken Roy

Reputation: 1261

My issue concerned having two 'sh' commands where one uses single quotes (where I set a variable) and the other uses double quotes (where I access 'env' variables set in the jenkinsfile such as BUILD_ID).

Here's how I solved it.

script {
    env.TEST = sh(
        script:
        '''
           echo "TEST"
        ''',
        returnStdout: true
    )
    sh """
         echo ${env.BUILD_ID}
         echo ${env.TEST}
    """
}

Upvotes: 1

pablo.bueti
pablo.bueti

Reputation: 151

You can use an imperatively created environment variable inside a script block in you stage steps, for example:

stage("Stage 1") {
    steps {
        script {
            env.RESULT_ON_STAGE_1 = sh (
                script: 'echo "Output of some command"',
                returnStdout: true
            )
        }
        echo "In stage 1: ${env.RESULT_ON_STAGE_1}"
    }
}
stage("Stage 2") {
    steps {
        echo "In stage 2: ${env.RESULT_ON_STAGE_1}"
    }
}

This guide explains use of environment variables in pipelines with examples.

Upvotes: 4

Bernhard Cygan
Bernhard Cygan

Reputation: 89

You can use the longer form of the sh step and return the output (see Pipeline document). Your variable should be defined outside the stages.

Upvotes: 3

Michael
Michael

Reputation: 2683

Here is what I do to get the number of commits on master as a global environment variable:

pipeline {

    agent any

    environment {
        COMMITS_ON_MASTER = sh(script: "git rev-list HEAD --count", returnStdout: true).trim()
    }

    stages {

        stage("Print commits") {
            steps {
                echo "There are ${env.COMMITS_ON_MASTER} commits on master"
            }
        }
    }
}

Upvotes: 24

Related Questions