如何在参数化的Jenkins流水线项目中检索作业名称

3

我有一个参数化的流水线项目,其中使用了Active Choices参数,选项列表是通过Groovy脚本动态生成的。我需要在脚本中获取并使用当前作业名称。在自由风格项目中,以下代码适用于我:

def jobName = this.binding.jenkinsProject.name

然而,当我尝试在流水线项目中使用它时,我遇到了以下问题:
No such property: jenkinsProject for class: groovy.lang.Binding

Retrieving Jenkins job name using groovy script in Active Choice Reactive Parameter中指出,这个问题在Active Choices插件v1.4中已解决。我使用的是版本2.2.1,但问题仍然存在。这个属性在管道项目中不可用吗?有没有解决方法或替代方案?
3个回答

0

如果您正在运行的作业中尝试获取当前构建作业名称,则有一个内置的环境变量可用:JOB_BASE_NAME

您可以在Jenkins中查看可用环境变量列表,网址为:
http://{hostname}/job/{jobname}/pipeline-syntax/globals
请将主机名替换为您的Jenkins地址,将作业名称替换为您在Jenkins中拥有的某个作业。

我的Jenkins

  • Jenkins版本:2.176.2
  • Active Choices插件:2.2.1

适用于流水线作业。


如果您尝试在参数脚本中执行此操作,我不确定是否可能。


这些是环境变量,它们仅在构建执行期间可用。我正在谈论从Groovy脚本中访问项目配置中“带参数构建”选项卡中运行的作业属性,该选项卡在实际运行作业之前运行。 - MaroonedMind

0

所以对于仍在寻找解决此问题的人来说,实际上有三种方法可以解决这个问题。

  1. jenkinsProject变量在Pipeline作业中不可用的原因是由于活动选择插件本身存在问题。您可以在以下票证中了解更多信息:https://issues.jenkins.io/browse/JENKINS-29407。在GitHub上的Active Choices项目中有一个单独的功能分支(有点)解决了这个问题:https://github.com/jenkinsci/active-choices-plugin/tree/pipeline-support。它没有合并到主分支中(看起来永远不会),因为将其添加到Pipeline作业中会破坏Freestyle作业的此功能。您可以自己从源代码编译插件并安装在Jenkins上。Pipeline作业将在其活动选择参数中具有绑定变量,但是Freestyle作业将不再具有它们。仅在以下两种情况无法使用时才使用此选项。
  2. 您可以使用properties{}步骤从管道运行配置作业参数。在管道运行期间,您可以简单地使用JOB_BASE_NAME环境变量作为GString表达式,将其作为脚本文本传递。这里唯一的缺点是参数仅在第一次构建后才可用。因此,如果您有一个新作业,则需要触发它一次才能使其成为参数化。
  3. 您可以使用input()步骤。您的作业将不会被参数化,但用户将能够在其运行期间为构建提供输入。如果您需要它由其他作业或外部Webhook触发,则不是非常方便,但对于仅预计手动触发作业的情况,这可能是最佳选择。

0
我遇到了同样的问题,并想出了一个解决方案。 你可以使用 Jenkins pipeline 的 currentBuild 变量,更多关于它的属性 - 在你的 Jenkins 服务器上打开页面 jenkins-server-url/jenkins/pipeline-syntax/globals
String currentJobParentFolderName = currentBuild.fullProjectName.split('/')[0]
String currentJobName = currentBuild.projectName
String paramValue = getParamValue(currentJobName)

properties([
        buildDiscarder(logRotator(daysToKeepStr: '10')),
        disableResume(),
        parameters([
                [$class: 'CascadeChoiceParameter',
                 name: 'PARAM',
                 choiceType: 'PT_SINGLE_SELECT',
                 description: 'param1',
                 filterLength: 1,
                 filterable: false,
                 randomName: 'choice-parameter-99999999999',
                 script: [
                         $class: 'GroovyScript',
                         fallbackScript: [
                                 classpath: [],
                                 sandbox: false,
                                 script:
                                         'return ["Failed to get values"]'
                         ],
                         script: [
                                 classpath: [],
                                 sandbox: false,
                                 script:
                                         """return ['$paramValue']"""
                         ]
                 ]
                ]
        ])
])

timestamps {
    job's main logic
}

private static def getParamValue(String jobName) {
    Map paramValMapping = [
            'jobName1': 'value1', 
            'jobName2': 'value2',  
    ]
    String paramValue = paramValMapping.get(jobName)
    if (!paramValue) {
        throw new Exception("Failed to get value")
    }
    return paramValue
}

currentBuild.fullProjectName - 包括上层文件夹的作业名称(我需要这个)
currentBuild.projectName - 只是一个作业名称

不幸的是,我没有成功将所有这些逻辑放在CascadeChoiceParameter脚本部分内。
此外,我只需要一个值,但是这种方法也可以用于值列表,只需不要忘记为字符串值添加引号。

请注意,这样的脚本更改可能需要Jenkins管理员在jenkins/scriptApproval中批准每个传入值paramValue


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接