我想将 Jenkins 中的 Active Choice 参数用于以下目的:
我的项目开发人员想要为不同的分支运行 Jenkins 构建,这基本上是喊“Multibranch”!!问题是,如果 repo 中的最新提交未标记,开发人员希望在 Job 页面(您点击 BUILD 的位置)中收到通知。
如果我让开发人员通过参数(例如 Git 参数)选择他想要构建的分支,然后使用 Active Choice Reference Parameter 引用所选值,我可以轻松做到这一点。
问题是,如果我想使用 Multibranch Pipeline,有没有办法在 Active Choice Parameter 脚本中知道选择了哪个分支?我实际上怀疑是否有这种可能性,但我想在我想到另一个解决方案之前我会在这里问..
答案 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]
'''
]
]
]
因此,如果您足够幸运需要将 ChoiceParameter
与 PT_SINGLE_SELECT
一起使用,并且还处于多分支流水线作业中,那么这应该可行。
推理。 Thread.currentThread().toString()
返回当前作业的完整路径,幸运的是包含分支名称。使用该正则表达式,我只能获得分支名称,例如 feature/something
或 main
。
对我来说很遗憾,我用 DynamicReferenceParameter
和 ET_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">'
"""
]
]
]
这里有几件重要的事情需要注意。
name
设置为 value
。这些在 docs 中有描述。
3. 注意脚本的三重双引号 """
。这是做什么的,它使用带有 ${env.BRANCH_NAME}
的字符串插值。这个值一开始不存在。只有在您按下 Build 后,它才会被填充。
基本上,从第二个构建开始,此参数将与分支名称保持不变。如果您有一个多分支管道工作,这非常好。
之后,您可以将其用作其他反应式参数中的参考参数。
感谢 Michael 对 my question 的回答,我设法弄明白了这一点。我不知道它是否适合您的需求,但对我来说它是完美的。