多分支管道中的 Jenkins 主动选择参数

时间:2021-04-14 10:41:18

标签: jenkins jenkins-plugins jenkins-groovy

我想将 Jenkins 中的 Active Choice 参数用于以下目的:
我的项目开发人员想要为不同的分支运行 Jenkins 构建,这基本上是喊“Multibranch”!!问题是,如果 repo 中的最新提交未标记,开发人员希望在 Job 页面(您点击 BUILD 的位置)中收到通知。

如果我让开发人员通过参数(例如 Git 参数)选择他想要构建的分支,然后使用 Active Choice Reference Parameter 引用所选值,我可以轻松做到这一点。

问题是,如果我想使用 Multibranch Pipeline,有没有办法在 Active Choice Parameter 脚本中知道选择了哪个分支?我实际上怀疑是否有这种可能性,但我想在我想到另一个解决方案之前我会在这里问..

1 个答案:

答案 0 :(得分:1)

Active Choices 参数真的很酷,但同时又很奇怪。而且文档也很缺乏,非常非常糟糕。

我想我有一个适合您的解决方法,但取决于您使用的 Active Choice 参数类型,这可能对您有用,也可能不适合。 P.S.:这个方案真的不优雅。

[
    $class: 'ChoiceParameter',
    choiceType: 'PT_SINGLE_SELECT',
    description: '',
    filterable: true,
    name: 'TestParam',
    description: 'A description.',
    script: [
        $class: 'GroovyScript',
        fallbackScript: [
            classpath: [],
            sandbox: false,
            script: '''
                return ['error']
            '''
        ], 
        script: [
            classpath: [],
            sandbox: false,
            script: '''
                def branchNameRex = ".+?/job/.+?/job/([^/]+)/.*"
                def threadName = Thread.currentThread().toString()
                def branchName = (threadName =~ branchNameRex)[0][1]
                return [branchName]
            '''
        ]
    ]
]

因此,如果您足够幸运需要将 ChoiceParameterPT_SINGLE_SELECT 一起使用,并且还处于多分支流水线作业中,那么这应该可行。

推理。 Thread.currentThread().toString() 返回当前作业的完整路径,幸运的是包含分支名称。使用该正则表达式,我只能获得分支名称,例如 feature/somethingmain

对我来说很遗憾,我用 DynamicReferenceParameterET_FORMATTED_HTML 尝试了它,而 Thread.currentThread().toString() 返回了别的东西。

这也可能取决于插件的版本,我不确定,但我已经这样做了,并且在特定情况下有效。

更新

好吧,经过大量的挖掘,我自己也玩了很多,我想我有一个解决方案。您需要两个参数才能完成这项工作。

有一个 FORMATTED_HIDDEN_HTML 参数类型不会显示给用户。我们将这个参数定义如下

[
    $class: 'DynamicReferenceParameter',
    choiceType: 'ET_FORMATTED_HIDDEN_HTML',
    name: 'BranchName',
    omitValueField: true,
    script: [
        $class: 'GroovyScript',
        fallbackScript: [
            classpath: [],
            sandbox: true,
            script: '''
                return '<p>error</p>'
            '''
        ], 
        script: [
            classpath: [],
            sandbox: true,
            script: """
                return '<input name="value" value="${env.BRANCH_NAME}" type="text">'
            """
        ]
    ]
]

这里有几件重要的事情需要注意。

  1. 返回类型必须是输入类型,否则将无法访问其值
  2. 它需要将属性 name 设置为 value

这些在 docs 中有描述。 3. 注意脚本的三重双引号 """。这是做什么的,它使用带有 ${env.BRANCH_NAME} 的字符串插值。这个值一开始不存在。只有在您按下 Build 后,它才会被填充。

基本上,从第二个构建开始,此参数将与分支名称保持不变。如果您有一个多分支管道工作,这非常好。

之后,您可以将其用作其他反应式参数中的参考参数。

感谢 Michaelmy question 的回答,我设法弄明白了这一点。我不知道它是否适合您的需求,但对我来说它是完美的。

相关问题