【问题标题】:How to retrieve job name in parameterized Jenkins Pipeline Project如何在参数化的 Jenkins 管道项目中检索作业名称
【发布时间】:2019-09-23 08:36:21
【问题描述】:

我有一个带有活动选择参数的参数化管道项目,其中选择列表由 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 中不可用吗?是否有解决方法或替代方法?

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

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

    您可以在 Jenkins 中查看可用环境变量列表
    http://{hostname}/job/{jobname}/pipeline-syntax/globals
    开玩笑地将主机名替换为您的 Jenkins 地址,并将作业名替换为您在 Jenkins 中的一些工作。

    我的詹金斯

    • Jenkins 版本:2.176.2
    • 主动选择插件:2.2.1

    从事流水线作业。


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

    【讨论】:

    • 这些是环境变量,它们仅在构建执行期间可用。我说的是从项目配置中的 groovy 脚本访问作业属性,该脚本在实际运行作业本身之前在“使用参数构建”选项卡中运行。
    【解决方案2】:

    我遇到了同样的问题并想出了一个解决方案。 您可以使用 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

    批准脚本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多