Jenkins Active Choice Reactive Reference Parameter Formatted HTML in MultiBranch pipeline job 在脚本中获取当前分支名称

Jenkins Active Choice Reactive Reference Parameter Formatted HTML in MultiBranch pipeline job get current branch name in script

我花了很多时间在 MultibranchPipeline 作业中获取 当前分支名称 一个 Active Choice Reactive Reference Parameter Formatted HTML 参数脚本块

[
    $class: 'DynamicReferenceParameter',
    choiceType: 'ET_FORMATTED_HTML',
    name: 'TestParam',
    omitValueField: true,
    description: 'Test.',
    script: [
        $class: 'GroovyScript',
        fallbackScript: [
            classpath: [],
            sandbox: false,
            script: '''
                return """
                    <p>FallbackScript. Error in main script</p>
                """
            '''
        ], 
        script: [
            classpath: [],
            sandbox: false,
            script: '''
                String branchName = env.BRANCH_NAME
                return """
                    <p>${branchName}</p>
                """
            '''
        ]
    ]
]

问题是,我相信,BRANCH_NAME 参数是在您按下 Build 按钮后注入的。

我已经尝试了很多东西,我的意思是,很多,但我仍然没有找到办法。 scm 变量也不存在,我试图用 jenkins.model.Jenkins.instance 找到一些东西,但没有运气。

可能吗?我很想在他们的 Github repo 上问这个问题,但是不允许打开问题。另外,要在 Jenkins 上开一个问题,您需要一个 Jira 帐户或其他东西。 SO是唯一的地方。

看看 Groovy 的 string interpolation

tl;dr 您可以使用 """${variable}

访问值
script: """
    return <p>${env.BRANCH_NAME}</p>
"""

感谢 Michael 的回答,我设法找到了一种方法来完成这项工作。它所包含的内容比表面上看到的要多得多,但我会详细了解所有细节。我也回答了这个问题here.

我假设 reader 熟悉 Active Choices plugin。另外,我在多分支流水线作业中使用了它。您可能会遇到其他类型工作的不同行为。

遗憾的是参数无法访问环境变量。这是一个限制,我希望插件的维护者将来会 fixed/thought。

一些环境变量仅在构建时填充,例如 BRANCH_NAME。在这种情况下,即使我们可以访问环境变量,我们手头也没有实际值。

为了能够使用 env.BRANCH_NAME 我们需要两个反应参数。

该插件有一个名为 FORMATTED_HIDDEN_HTML 的参数。此参数不会显示给用户。这很好,因为我们不希望在多分支管道作业中看到与我们当前所在的分支同名的参数。

要设置这个参数,我们可以在 Jenkinsfile 中写这样的东西。

[
    $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. sandbox 属性 设置为 true。如果不这样做,则需要在 Jenkins 的 ScriptApproval 菜单中接受脚本。
  2. 我们在定义 script 属性.
  3. 时使用三重双引号
script: """
    return '<input name="value" value="${env.BRANCH_NAME}" type="text">'
"""

第一次启动作业时,会填充 BRANCH_NAME 变量。这会导致字符串插值,使您的脚本 属性 处于以下状态:

script: """
    return '<input name="value" value="myBranchName" type="text">'
"""

如果我们使用三重单引号,我们会得到如下错误:

hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No such property: env for class: WorkflowScript

这让我们回到了我们无权访问环境变量的事实。

由此得出什么结论?好吧,如果我们使用三重双引号,first 我们有一个字符串插值,then 脚本是 运行.

  1. 必须使用的HTML元素是input。如果您仔细阅读,这将在文档中进行解释。不仅如此,name 属性 也必须设置为 value。这也在文档中进行了解释。

  2. omitValueField 应设置为 true,否则您的值中会出现尾随逗号。例如:myBranchName,

基本上,第一次 运行 作业时,您会通过字符串插值填充分支名称。只有在第二次构建之后,你才会有使用的价值。您将始终引用以前的值。

之后,您可以通过 referencedParameters 属性.

在其他 Active Choices 参数类型中引用此参数

我迫切需要这个,因为我有一个复杂的用例场景。我正在向 Azure Container Registry 发出请求,以获取某个 分支 .

的某个图像的所有标签

这个插件很棒,我很高兴它存在。我会喜欢更多的文档和示例 thoguh。