如何将CascadeChoiceParameter的Jenkins管道中的referencedParameters值发送到ScriptlerScript

如何将CascadeChoiceParameter的Jenkins管道中的referencedParameters值发送到ScriptlerScript,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我在Jenkins管道的属性部分声明了两个参数: 数据中心(可以有多种环境类型) 环境类型 数据中心类型为ChoiceParameter;从数据库中检索列表;当下拉列表中的数据中心发生更改时,环境类型也应通过ScriptlerScript相应地从数据库中填充 问题是,在更改数据中心上的选择时,环境类型列表不会发生任何变化,该列表是一个带有referencedParameters的CascadeChoiceParameter:“数据中心” 我应该如何将引用的参数链接到我正在使用的scriptl

我在Jenkins管道的属性部分声明了两个参数:

  • 数据中心(可以有多种环境类型)
  • 环境类型
数据中心类型为ChoiceParameter;从数据库中检索列表;当下拉列表中的数据中心发生更改时,环境类型也应通过ScriptlerScript
相应地从数据库中填充 问题是,在更改数据中心上的选择时,环境类型列表不会发生任何变化,该列表是一个带有referencedParameters的CascadeChoiceParameter:“数据中心”

我应该如何将引用的参数链接到我正在使用的scriptlet脚本-我必须发送什么

问题在于第二个参数的[名称:'DataCenter',值:'$DataCenter']-当第一个下拉值更改时,该值不会发送到ScriptletScript。

如果我从Jenkins界面(因此不是通过DSL管道)在Configure部分下定义2个参数,那么一切都会按预期进行。

使用除属性部分以外的其他内容对我不起作用-我曾尝试在管道部分内使用activeChoiceParameter,但我收到一个错误“生成参数定义不能有块@line(…)”,这是一个已知问题(请参见下面的第一个示例链接)。

我使用过的示例:

属性([
参数([
[
$class:“ChoiceParameter”,
选择类型:'PT\u SINGLE\u SELECT',
名称:“数据中心”,
脚本:[
$class:'ScriptlerScript',
scriptlerScriptId:'getdatacenters.groovy',
参数:[
[名称:'StatusId',值:“”]
]
]
],
[
$class:'CascadeChoiceParameter',
选择类型:'PT\u SINGLE\u SELECT',
名称:“环境类型”,
脚本:[
$class:'ScriptlerScript',
scriptlerScriptId:'getenvtypesbydatacenter.groovy',
referencedParameters:“数据中心”,
参数:[
[名称:'DataCenter',值:'$DataCenter']
]
]
]
])
])
管道{
...
预期结果:当数据中心更改时,第二个下拉列表将填充
实际结果:数据中心发生变化时不会发生任何变化

在UI中配置参数的管道-行为正常(数据中心更改时加载的环境类型):


要记住一件事:脚本编写者不安全,你不应该使用他们:!

话虽如此,如果您仍然想继续使用Scriptler插件和CascadeChoiceParameter,代码可能如下所示:

properties([
    parameters([
        [
            $class: 'ChoiceParameter', 
            choiceType: 'PT_SINGLE_SELECT', 
            name: 'DataCenter', 
            randomName: 'datacenter-choice-parameter-102102304304506506', 
            script: [
                $class: 'ScriptlerScript', 
                scriptlerScriptId:'getdatacenters.groovy',
                fallbackScript: [ classpath: [], script: 'return ["N/A"]']
            ]
        ],
        [
            $class: 'CascadeChoiceParameter',
            choiceType: 'PT_SINGLE_SELECT',
            name: 'EnvironmentType', 
            randomName: 'envtype-choice-parameter-101012020230303404', 
            referencedParameters: 'DataCenter',
            script: [
                $class: 'ScriptlerScript',
                scriptlerScriptId:'getenvtypesbydatacenter.groovy',
                fallbackScript: [ classpath: [], script: 'return ["N/A"]'],
            ]
        ]
    ])
])
import groovy.sql.Sql
import jenkins.model.*

nodes = Jenkins.instance.globalNodeProperties
nodes.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
sql = Sql.newInstance("jdbc:sqlserver://SQLServerHere;connectionDataHere", "com.microsoft.sqlserver.jdbc.SQLServerDriver")

envTypes = sql.rows("exec [DbHere].[schema].[GetEnvTypes] @DataCenter = $DataCenter").collect({ query -> query.EnvTypeName})
envTypes.add(0,'')
return envTypes
出于演示目的,getdatacenters.groovy的groovy代码是(但也可以从数据库中检索):

getenvtypesbydatacenter.groovy的groovy代码可能如下所示:

properties([
    parameters([
        [
            $class: 'ChoiceParameter', 
            choiceType: 'PT_SINGLE_SELECT', 
            name: 'DataCenter', 
            randomName: 'datacenter-choice-parameter-102102304304506506', 
            script: [
                $class: 'ScriptlerScript', 
                scriptlerScriptId:'getdatacenters.groovy',
                fallbackScript: [ classpath: [], script: 'return ["N/A"]']
            ]
        ],
        [
            $class: 'CascadeChoiceParameter',
            choiceType: 'PT_SINGLE_SELECT',
            name: 'EnvironmentType', 
            randomName: 'envtype-choice-parameter-101012020230303404', 
            referencedParameters: 'DataCenter',
            script: [
                $class: 'ScriptlerScript',
                scriptlerScriptId:'getenvtypesbydatacenter.groovy',
                fallbackScript: [ classpath: [], script: 'return ["N/A"]'],
            ]
        ]
    ])
])
import groovy.sql.Sql
import jenkins.model.*

nodes = Jenkins.instance.globalNodeProperties
nodes.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
sql = Sql.newInstance("jdbc:sqlserver://SQLServerHere;connectionDataHere", "com.microsoft.sqlserver.jdbc.SQLServerDriver")

envTypes = sql.rows("exec [DbHere].[schema].[GetEnvTypes] @DataCenter = $DataCenter").collect({ query -> query.EnvTypeName})
envTypes.add(0,'')
return envTypes
这里需要注意的最重要的一点是,referencedParameters:“数据中心”不在脚本块内,而是在“根”级别。如果需要更多参数,可以用逗号分隔它们

由于数据中心是一个被引用的参数,并自动传输到scriptler,$DataCenter变量将从SQL查询内部与其值进行映射。请注意,数据中心应作为scriptler的参数添加到UI参数部分

解决方案的积分归CloudBees所有