${subject}

Build info

Date of build: ${date}
Label: ${label}
% for obj, t in triggers:

Trigger from ${t['info']}

% for cs in t['changesets']: % endfor
AuthorDateCommentModified files
% if cs['email'] != "": ${cs['author']} % else: ${cs['author']} % endif ${cs['date']}${cs['comment']} % for f in cs['files']: ${f}
% endfor
% endfor <% from xml.etree.ElementTree import ElementTree import os # gather junit files junit_files = [] for j in jobs: junit_path = None if 'report' in j.job_info and 'junit' in j.job_info['report']: junit_path = j.job_info['report']['junit'] if junit_path == None or not os.path.exists(junit_path): continue if os.path.isdir(junit_path): for f in os.listdir(junit_path): if f.endswith("xml"): junit_files.append(os.path.join(junit_path, f)) else: junit_files.append(junit_path) %>

Jobs summary

% for j in jobs: Job ${j.idx}: ${j.completion_status} (${j.job_info['batch']})
% endfor

JUnit report

% for jf in junit_files: % for ts in ElementTree().parse(jf).findall(""): <% passrate = (float(ts.attrib['tests']) - float(ts.attrib['failures']) - float(ts.attrib['errors'])) / float(ts.attrib['tests'])*100 passrate = "%.1f" % passrate %> % endfor % endfor
Test SuiteFailedErredTotalPass Rate
${ts.attrib['name']} ${ts.attrib['failures']} ${ts.attrib['errors']} ${ts.attrib['tests']}${passrate}%
% for j in jobs: % if j.completion_status != "ok" or ('report' in j.job_info and 'include-log' in j.job_info['report'] and j.job_info['report']['include-log'] == True):

Job ${j.idx}: ${j.job_info['batch']}

Status: ${j.completion_status}
${j.execlog}
% endif % endfor