Jenkins Active Choice Reactive Reference Parameter在MultiBranch管道作业中删除HTML获取脚本中的当前分支名称

yacmzcpb  于 2023-10-17  发布在  Jenkins
关注(0)|答案(3)|浏览(330)

我花了很长时间试图获取MultibranchPipeline作业中的当前分支名称**,该作业位于**Active Choice Reactive Reference Parameter标记的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帐户或其他东西。这是唯一的地方。

xnifntxz

xnifntxz1#

多亏了迈克尔的回答,我设法找到了一种方法来解决这个问题。有很多比它满足眼睛,但我会通过所有细节。我在这里也回答了这个问题。
我假设读者熟悉Active Choices plugin。此外,我在一个多分支管道作业中使用了这个。你可能会遇到不同的行为与其他类型的工作。
遗憾的是,参数不能访问环境变量。这是一个小的限制,我希望在未来的插件的维护者将被固定/思想。
有些环境变量只在构建时填充,比如BRANCH_NAME。在这种情况下,即使我们可以访问env变量,我们也没有实际的值。
为了能够使用env.BRANCH_NAME,我们需要两个React参数。
该插件有一个名为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菜单中接受脚本。
    1.我们在定义script属性时使用了三重双引号。
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:无此类属性:env for class:WorkflowScript
这让我们回到了我们无法访问环境变量的事实。
从这件事中可以得出什么结论呢?好吧,如果我们使用三重双引号,首先我们有一个字符串插值,然后脚本运行。
1.必须使用的HTML元素是input。如果你仔细阅读的话,这在文档中有解释。不仅如此,name属性也必须设置为value。这一点在文档中也有解释。

  1. omitValueField应该设置为true,否则你会在你的值中得到一个逗号。例如:myBranchName,
    基本上,在第一次运行作业时,通过字符串插值填充分支名称。只有在第二次构建之后,您才有使用的价值。您将始终引用以前的值。
    在所有这些之后,您可以通过referencedParameters属性在其他Active Choices参数类型中引用此参数。
    我非常需要这个,因为我有一个复杂的用例场景。我向Azure Container Registry发出请求,以获取某个分支的某个图像的所有标记。
    这个插件是伟大的,我很高兴它的存在.我会喜欢更多的文档和例子thoguh。
laximzn5

laximzn52#

看看Groovy的字符串插值。
tl;dr您可以使用"""${variable}访问值

script: """
    return <p>${env.BRANCH_NAME}</p>
"""
pokxtpni

pokxtpni3#

您不需要使用2 DynamicReferenceParameter。只需要使用这个普通的参数,后面跟着另一个动态参数。
extendedChoice( defaultValue: "${env.BRANCH_NAME}", name: "branchName", type: 'PT_HIDDEN', value: "${env.BRANCH_NAME}")

相关问题