If job A was a Multijob, you can do this using Extended Email plugin together with a pre-send script which traverses the sub jobs to get their results and prepare the email body.
Sample script:
// Scan all downstream jobs of a MultiJob and prepare the final email text
import hudson.model.*
import com.tikal.jenkins.plugins.multijob.*
// Get some environment vars
def url = build.envVars['JENKINS_URL'].replaceAll('/*$', '')
// Set summary header
def result = build.getResult()
def h2 = ''
switch (result) {
case 'ABORTED':
h2 = '''<h2>Your job was aborted</h2>
<h3>Aborts usually have one of two reasons:</h3>
<ol>
<li>Manual abort</li>
<li>Timeout</li>
</ol>'''
break
case 'FAILURE':
h2 = '<h2>Your job has failed</h2>'
break
case 'SUCCESS':
h2 = '<h2>Your job was successfull</h2>'
break
}
def header = h2
header += '<h3>Job status summary</h3>'
header += '<a href="' + url + '/' + build.getUrl() + '">' + build.getProject().getFullName() + ' #' + build.getNumber() + ': ' + result + '</a>'
header += '<ul style="list-style: none; ">'
// Initialize data structure
def data = [
subJobs: 0,
failed: false,
sum: header,
url: url
]
// Recursive method to create status summary for all sub jobs
// Params:
// - job: a multijob object
// - a data structure as defined above
// Returns:
// - A modified data structure with updated sum and failed fields
Map collectResults(build, data) {
// Iterate over sub builds
build.getSubBuilds().each { subBuild ->
def theBuild = subBuild.getBuild()
data['subJobs'] += 1
// Get sub build's metadata
def subName = theBuild.getProject().getFullName()
def subNumber = subBuild.getBuildNumber()
def subUrl = data['url'] + '/' + subBuild.getUrl()
def result = subBuild.getResult()
def failed = (result == "FAILURE")
// Update overall status
data['failed'] = data['failed'] || failed
// Append to summary
data['sum'] += '<li><a href="' + subUrl + '">' + subName + ' #' + subNumber + ': ' + result + '</a></li>'
// Recurse, if current sub build is a MultiJobBuild itself
if (theBuild instanceof com.tikal.jenkins.plugins.multijob.MultiJobBuild) {
data['sum'] += '<li><ul style="list-style: none; ">'
data = collectResults(theBuild, data)
data['sum'] += '</ul></li>'
}
}
return data
}
try {
// Collect results of all sub jobs
data = collectResults(build, data)
def summary = data['sum']
summary += '</ul>'
summary += '<h3>Additional information</h3>'
summary += '<a href="' + build.envVars['JOB_URL'] + '">Main job page</a><br>'
// Set message body
msg.setContent(summary, 'text/html')
}
catch(Exception e) {
log("ERROR: ${e.message}")
log("ERROR: Failed status report aggregation")
}
HTH...
--
Dirk Heinrichs
Senior Systems Engineer, Delivery Pipeline
OpenText ™ Discovery | Recommind
Recommind GmbH, Von-Liebig-Straße 1, 53359 Rheinbach
Vertretungsberechtigte Geschäftsführer Gordon Davies, Madhu Ranganathan, Christian Waida, Registergericht Amtsgericht Bonn, Registernummer HRB 10646
This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorized
copying, disclosure or distribution of the material in this e-mail is strictly forbidden
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten
Sie diese Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail sind nicht gestattet.