blob: bcce5106d304aba4ecc55c5c354a05ae6f1cb447 [file] [log] [blame]
#!/usr/bin/env groovy
@NonCPS
private def basename(path) {
return path.drop(path.lastIndexOf('/') + 1)
}
@NonCPS
private def render_template(template_text, log_summary) {
def binding = [
'currentBuild': currentBuild,
'env': env,
'log_summary': log_summary,
]
def engine = new groovy.text.SimpleTemplateEngine()
def template_eng = engine.createTemplate(template_text).make(binding)
return template_eng.toString()
}
// Clone llvm-project.git get the blamelist filled. This is necessary for relay
// jobs as with current jenkins we do not want to trigger the relay job with any
// parameters or blamelists. (If we would do that then jenkins won't merge
// requests anymore and we would be forced to test every single revision for
// which we don't have the hardware right now).
//
// FIXME: Make this do a --bare or --mirror clone instead of a full clone. This
// is very space-intensive.
private def clone_llvm_project(name, sha) {
dir("pseudo-checkout-${name}") {
checkout poll: false, changelog: true, scm: [
$class: 'GitSCM',
branches: [[name: sha ]],
userRemoteConfigs: [[url: 'http://labmaster3.local/git/llvm-project.git']]
]
}
}
private def post_build() {
// Analyze build log.
def base_url = 'http://labmaster2:8080/green'
def build_url = currentBuild.getRawBuild().getUrl()
def log_url = "${base_url}/${build_url}consoleText"
def ret = sh \
script: "curl '${log_url}' -s | config/zorg/jenkins/inspect_log.py > log_summary.html",
returnStatus: true
if (ret != 0 && currentBuild.currentResult == 'SUCCESS')
currentBuild.result = 'UNSTABLE'
def log_summary = readFile 'log_summary.html'
// Update job description.
description_template = readTrusted 'zorg/jenkins/job_description.template'
def descr_body = render_template(description_template, log_summary)
if (currentBuild.description == null)
currentBuild.description = ""
currentBuild.description += descr_body
// Send notification email.
def prev_build = currentBuild.getPreviousBuild()
if ((prev_build == null ||
prev_build.result != currentBuild.currentResult) &&
currentBuild.currentResult == 'FAILURE') {
def email_template = readTrusted 'zorg/jenkins/email.template'
def body = render_template(email_template, log_summary)
emailext subject: '$DEFAULT_SUBJECT',
presendScript: '$DEFAULT_PRESEND_SCRIPT',
postsendScript: '$DEFAULT_POSTSEND_SCRIPT',
recipientProviders: [
[$class: 'CulpritsRecipientProvider'],
[$class: 'DevelopersRecipientProvider'],
[$class: 'RequesterRecipientProvider'],
],
replyTo: '$DEFAULT_REPLYTO',
to: '$DEFAULT_RECIPIENTS',
body: body
}
// TODO: Notify IRC.
}
def task_pipeline(label, body) {
node(label) {
try {
stage('main') {
dir('config') {
git url: 'https://github.com/llvm/llvm-zorg.git', branch: 'master', poll: false
}
body()
}
} catch(hudson.AbortException e) {
// No need to print the exception if something fails inside a 'sh'
// step.
currentBuild.result = 'FAILURE'
} catch (Exception e) {
currentBuild.result = 'FAILURE'
throw e
} finally {
stage('post') {
post_build()
}
}
}
}
def benchmark_pipeline(label, body) {
properties([
parameters([
string(name: 'ARTIFACT'),
string(name: 'GIT_DISTANCE'),
string(name: 'GIT_SHA')
])
])
currentBuild.displayName = basename(params.ARTIFACT)
task_pipeline(label) {
clone_llvm_project('llvm-project', params.GIT_SHA)
body()
}
}
def testsuite_pipeline(label, body) {
benchmark_pipeline(label) {
dir('lnt') {
git url: 'https://github.com/llvm/llvm-lnt.git', branch: 'master', poll: false
}
dir('test-suite') {
git url: 'https://github.com/llvm/llvm-test-suite.git', branch: 'master', poll: false
}
body()
}
}
return this