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

时间:2019-05-21 17:56:40

标签: jenkins groovy jenkins-pipeline

我在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中配置了参数的管道-表现正常(数据中心更改时加载的环境类型):

screenshot

1 个答案:

答案 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所有。