Accessing the current Jenkins build in Groovy scri

2020-06-16 05:10发布

问题:

I have created a Groovy script which is used in a System Groovy Script step in a Jenkins job which needs to access the current build of the current job.

The current build is required when using an Hudson.model Cause.UpstreamCause to link the current build of my current job to a dependent job that I am scheduling.

Since code is more concise:

my-job-step.groovy:

def scheduleDependentJob(jobName) {
  def fooParam = new StringParameterValue('foo', 'bar');
  def paramsAction = new ParametersAction(fooParam)

  println "Scheduling dependent job"
  def currentJob = ???
  def cause = new Cause.UpstreamCause(currentBuild)
  def causeAction = new hudson.model.CauseAction(cause)
  instance.queue.schedule(job, 0, causeAction, paramsAction)
}

The CauseAction constructor (Seen on http://javadoc.jenkins-ci.org/hudson/model/Cause.UpstreamCause.html) requires a Run object, which the current build object should be an instance of. I just can't find a good way to get the current running job build inside of a Groovy script.

回答1:

If in your Jenkins job you are using Groovy plug-in, then inside Execute system Groovy script step the plug-in already provides you access to some predefined variables:

build
    The current AbstractBuild.
launcher
    A Launcher.
listener
    A BuildListener.
out
    A PrintStream (listener.logger).

For example:

println build.getClass()

Outputs:

class hudson.model.FreeStyleBuild


回答2:

This is the snippet I have been looking for!

import hudson.model.*
def currentBuild = Thread.currentThread().executable

This fits in with my above script like so:

import hudson.model.*


def scheduleDependentJob(jobName) {
  def fooParam = new StringParameterValue('foo', 'bar');
  def paramsAction = new ParametersAction(fooParam)

  println "Scheduling dependent job"
  def currentBuild = Thread.currentThread().executable
  def cause = new Cause.UpstreamCause(currentBuild)
  def causeAction = new hudson.model.CauseAction(cause)
  instance.queue.schedule(job, 0, causeAction, paramsAction)
}


回答3:

This completes the answer from luka5z to exemplify how scriptler passes the listener to the groovy script:

import jenkins.model.*;
import hudson.model.*;
import hudson.util.*;
import hudson.tasks.*;
import hudson.plugins.git.*;
import hudson.scm.*
import jenkins.scm.*

def build = Thread.currentThread()?.executable
//def svn_branch = build.buildVariableResolver.resolve("SVN_BRANCH")

if (build instanceof AbstractBuild){
    def workspace = build.workspace
    //def job = build.parent
    def scm = build.parent.scm;
    //println "scm: $scm"

    if (scm instanceof hudson.scm.SubversionSCM) {
        scm.checkout(build, null/*Launcher*/, workspace /*workspace*/, listener/*listener*/, null /*changelogfile*/,null/*baseline*/)
    }else if (scm instanceof hudson.plugins.git.GitSCM) {
        scm.checkout(build, null/*Launcher*/, workspace /*workspace*/, listener/*listener*/, null /*changelogfile*/,null/*baseline*/)
    }
}

listener in Scriptler