如何在 Jenkins 管道脚本中使用扩展选择参数插件?

How can I use the Extended Choice Parameter plugin in a Jenkins pipeline script?

扩展选择参数插件很棒,我在通过 UI https://wiki.jenkins-ci.org/display/JENKINS/Extended+Choice+Parameter+plugin

配置的作业中使用它

但是,我正在努力让它在 Jenkinsfile 风格的管道脚本中工作。 由于 Jenkins 管道语法生成器创建了以下代码片段,因此扩展选择参数插件似乎尚未与管道脚本完全兼容:

parameters([<object of type com.cwctravel.hudson.plugins.extended_choice_parameter.ExtendedChoiceParameterDefinition>])

如果我手动创建参数,我会得到与中提到的相同的行为 https://issues.jenkins-ci.org/browse/JENKINS-32188

org.kohsuke.stapler.NoStaplerConstructorException: There's no @DataBoundConstructor on any constructor of class 

有谁知道可以解决 ExtendedChoiceParameterDefinition 不使用 @DataBoundConstructor 问题的解决方法吗?

就像mkobit所说的,目前无法使用扩展选择插件作为构建参数。

我喜欢使用如下结构作为解决方法

timeout(time: 5, unit: TimeUnit.MINUTES) {
    def result = input(message: 'Set some values', parameters: [
        booleanParam(defaultValue: true, description: '', name: 'SomeBoolean'),
        choice(choices: "Choice One\nChoice Two", description: '', name: 'SomeChoice'),
        stringParam(defaultValue: "Text", description: '', name: 'SomeText')
    ]) as Map<String, String>
}

echo "${result.SomeBoolean}, ${result.SomeChoice}, ${result.SomeText}"

并在我的管道的开头调用它。构建开始后不久,系统会要求您提供这些输入。

这是我针对此 pb 的解决方法:

https://gist.github.com/jgraglia/44a7443847cff6f0d87387a46c7bb82f

即:通过声明所有参数来手动实例化参数

我能够用它向我的管道添加一个多清单参数。

自 2019 年 4 月 2 日起,由于此提交,现在可以实现了:https://github.com/jenkinsci/extended-choice-parameter-plugin/pull/25

你可以这样使用,例如:

properties([
    parameters([
        extendedChoice( 
            name: 'PROJECT', 
            defaultValue: '', 
            description: 'Sélectionnez le projet à construire.', 
            type: 'PT_SINGLE_SELECT', 
            groovyScript: valueKeysScript,
            descriptionGroovyScript: valueNamesScript
        )
    ])
])

如果您想知道每个可能的参数,您必须refer to the source code。 如果您想知道 "type" 键的每个可能值,have a look at the PT_* constants.

导航到您的http://jenkins-url.com/pipeline-syntax

在示例步骤下拉列表中 select 'Properties: Set job properties'

有'This project is parameterized'的复选框,然后可以select添加参数>扩展选择参数。在那里添加菜单项,然后单击 'Generate Pipeline Script' 进行转换。

Trim 所以你删除之前的 'properties([parameters([' 和之后的 '])])':

extendedChoice(defaultValue: 'whatif', description: 'Run as what if?', multiSelectDelimiter: ',', name: 'whatif', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_SINGLE_SELECT', value: 'whatif, LIVE', visibleItemCount: 2)

适合我:

我需要从 Nexus Repo 中检索工件的所有版本号:

 properties ([
    parameters([
        choice(choices: ['PROD', 'DEV', 'QA'], description: '', name: 'ParamEnv' ),   
        string(name: 'ParamVersion', defaultValue: '', description: 'Version to deploy'),
        extendedChoice(
            name: 'someName',
            description: '',
            visibleItemCount: 50,
            multiSelectDelimiter: ',',
            type: 'PT_SINGLE_SELECT',
            groovyScript: '''
            import groovy.json.JsonSlurper
                List<String> nexusPkgV = new ArrayList<String>()        
                def pkgObject = ["curl", "https://xxxx:xxxx@xxxxxxxxxx"].execute().text
                def jsonSlurper = new JsonSlurper()
                def artifactsJsonObject = jsonSlurper.parseText(pkgObject)
                def dataA = artifactsJsonObject.items
                for (i in dataA) {
                    nexusPkgV.add(i.version)
                }
            return nexusPkgV
            '''
        )
    ])
]) 

使用以下代码构建多选复选框参数:

parameters {
  extendedChoice description: '', multiSelectDelimiter: ',', name: 'a', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', value: 'a,b,c', visibleItemCount: 3
}

在 Jenkins 中看起来像 UI:

使用Declarative Directive Generator生成各种使用扩展选择参数插件的流水线源代码