How to access parameters in a Parameterized Build? How to access parameters in a Parameterized Build? jenkins jenkins

How to access parameters in a Parameterized Build?


I think the variable is available directly, rather than through env, when using Workflow plugin.Try:

node(){    print "DEBUG: parameter foo = ${foo}"}


I tried a few of the solutions from this thread. It seemed to work, but my values were always true and I also encountered the following issue:JENKINS-40235

I managed to use parameters in groovy jenkinsfile using the following syntax: params.myVariable

Here's a working example:

Solution

print 'DEBUG: parameter isFoo = ' + params.isFooprint "DEBUG: parameter isFoo = ${params.isFoo}"

A more detailed (and working) example:

node() {   // adds job parameters within jenkinsfile   properties([     parameters([       booleanParam(         defaultValue: false,         description: 'isFoo should be false',         name: 'isFoo'       ),       booleanParam(         defaultValue: true,         description: 'isBar should be true',         name: 'isBar'       ),     ])   ])   // test the false value   print 'DEBUG: parameter isFoo = ' + params.isFoo   print "DEBUG: parameter isFoo = ${params.isFoo}"   sh "echo sh isFoo is ${params.isFoo}"   if (params.isFoo) { print "THIS SHOULD NOT DISPLAY" }   // test the true value   print 'DEBUG: parameter isBar = ' + params.isBar   print "DEBUG: parameter isBar = ${params.isBar}"   sh "echo sh isBar is ${params.isBar}"   if (params.isBar) { print "this should display" }}

Output

[Pipeline] {[Pipeline] propertiesWARNING: The properties step will remove all JobPropertys currently configured in this job, either from the UI or from an earlier properties step.This includes configuration for discarding old builds, parameters, concurrent builds and build triggers.WARNING: Removing existing job property 'This project is parameterized'WARNING: Removing existing job property 'Build triggers'[Pipeline] echoDEBUG: parameter isFoo = false[Pipeline] echoDEBUG: parameter isFoo = false[Pipeline] sh[wegotrade-test-job] Running shell script+ echo sh isFoo is falsesh isFoo is false[Pipeline] echoDEBUG: parameter isBar = true[Pipeline] echoDEBUG: parameter isBar = true[Pipeline] sh[wegotrade-test-job] Running shell script+ echo sh isBar is truesh isBar is true[Pipeline] echothis should display[Pipeline] }[Pipeline] // node[Pipeline] End of PipelineFinished: SUCCESS

I sent a Pull Request to update the misleading pipeline tutorial#build-parameters quote that says "they are accessible as Groovy variables of the same name.". ;)

Edit: As Jesse Glick pointed out:Release notes go into more details

You should also update the Pipeline Job Plugin to 2.7 or later, so that build parameters are defined as environment variables and thus accessible as if they were global Groovy variables.


When you add a build parameter, foo,it gets converted to something which acts like a "bare variable",so in your script you would do:

node {   echo foo}

If you look at the implementation of the workflow script, you will see that when a script is executed, a class called WorkflowScript isdynamically generated. All statements in the script are executed in the context of this class. All build parameters passed down to this script are converted to properties which are accessible from this class.

For example, you can do:

node {    getProperty("foo")}

If you are curious, here is a workflow script I wrote which attempts to print out the build parameters, environment variables, and methods on the WorkflowScript class.

node {   echo "I am a "+getClass().getName()   echo "PARAMETERS"   echo "=========="   echo getBinding().getVariables().getClass().getName()   def myvariables = getBinding().getVariables()   for (v in myvariables) {       echo "${v} " + myvariables.get(v)   }   echo STRING_PARAM1.getClass().getName()   echo "METHODS"   echo "======="   def methods = getMetaClass().getMethods()   for (method in methods) {       echo method.getName()       }    echo "PROPERTIES"   echo "=========="   properties.each{ k, v ->        println "${k} ${v}"    }   echo properties   echo properties["class"].getName()   echo "ENVIRONMENT VARIABLES"   echo "======================"   echo "env is " + env.getClass().getName()   def envvars = env.getEnvironment()   envvars.each{ k, v ->        println "${k} ${v}"   }}

Here is another code example I tried, where I wanted to test to seeif a build parameter was set or not.

node {   groovy.lang.Binding myBinding = getBinding()   boolean mybool = myBinding.hasVariable("STRING_PARAM1")   echo mybool.toString()   if (mybool) {       echo STRING_PARAM1       echo getProperty("STRING_PARAM1")   } else {       echo "STRING_PARAM1 is not defined"   }   mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")   if (mybool) {       echo DID_NOT_DEFINE_THIS       echo getProperty("DID_NOT_DEFINE_THIS")   } else {       echo "DID_NOT_DEFINE_THIS is not defined"   }}