groovy 如何在Jenkins管道中将级联选择参数的referencedParameters值发送到ScriptlerScript

8zzbczxx  于 2023-03-07  发布在  Jenkins
关注(0)|答案(1)|浏览(227)

我在Jenkins管道的properties部分声明2个参数:

  • 数据中心(可以有多种环境类型)
  • 环境类型

数据中心类型为选择参数;从数据库中检索该列表;当下拉列表中的数据中心发生变化时,环境类型应相应地填充,也可以通过ScriptlerScript从数据库填充。
问题是,当更改数据中心上的选择时,环境类型列表没有任何变化,该列表是具有referencedParameters的CascadeChoiceParameter**:“数据中心”**。
我应该如何将引用的参数链接到我正在使用的scriptlet脚本-我必须发送什么?

**[名称:“数据中心”,值:“$DataCenter”]**表示第二个参数-当第一个下拉列表值更改时,该值不发送到ScriptletScript。

如果我在Configure部分下从Jenkins接口定义2个参数(因此不通过DSL管道),则一切都按预期工作。
使用propertiessection以外的内容对我来说不起作用-我尝试在pipelinesection内使用activeChoiceParameter,但收到错误“Build parameters definitions cannot have blocks @ line(...)”,这是一个已知问题(请参见下面的第一个示例链接)。
我用过的例子:
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 {
...

**预期结果:**当数据中心发生变化时,将填充第二个下拉列表
**实际结果:**数据中心更改时无任何React

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

rta7y2nd

rta7y2nd1#

有一点要记住:* * 脚本不安全,不应使用它们: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的groovy代码是(但也可以从DB中检索):

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变量将Map为其值。请注意,应将DataCenter作为脚本程序的参数添加到UI参数**部分。
该解决方案的积分归CloudBees所有。

相关问题