adjuzy
adjuzy

Reputation: 581

jenkinsfile variable scope

I'm trying to call a remote job from one Jenkins server to another, I have this working fine via a shell script. However, trying to translate it into a Jenkinsfile is causing me issues. The environment variable is always "null" when used inside of a stage, even thought this article says it should be globally available?

pipeline {
agent any
/* get crumb for CSRF */
environment {
        def crumb = sh 'curl https://jenkins-remote/crumbIssuer/'
}

stages {
/* call remote job */
    stage("remote") {
        steps {
            sh "curl -X POST -H ${env.crumb} https://jenkins-remote/buildWithParameters?foo"
        }
    }
}
}

The trimmed output looks like:

[remote_pipeline] Running shell script
+ curl -X POST -H null

I am using Jenkins v2.89.4, new "Pipeline" job, "pipeline script".

Upvotes: 2

Views: 6877

Answers (3)

haridsv
haridsv

Reputation: 9683

The sh task can now return output, so in theory the following should work (untested):

environment {
    crumb = sh(script: 'curl https://jenkins-remote/crumbIssuer/',
        returnStdout: true).trim()
}

Upvotes: 0

adjuzy
adjuzy

Reputation: 581

Thanks to @TrafLaf for pointing out the variable is null because it does not get set to the output of the curl command. My hacky solution was this:

environment {
    def crumbRequest = sh 'curl https://jenkins-remote/crumbIssuer/ > crumbHeader'
    crumbHeader = readFile('crumbHeader').trim()
}

Upvotes: 1

SV Madhava Reddy
SV Madhava Reddy

Reputation: 2018

As per the official documentation, This is how you define environment variables.

pipeline {
    agent any

    environment {
        DISABLE_AUTH = 'true'
        DB_ENGINE    = 'sqlite'
    }
    stages {
        stage('Build') {
            steps {
                echo "${env.DB_ENGINE}" # to access
            }
        }
    }
}

But you have coded wrong,

environment {
    def crumb = sh 'curl https://jenkins-remote/crumbIssuer/'
}

So please do the rest.

Upvotes: 1

Related Questions