Related
I have (in this simplified example) two dynamic parameters in my Jenkinsfile, the first one is a ChoiceParameter, the second one is a CascadeChoiceParameter, depending on the first one.
The code below shows these two parameters CATEGORY and USER in my Jenkinsfile:
properties([
parameters([
[
$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
name: 'CATEGORY',
script: [
$class: 'GroovyScript',
script: [ classpath: [], sandbox: true, script:
"""
return ['one', 'two']
"""
]
]
],
[
$class: 'CascadeChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
referencedParameters: 'CATEGORY',
name: 'USER',
script: [
$class: 'GroovyScript',
script: [ classpath: [], sandbox: true, script:
"""
if ( CATEGORY.equals( 'one' ) ) {
return ['user for category one']
} else {
return ['user for category two']
}
"""
]
]
],
])
])
They do work (that is, the second one USER changes depending on the first one CATEGORY), but also producing the following exception in the Jenkins log:
Error executing script for dynamic parameter
groovy.lang.MissingPropertyException: No such property: CATEGORY for class: groovy.lang.Binding
at groovy.lang.Binding.getVariable(Binding.java:63)
[...]
Caused: java.lang.RuntimeException: Failed to evaluate script: No such property: CATEGORY for class: groovy.lang.Binding
at org.biouno.unochoice.model.GroovyScript.eval(GroovyScript.java:197)
at org.biouno.unochoice.util.ScriptCallback.call(ScriptCallback.java:96)
[...]
I tried to modify the IF-statement of the second groovy script from
if ( CATEGORY.equals( 'one' ) ) {
to
if ( "${CATEGORY}".equals( 'one' ) ) {
This eliminates the exception, but (using a Logger) shows that "${CATEGORY}" always evaluates to "one", never to "two", even after changing the dropdown value for the ChoiceParameter "CATEGORY" in the Jenkins UI.
How must I access the parameter CATEGORY in the Groovy script to get it working without throwing an exception?
The following seems to work fine for me. Try updating the Plugin maybe.
def CATEGORY = ""
properties([
parameters([
[
$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
name: 'CATEGORY',
script: [
$class: 'GroovyScript',
script: [ classpath: [], sandbox: true, script:
"""
return ['one', 'two']
"""
]
]
],
[
$class: 'CascadeChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
referencedParameters: 'CATEGORY',
name: 'USER',
script: [
$class: 'GroovyScript',
script: [ classpath: [], sandbox: true, script:
"""
if ( CATEGORY.equals( 'one' ) ) {
return ['user for category one']
} else {
return ['user for category two']
}
"""
]
]
],
])
])
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
println "Category: " + CATEGORY
println "User: " + USER
}
}
}
}
i want to have checkbox/single select , when user checked the checkbox/use the filed in the single select , it will create dynamically few text box(5).2 of those text box should contain password/keys (so should be encrypted /not shown in jenkins parameters.
i tried with Active Choices Parameter and Active Choices Reactive Reference Parameter from jenkins file and from gui
example:
i have parameters :
Active Choices Parameter
name: use_custom
Groovy Script: return ["true", "false"]
Choice Type: single select
Active Choices Reactive Reference Parameter
name: custom_values
Groovy Script:
myPassword = ''
if ( use_custom == "true") {
return """
inputBox="<input class='setting-input' name='value' type='password' value=''>"
inputBox="<input class='setting-input' name='value' type='text' value=''>"
"""
echo(text1)
}
else {
return ""
}
Choice Type: formatted html ,
Referenced parameters: use_custom
i created 2 dynamic html box (work only for text box , not passwords/key that user need to enter manually (not via jenkins cred)
example output in parameters:
custom_values: 1234,11
*it show the password in jenkins params (free text)
what is the solution to allow user to write password and text box ( 2 pass, 3 box) when another field is true (password cannot be free text)
groovy pipeline example(in case of Env:dev , create 2 textbox):
properties([
parameters([
[$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
description: 'Select the Env Name from the Dropdown List',
filterLength: 1,
filterable: true,
name: 'Env',
randomName: 'choice-parameter-5631314439613978',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Env\']'
],
script: [
classpath: [],
sandbox: false,
script:
'return["Dev","QA","Stage","Prod"]'
]
]
],
// [$class: 'CascadeChoiceParameter',
// choiceType: 'ET_FORMATTED_HTML',
// description: 'Select the Server from the Dropdown List',
// filterLength: 1,
// filterable: true,
// name: 'Server',
// randomName: 'choice-parameter-5631314456178619',
// referencedParameters: 'Env',
[$class: 'DynamicReferenceParameter',
choiceType: 'ET_FORMATTED_HTML',
omitValueField: true,
description: '123',
name: 'Server',
randomName: 'choice-parameter-5631314456178624',
referencedParameters: 'Env',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Environment from Env Param\']'
],
script: [
classpath: [],
sandbox: false,
script:
''' if (Env.equals("Dev")){
inputBox2 = "<input name='value' class='setting-input' type='text'>"
inputBox = "password(name: 'KEY', description: 'Encryption key')"
return[inputBox]
}
else {
return ""
}
'''
]
]
],
[$class: 'DynamicReferenceParameter',
choiceType: 'ET_FORMATTED_HTML',
omitValueField: true,
description: '1234',
name: 'pass',
//randomName: 'choice-parameter-5631314456178624',
referencedParameters: 'Env',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Environment from Env Param\']'
],
script: [
classpath: [],
sandbox: false,
script:
''' if (Env.equals("Dev")){
inputBox = "<input name='value' class='setting-input' type='password'>"
return[inputBox]
}
else {
return ""
}
'''
]
]
]
])
])
pipeline {
environment {
vari = ""
}
agent any
stages {
stage ("Example") {
steps {
script{
echo 'Hello'
echo "${params.Env}"
echo "${params.Server}"
echo "${params.pass}"
if (params.Server.equals("Could not get Environment from Env Param")) {
echo "Must be the first build after Pipeline deployment. Aborting the build"
currentBuild.result = 'ABORTED'
return
}
echo "Crossed param validation"
} }
}
}
}
i tried also with mask_plugin , it mask from console output , not from parameters , any ideas ?
thanks
I am trying to use following jenkins job to generate Active Choices user selectable params for a job.
my ask is to show/hide textbox when heartbeat_consumer checkbox is selected/unselected. I would also like to store the value of user input in heartbeat_consumer_parms, which can be accessed thru env.heartbeat_consumer_parms. I plan to use this value in downstream jobs.
pipeline {
agent any
stages {
stage('Parameters'){
steps {
script {
properties([
parameters([
text(
defaultValue: '''''',
name: 'application_servers',
description: 'Please provide semicolon delimited (;) application server list ',
),
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_CHECKBOX',
description: 'Select Services',
name: 'application_services_list',
referencedParameters: 'application_servers',
script:
[$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script: "return['']"
],
script: [
classpath: [],
sandbox: false,
script: '''
if (application_servers.length() > 0){
return["heartbeat_consumer", "surgeon_cloud_login", "system_configuration"]
}
'''
]
]
]
])
])
if (application_services_list.contains('heartbeat_consumer')){
text(
defaultValue: '''''',
name: 'heartbeat_consumer_parms',
description: 'Please provide heartbeatconsumer job parms ',
)
}
}
}
}
}
}
with current implmentation I am not seeing that textbox heartbeat_consumer_parms is being displayed at all.
Pipeline script for your scenario:
properties([
parameters([
[$class: 'ChoiceParameter',
choiceType: 'PT_CHECKBOX',
description: 'Select the Application Service from the Dropdown List',
filterLength: 1,
filterable: false,
name: 'application_services_list',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
"return['Could not get the services list']"
],
script: [
classpath: [],
sandbox: false,
script:
"return['heartbeat_consumer', 'surgeon_cloud_login', 'system_configuration']"
]
]
],
[$class: 'DynamicReferenceParameter',
choiceType: 'ET_FORMATTED_HTML',
description: 'SAdd params',
name: 'heartbeat_consumer_parms',
omitValueField: 'true',
referencedParameters: 'application_services_list',
script:
[$class: 'GroovyScript',
script: 'return["Could not get Information"]',
script: [
script: '''
if (application_services_list.equals("heartbeat_consumer")){
inputBox="<input type ='text' id = 'myText' name='value' >"
return inputBox
}
'''
]
]
]
])
])
pipeline {
environment {
vari = ""
}
agent any
stages {
stage ("Example") {
steps {
script{
echo "${params.application_services_list}"
echo '\n'
echo "${params.heartbeat_consumer_parms}"
}
}
}
}
}
Please find the screenshot of the output:
Output of pipeline after build:
this worked for me,
pipeline {
agent any
stages {
stage('Parameters'){
steps {
script {
properties([
parameters([
text(
defaultValue: '''''',
name: 'application_servers',
description: 'Please provide semicolon delimited (;) application server list ',
),
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_CHECKBOX',
description: 'Select Services',
name: 'application_services_list',
referencedParameters: 'application_servers',
script:
[$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script: "return['']"
],
script: [
classpath: [],
sandbox: false,
script: '''
if (application_servers.length() > 0){
return["heartbeat_consumer", "surgeon_cloud_login", "system_configuration"]
}
'''
]
]
],
[$class: 'DynamicReferenceParameter',
choiceType: 'ET_FORMATTED_HTML',
description: 'enter job params',
name: 'hb_job_params',
referencedParameters: 'application_services_list',
script:
[$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script: "return['']"
],
script: [
classpath: [],
sandbox: false,
script: '''
if (application_services_list.contains('heartbeat_consumer')){
return """<textarea name=\"value\" rows=\"5\" class=\"setting-input \"></textarea>"""
}
'''
]
],
omitValueField: true
],
])
])
}
}
}
}
}
I used, DynamicReferenceParameter for using HTML generated textarea however accessing entered textarea values was tricky. after a bit of researching I found that,
The trick for formatting a text input box is to format the HTML in a way that reflects the HTML Jenkins uses to display parameters in a job submission form. The easiest way to do this is to review the HTML Jenkins uses to display an existing String parameter.
src: https://github.com/biouno/uno-choice-plugin/wiki/Using-Uno-Choice-for-Dynamic-Input-Text-Box-Defaults
I use active choice reactive parameter with declarative pipeline. But I ran into a problem.
Is there any way to pass list object into script or call external method?
For example
environments = 'lab\nstage\npro'
List<String> someList = ['ccc', 'ddd']
def someMethod() {
return ['aaa', 'bbb']
}
properties([
parameters([
choice(name: 'ENVIRONMENT', choices: "${environments}"),
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
description: 'Select a choice',
filterLength: 1,
filterable: true,
name: 'choice1',
referencedParameters: 'ENVIRONMENT',
script: [$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: true,
script: 'return ["ERROR"]'
],
script: [
classpath: [],
sandbox: true,
script: """
if (ENVIRONMENT == 'lab') {
return someMethod() // !!! call method
}
else {
return someList // !!! return object
}
""".stripIndent()
]
]
]
])
])
pipeline {
agent any
...
}
I would be grateful for any hints.
Solved it by using string interpolation
List<String> someList = ['ccc', 'ddd']
def someMethod() {
return ['aaa', 'bbb']
}
...
script: """
if (ENVIRONMENT == 'lab') {
return ["${someMethod().join('","')}"] // !!! call method
}
else {
return ["${someList.join('","')}"] // !!! return object
}
""".stripIndent()
UPD: a function call with an argument that is a job parameter.
In this case, the current solution will not work, since the argument variable will be searched for in the external context. You can replace it with params.ParamName:
return ["${someMethod(params.ParamName).join('","')}"]
but then its value will be null.
So, you have to put whole function into parameter script like this:
properties([
parameters([
[$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
filterable: false,
name: 'PartnerName',
script: [$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: true,
script: 'return ["ERROR"]'
],
script: [
classpath: [],
sandbox: true,
script: """
return ["single_partner"]
""".stripIndent()
]
]
],
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
filterLength: 1,
filterable: false,
name: 'AutoCalcParam',
referencedParameters: 'PartnerName',
script: [$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: true,
script: 'return ["ERROR"]'
],
script: [
classpath: [],
sandbox: true,
script: """
def getGFEPartners(String partnerName) {
return [partnerName+'_aaa', partnerName+'_bbb']
}
return getGFEPartners(PartnerName)
""".stripIndent()
]
]
],
And will see expected result:
I'm using the Active Choices Reactive Reference Parameter plugin in a dsl job here the code
parameters {
activeChoiceParam('choice1') {
description('select your choice')
choiceType('RADIO')
groovyScript {
script("return['aaa','bbb']")
fallbackScript('return ["error"]')
}
}
activeChoiceReactiveParam('choice2') {
description('select your choice')
choiceType('RADIO')
groovyScript {
script("if(choice1.equals("aaa")){return ['a', 'b']} else {return ['aaaaaa','fffffff']}")
fallbackScript('return ["error"]')
}
referencedParameter('choice1')
}
and it work's fine what i want now is how to use the activeChoiceReactiveParam in a jenkinsFile for pipeline job i did that :
properties(
[
[
$class : 'ParametersDefinitionProperty',
parameterDefinitions: [
[
$class : 'ChoiceParameterDefinition',
choices : 'aaa\nbbb',
description: 'select your choice : ',
name : 'choice1'
]
but how can i add the choice2 parameter !!!
I was in need of the similar solution.
I did not find any related answers/examples specific to Active Choices plugin anywhere in my google search.
With some R & D, finally I was able to get this done for a pipeline project.
Here is the Jenkinsfile code
properties([
parameters([
[$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
description: 'Select the Env Name from the Dropdown List',
filterLength: 1,
filterable: true,
name: 'Env',
randomName: 'choice-parameter-5631314439613978',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Env\']'
],
script: [
classpath: [],
sandbox: false,
script:
'return["Dev","QA","Stage","Prod"]'
]
]
],
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
description: 'Select the Server from the Dropdown List',
filterLength: 1,
filterable: true,
name: 'Server',
randomName: 'choice-parameter-5631314456178619',
referencedParameters: 'Env',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Environment from Env Param\']'
],
script: [
classpath: [],
sandbox: false,
script:
''' if (Env.equals("Dev")){
return["devaaa001","devaaa002","devbbb001","devbbb002","devccc001","devccc002"]
}
else if(Env.equals("QA")){
return["qaaaa001","qabbb002","qaccc003"]
}
else if(Env.equals("Stage")){
return["staaa001","stbbb002","stccc003"]
}
else if(Env.equals("Prod")){
return["praaa001","prbbb002","prccc003"]
}
'''
]
]
]
])
])
pipeline {
environment {
vari = ""
}
agent any
stages {
stage ("Example") {
steps {
script{
echo 'Hello'
echo "${params.Env}"
echo "${params.Server}"
if (params.Server.equals("Could not get Environment from Env Param")) {
echo "Must be the first build after Pipeline deployment. Aborting the build"
currentBuild.result = 'ABORTED'
return
}
echo "Crossed param validation"
} }
}
}
}
Even you can use "Active Choices Reactive Reference Parameter" with below definitions and rest of the code, follow as in above example.
[$class: 'DynamicReferenceParameter',
choiceType: 'ET_FORMATTED_HTML',
description: 'These are the details in HTML format',
name: 'DetailsInHTML',
omitValueField: false,
randomName: 'choice-parameter-5633384460832175',
referencedParameters: 'Env, Server',
script: [
$class: 'ScriptlerScript',
parameters: [[$class: 'org.biouno.unochoice.model.ScriptlerScriptParameter', name: '', value: '$value']],
scriptlerScriptId: 'script.groovy'
]
]
Note: Ensure you have "," delimiter between multiple parameter definition blocks.
Hope this helps someone.
Instead of using the Active Choices Reactive Reference Parameter i did below and it's working fine !!!
node('slave') {
def choice1
def choice2
stage ('Select'){
choice1 = input( id: 'userInput', message: 'Select your choice', parameters: [ [\$class: 'ChoiceParameterDefinition', choices: 'aa\nbb', description: '', name: ''] ])
if(choice1.equals("aa")){
choice2 = input( id: 'userInput', message: 'Select your choice', parameters: [ [\$class: 'ChoiceParameterDefinition', choices: 'yy\nww', description: '', name: ''] ])
}else{
choice2 = input( id: 'userInput', message: 'Select your choice', parameters: [ [\$class: 'ChoiceParameterDefinition', choices: 'gg\nkk', description: '', name: ''] ])
}
}
}
Thanks a ton #Yogeesh. It helped a lot.
In my case, the requirement was to select multiple instead of one. So, used choiceType: 'PT_CHECKBOX', and it served the purpose.
properties([
parameters([
[$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
description: 'Select the Env Name from the Dropdown List',
filterLength: 1,
filterable: true,
name: 'Env',
randomName: 'choice-parameter-5631314439613978',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Env\']'
],
script: [
classpath: [],
sandbox: false,
script:
'return["Dev","QA","Stage","Prod"]'
]
]
],
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_CHECKBOX',
description: 'Select Servers',
filterLength: 1,
filterable: true,
name: 'Server',
randomName: 'choice-parameter-5631314456178619',
referencedParameters: 'Env',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Environment from Env Param\']'
],
script: [
classpath: [],
sandbox: false,
script:
''' if (Env.equals("Dev")){
return["devaaa001","devaaa002","devbbb001","devbbb002","devccc001","devccc002"]
}
else if(Env.equals("QA")){
return["qaaaa001","qabbb002","qaccc003"]
}
else if(Env.equals("Stage")){
return["staaa001","stbbb002","stccc003"]
}
else if(Env.equals("Prod")){
return["praaa001","prbbb002","prccc003"]
}
'''
]
]
]
])
I made the initial sample work for me.
I had to change ' for " in the return statement return ["a", "b"] and " by ' in the script statement script(' ')
job("MyJob") {
description ("This job creates ....")
//def targetEnvironment=""
parameters {
activeChoiceParam('choice1') {
description('select your choice')
choiceType('RADIO')
groovyScript {
script('return["aaa","bbb"]')
fallbackScript('return ["error"]')
}
}
activeChoiceReactiveParam('choice2') {
description('select your choice')
choiceType('RADIO')
groovyScript {
script(' if(choice1.equals("aaa")) { return ["a", "b"] } else {return ["aaaaaa","fffffff"] } ')
fallbackScript('return ["error"]')
}
referencedParameter('choice1')
}
}
}
Is there any way that we can put the script logic in a function and call
for example:
[$class: 'CascadeChoiceParameter',
choiceType: 'PT_CHECKBOX',
description: 'Select Servers',
filterLength: 1,
filterable: true,
name: 'Server',
randomName: 'choice-parameter-5631314456178619',
referencedParameters: 'Env',
script: [
$class: 'GroovyScript',
fallbackScript: [
classpath: [],
sandbox: false,
script:
'return[\'Could not get Environment from Env Param\']'
],
script: [
classpath: [],
sandbox: false,
script:
''' if (Env.equals("Dev")){
return["devaaa001","devaaa002","devbbb001","devbbb002","devccc001","devccc002"]
}
else if(Env.equals("QA")){
return["qaaaa001","qabbb002","qaccc003"]
}
else if(Env.equals("Stage")){
return["staaa001","stbbb002","stccc003"]
}
else if(Env.equals("Prod")){
return["praaa001","prbbb002","prccc003"]
}
'''
]
]
]```
define below code in funciton and call ?
if (Env.equals("Dev")){
return["devaaa001","devaaa002","devbbb001","devbbb002","devccc001","devccc002"]
}
else if(Env.equals("QA")){ return["qaaaa001","qabbb002","qaccc003"] } else if(Env.equals("Stage")){ return["staaa001","stbbb002","stccc003"] } else if(Env.equals("Prod")){ return["praaa001","prbbb002","prccc003"]
}
Try something like that:
properties(
[
[
$class : 'ParametersDefinitionProperty',
parameterDefinitions: [
[
$class : 'ChoiceParameterDefinition',
choices : 'aaa\nbbb',
description: 'select your choice : ',
name : 'choice1'
],
[
$class : 'ChoiceParameterDefinition',
choices : 'ccc\nddd',
description: 'select another choice : ',
name : 'choice2'
]