2
votes

I have a parameterized pipeline project with active choices parameter, where choice list is dynamically populated by groovy script. I need to retrieve and use current job name in the script. The following line works for me in Freestyle Projects:

def jobName = this.binding.jenkinsProject.name

However when I try to use it in Pipeline Project I get:

No such property: jenkinsProject for class: groovy.lang.Binding

In Retrieving Jenkins job name using groovy script in Active Choice Reactive Parameter it's stated that this has been resolved in Active Choices plugin v1.4. I'm using version 2.2.1 and the issue still persists. Is this property not available in Pipeline Project? Is there a workaround or an alternative?

2

2 Answers

0
votes

If you trying to get the current build job name inside running job There is a builtin env variable for it: JOB_BASE_NAME

You can see list of available env variable in your Jenkins at
http://{hostname}/job/{jobname}/pipeline-syntax/globals
Jest replace hostname with your Jenkins address and jobname with some job you have in your Jenkins.

My Jenkins

  • Jenkins version: 2.176.2
  • Active Choices Plug-in: 2.2.1

Worked with pipeline job.


If you trying to do it in the parameters script I'm not sure that possible.

0
votes

I faced the same issue and came up with a solution. You can use Jenkins pipeline currentBuild variable, more about its properties - open page jenkins-server-url/jenkins/pipeline-syntax/globals on your Jenkins server

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 - job name including upper level folders (I needed exactly this) currentBuild.projectName - just a job name

Unfortunately I didn't manage to place all this logic inside of CascadeChoiceParameter script section. Also I needed only one value, but this approach can be used for a list of values as well, just don't forget about quotes for string values.

Pay attention that such script changes may require script approve from Jenkins admin in jenkins/scriptApproval for EACH incoming value paramValue