如何在参数化的Jenkins管道项目中检索作业名称

时间:2019-09-23 08:36:21

标签: jenkins jenkins-pipeline

我有一个带有活动的choices参数的参数化管道项目,其中选择列表由groovy脚本动态填充。我需要在脚本中检索和使用当前作业名称。以下行在Freestyle Projects中对我有用:

def jobName = this.binding.jenkinsProject.name

但是,当我尝试在Pipeline Project中使用它时,会得到:

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版,但问题仍然存在。该属性在Pipeline Project中不可用吗?有解决方法还是替代方法?

2 个答案:

答案 0 :(得分:0)

如果您试图获取正在运行的作业中的当前构建作业名称 有一个内置的env变量: JOB_BASE_NAME

您可以在
的Jenkins中查看可用的env变量列表 http://{hostname}/job/{jobname}/pipeline-syntax/globals
开玩笑地用您的詹金斯地址替换主机名,并用您在詹金斯中拥有的某些工作替换工作名。

我的詹金斯

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

处理管道作业。


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

答案 1 :(得分:0)

我遇到了同样的问题,并提出了解决方案。 您可以使用Jenkins管道 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

批准脚本