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 的回答,我设法解决了这个问题。我不知道它是否适合您的需求,但对我来说它是完美的。