Search code examples
jenkinsgroovyjenkins-pipeline

Groovy script to implement "How to get a parameter depend of other parameter in Hudson or Jenkins"?


Jenkins v2.289.3

I'm trying to implement the Active Choices plugin discussed in one of the answers in in How to get a parameter depend of other parameter in Hudson or Jenkins, but unsure how to implement my second script to get the value from the first parameter.

I have a MyFolder job folder with multi-pipeline job called Builders, with branches like master, release/*, feature/*. So the full name of the jobs in the folder will be MyFolder/Builders/release%2F1.0.0 for the release/1.0.0 job for example (%2F is the escape character for /).

I then created a second job in the same folder called DeployBranchVersion, whose goal is to execute deployment code that deploys a chosen branch and one its corresponding successful build numbers. I therefore need to pass 2 parameters to the deployment code, GIT_BRANCH and VERSION.

My first Active Choices parameter gets these branches using the following script, and assigns the choice to the GIT_BRANCH parameter.

Job name: MyFolder/DeployBranchVersion
Parameter name: GIT_BRANCH

Groovy script:
def gettags = "git ls-remote -h -t https://username:[email protected]/organization/myrepo.git".execute()
def branches = []
def t1 = []
gettags.text.eachLine {branches.add(it)}
for(i in branches)
    t1.add(i.split()[1].replaceAll('\\^\\{\\}', '').replaceAll('refs/heads/', '').replaceAll('refs/tags/', ''))
t1 = t1.unique()
return t1

This returns a drop-down list of the branches in my repo, and the chosen one is assigned to the GIT_BRANCH parameter.

Now how do I setup the second Active Choices Reactive parameter to reference the above choice? I have the following Groovy code that works in a non-Active-Choice parameter setup. How can I modify it to work in this case? The BUILD_JOB_NAME needs to reference the GIT_BRANCH value from the first parameter?

import hudson.model.*

BUILD_JOB_NAME = "some_reference_to_GIT_BRANCH" // ??????????

def getJobs() {
    def hi = Hudson.instance
    return hi.getItems(Job)
}

def getBuildJob() {
    def buildJob = null
    def jobs = getJobs()
    (jobs).each { job ->
        if (job.fullName == BUILD_JOB_NAME) {
            buildJob = job
        }
    }
    return buildJob
}

def getAllBuildNumbers(Job job) {
    def buildNumbers = []
    (job.getBuilds()).each { build ->
        def status = build.getBuildStatusSummary().message
        if (status.contains("stable") || status.contains("normal")) {
           buildNumbers.add("${build.displayName}")
        }
    }
    return buildNumbers
}

def buildJob = getBuildJob()
return getAllBuildNumbers(buildJob)

I tried setting it this way to ho avail.

BUILD_JOB_NAME = "MyFolder/Builders/$GIT_BRANCH"

Solution

  • Turns out I was doing it correctly, I just had a buggy 2nd script. Here's the good one. I realized that GIT_BRANCH values had / in them so I had to replace them with the equivalent escape character %2F.

    import hudson.model.*
    
    BRANCH = GIT_BRANCH.replaceAll("/", "%2F")
    BUILD_JOB_NAME = "MyFolder/Builders/$BRANCH"
    
    def getJobs() {
        def hi = Hudson.instance
        return hi.getAllItems(Job.class)
    }
    
    def getBuildJob() {
        def buildJob = null
        def jobs = getJobs()
        (jobs).each { job ->
            if (job.fullName == BUILD_JOB_NAME) {
                buildJob = job
            }
        }
        return buildJob
    }
    
    def getAllBuildNumbers(Job job) {
        def buildNumbers = []
        (job.getBuilds()).each { build ->
            def status = build.getBuildStatusSummary().message
            if ((status.contains("stable") || status.contains("normal")) &&
                  build.displayName.contains("-")) {
               buildNumbers.add(build.displayName)
            }
        }
        return buildNumbers
    }
    
    def buildJob = getBuildJob()
    return getAllBuildNumbers(buildJob)