4

I would like to get all the upstream jobs, just like in the console output:

Started by upstream project "allocate" build number 31
originally caused by: 
Started by upstream project "start" build number 12
originally caused by: 

I've tried groovy postbuild with the following:

def build = Thread.currentThread().executable
def causes= manager.build.getCauses()
for (cause in causes)
{
manager.listener.logger.println "upstream build: " + cause.getShortDescription()

}

but then I only get "allocate", not the "start" job.

I've also tried

def build = Thread.currentThread().executable
def test = build.getUpstreamBuilds()
for (up in test)
{
manager.listener.logger.println "test build project: " + up
}

but this is empty...

Any ideas?

tshepang
  • 12,111
  • 21
  • 91
  • 136
peter
  • 257
  • 1
  • 3
  • 15

1 Answers1

9

You were close with your first solution.

Actually, what you need to do is iterate over the ancestor of this Cause depending on it's type.

Here is a sample snippet of code that could get you started :

def printCausesRecursively(cause) {
     if (cause.class.toString().contains("UpstreamCause")) {
         println "This job was caused by " + cause.toString()
         for (upCause in cause.upstreamCauses) {
             printCausesRecursively(upCause)
         }
     } else {
         println "Root cause : " + cause.toString()
     }
}

for (cause in manager.build.causes)
{
    printCausesRecursively(cause)
}

You may want to refer to the documentation to handle all Cause types : http://javadoc.jenkins-ci.org/hudson/model/Cause.html

Hope it helps,

Best

Y__
  • 1,687
  • 2
  • 11
  • 23
  • Any chance you can adapt it for the System Groovy script? I'm trying to get properties from the upstream job before running the current build, so can't use Postbuild groovy, so can't use manager property (groovy.lang.MissingPropertyException: No such property: manager for class: Script1) – Ivan Mar 26 '14 at 15:24
  • 3
    Got it myself: def build = Thread.currentThread().executable def causes = build.getAction(CauseAction.class).getCauses() for (cause in causes) { ... – Ivan Mar 26 '14 at 16:16