【问题标题】:Jenkins Active Choice Parameter in Multibranch pipeline多分支管道中的 Jenkins 主动选择参数
【发布时间】:2021-04-17 05:59:12
【问题描述】:

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

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

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

【问题讨论】:

  • 我也非常需要这个。我自己也为此做了一个post。我尽我所能尝试了一切,我有一些经验,但我无法解决它。我会关注这个帖子。我想我有一个解决方法给你,但对我来说,我没有:(

标签: jenkins jenkins-plugins jenkins-groovy


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

【讨论】:

  • 您好,感谢您的努力!我还想以某种方式从 Jenkins 类树中获取 Job 的名称,但我不太擅长 Java,所以我无法弄清楚。我会尝试一下,虽然我不认为我会在生产中使用它,因为它看起来不太稳定。如果您愿意携手努力改进插件,我会很高兴。
  • 是的,不要在产品中使用它。我喜欢。我搜索了如何帮助插件开发,但没有找到方法。
  • 我已经详细回答了here
  • 您的意思是,一旦您第一次运行构建,就会设置参数的值,然后在构建之间保持填充?这很奇怪..
  • 我不会说这很奇怪。此行为也适用于参数。如果您的 Jenkinsfile 具有必须在 GitHub 中定义的参数并创建管道作业,则第一次运行将失败,因为不会呈现参数。您将有一个 Build 按钮,在第一次运行后,它会转换为 BuildWithParameters。这几乎是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
相关资源
最近更新 更多