我在Jenkins管道的 properties 部分中声明了2个参数:
数据中心的类型为 ChoiceParameter ;该列表是从数据库中检索的;当数据中心在下拉列表中更改时,环境类型也应通过 ScriptletScript 从数据库相应地填充。
问题在于,在数据中心上更改选择时,环境类型列表没有任何反应,环境类型列表是具有 referencedParameters:'DataCenter'的 CascadeChoiceParameter 。
我应该如何将引用的参数链接到我正在使用的scriptlet脚本-我必须发送什么?
问题出在第二个参数 [name:'DataCenter',值:'$ DataCenter'] 上-当第一个下拉值更改时,该值未发送到ScriptletScript。 />
如果我从Jenkins接口定义了2个参数(而不是通过DSL管道),则在 Configure 部分下,一切按预期进行。
使用 properties 部分以外的其他内容对我来说不起作用-我尝试在 pipeline 部分中使用 activeChoiceParameter ,但出现错误“ 构建参数定义不能包含@行(...)'块,这是一个已知问题(请参见下面的第一个示例链接)。
我使用的示例:
Jenkinsfile Active Choice Parameter
Active Choices Reactive Reference Parameter in jenkins pipeline
properties([
parameters([
[
$class: 'ChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
name: 'DataCenter',
script: [
$class: 'ScriptlerScript',
scriptlerScriptId:'getdatacenters.groovy',
parameters: [
[name:'StatusId', value:'']
]
]
],
[
$class: 'CascadeChoiceParameter',
choiceType: 'PT_SINGLE_SELECT',
name: 'EnvironmentType',
script: [
$class: 'ScriptlerScript',
scriptlerScriptId:'getenvtypesbydatacenter.groovy',
referencedParameters: 'DataCenter',
parameters: [
[name:'DataCenter', value: '$DataCenter']
]
]
]
])
])
pipeline {
...
预期结果:当数据中心发生更改时,第二个下拉列表将填充
实际结果:数据中心发生变化时什么也没有发生
在UI中配置了参数的管道-表现正常(数据中心更改时加载的环境类型):
答案 0 :(得分:0)
请记住一件事:脚本编写者并不安全,您不应使用它们:https://wiki.jenkins.io/display/JENKINS/Scriptler+Plugin!。
话虽如此,如果您仍然想继续使用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"]'],
]
]
])
])
出于演示目的, getdatacenters.groovy 的常规代码是(但也可以从数据库中检索):
return["Dev","Prod"]
getenvtypesbydatacenter.groovy 的常规代码如下:
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:'DataCenter'不在脚本块中,而是在“根”级。如果需要更多参数,可以用逗号分隔。
由于 DataCenter 是引用的参数,并且会自动传输到脚本编写器,因此SQL查询中的 $ DataCenter 变量将与其值进行映射。注意,应在UI Parameters 部分中将DataCenter作为脚本编写器的参数添加。
该解决方案的积分归CloudBees所有。