From fabff5aa299c6a01af7cbd89e57bdbcedbf6b9b9 Mon Sep 17 00:00:00 2001 From: Sean Busbey Date: Wed, 9 Aug 2017 00:48:46 -0500 Subject: [PATCH] HBASE-18467 report nightly results to devs via jira --- dev-support/Jenkinsfile | 133 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 127 insertions(+), 6 deletions(-) diff --git a/dev-support/Jenkinsfile b/dev-support/Jenkinsfile index 1f01a4766d..4cda58bf10 100644 --- a/dev-support/Jenkinsfile +++ b/dev-support/Jenkinsfile @@ -114,6 +114,13 @@ curl -L -o personality.sh "${env.PROJET_PERSONALITY}" stash name: 'yetus', includes: "yetus-*/*,yetus-*/**/*,tools/personality.sh" } } + stage ('cleanup') { + steps { + sh '''#!/usr/bin/env bash + rm -rf "${OUTPUTDIR_GENERAL}/success" "${OUTPUTDIR_GENERAL}/failure" "${OUTPUTDIR_JDK7}/success" "${OUTPUTDIR_JDK7}/failure" "${OUTPUTDIR_JDK8}/success" "${OUTPUTDIR_JDK8}/failure" "${WORKSPACE}/src_tarball_success" "${WORKSPACE}/src_tarball_failure" +''' + } + } stage ('yetus general check') { environment { // TODO does hadoopcheck need to be jdk specific? @@ -128,7 +135,17 @@ curl -L -o personality.sh "${env.PROJET_PERSONALITY}" steps { unstash 'yetus' // TODO should this be a download from master, similar to how the personality is? - sh "${env.BASEDIR}/dev-support/hbase_nightly_yetus.sh" + sh '''#!/usr/bin/env bash + declare commentfile + if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then + commentfile="${OUTPUTDIR}/success" + echo '(/) {color:green}+1 general checks{color}' >> "${commentfile}" + else + commentfile="${OUTPUTDIR}/failure" + echo '(x) {color:red}-1 general checks{color}' >> "${commentfile}" + fi + echo "-- For more information [see general report|${BUILD_URL}/General_Nightly_Build_Report/]" >> "${commentfile}" + ''' } post { always { @@ -159,13 +176,21 @@ curl -L -o personality.sh "${env.PROJET_PERSONALITY}" } steps { unstash 'yetus' - sh """#!/usr/bin/env bash + sh '''#!/usr/bin/env bash # for branch-1.1 we don't do jdk8 findbugs, so do it here - if [ "${env.BRANCH_NAME}" == "branch-1.1" ]; then + if [ "${BRANCH_NAME}" == "branch-1.1" ]; then TESTS+=",findbugs" fi - "${env.BASEDIR}/dev-support/hbase_nightly_yetus.sh" - """ + declare commentfile + if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then + commentfile="${OUTPUTDIR}/success" + echo '(/) {color:green}+1 jdk7 checks{color}' >> "${commentfile}" + else + commentfile="${OUTPUTDIR}/failure" + echo '(x) {color:red}-1 jdk7 checks{color}' >> "${commentfile}" + fi + echo "-- For more information [see jdk7 report|${BUILD_URL}/JDK7_Nightly_Build_Report/]" >> "${commentfile}" + ''' } post { always { @@ -215,7 +240,17 @@ curl -L -o personality.sh "${env.PROJET_PERSONALITY}" } steps { unstash 'yetus' - sh "${env.BASEDIR}/dev-support/hbase_nightly_yetus.sh" + sh '''#!/usr/bin/env bash + declare commentfile + if "${BASEDIR}/dev-support/hbase_nightly_yetus.sh" ; then + commentfile="${OUTPUTDIR}/success" + echo '(/) {color:green}+1 jdk8 checks{color}' >> "${commentfile}" + else + commentfile="${OUTPUTDIR}/failure" + echo '(x) {color:red}-1 jdk8 checks{color}' >> "${commentfile}" + fi + echo "-- For more information [see jdk8 report|${BUILD_URL}/JDK8_Nightly_Build_Report/]" >> "${commentfile}" + ''' } post { always { @@ -304,6 +339,92 @@ END fi ''' } + // This approach only works because the source release artifact is the last stage that does work. + post { + success { + writeFile file: "${env.WORKSPACE}/src_tarball_success", text: '(/) {color:green}+1 source release artifact{color}\n-- See build output for details.' + } + failure { + writeFile file: "${env.WORKSPACE}/src_tarball_failure", text: '(x) {color:red}-1 source release artifact{color}\n-- See build output for details.' + } + } + } + stage ('Fail if previous stages failed') { + steps { + script { + def failures = ['src_tarball_failure', "${env.OUTPUT_RELATIVE_GENERAL}/failure", + "${env.OUTPUT_RELATIVE_JDK7}/failure", "${OUTPUT_RELATIVE_JDK8}/failure"] + for ( failure_file in failures ) { + if (fileExists(file: failure_file)) { + error 'Failing job due to previous failure(s) in prior steps.' + } + } + } + } + } + } + post { + always { + script { + try { + sh "printenv" + def results = ["${env.OUTPUT_RELATIVE_GENERAL}/failure", "${env.OUTPUT_RELATIVE_GENERAL}/success", + "${env.OUTPUT_RELATIVE_JDK7}/failure", "${env.OUTPUT_RELATIVE_JDK7}/success", + "${env.OUTPUT_RELATIVE_JDK8}/failure", "${env.OUTPUT_RELATIVE_JDK8}/success", + 'src_tarball_failure', 'src_tarball_success'] + echo env.BRANCH_NAME + echo env.BUILD_URL + echo currentBuild.result + echo currentBuild.durationString + def comment = "Results for branch ${env.BRANCH_NAME}, done in ${currentBuild.durationString}\n" + comment += "\t[build ${currentBuild.displayName} on builds.a.o|${env.BUILD_URL}]: ${currentBuild.result}\n----\ndetails (if available):\n\n" + if (currentBuild.result == "SUCCESS") { + comment += "(/) *{color:green}+1 overall{color}*\n\n" + } else { + comment += "(x) *{color:red}-1 overall{color}*\n" + // Ideally get the committer our of the change and @ mention them in the per-jira comment + comment += " Committer, please check your recent inclusion of a patch for this issue.\n\n" + } + echo "" + echo "[DEBUG] trying to aggregate step-wise results" + comment += results.collect { fileExists(file: it) ? readFile(file: it) : "" }.join("\n\n") + echo "[INFO] Comment:" + echo comment + echo "" + echo "[INFO] There are ${currentBuild.changeSets.size()} change sets." + getJirasToComment(currentBuild).each { currentIssue -> + jiraComment issueKey: currentIssue, body: comment + } + } catch (Exception exception) { + echo "Got exception: ${exception}" + echo " ${exception.getStackTrace()}" + } + } + } + } +} +import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper +@NonCPS +List getJirasToComment(RunWrapper thisBuild) { + def seenJiras = [] + thisBuild.changeSets.each { cs -> + cs.getItems().each { change -> + CharSequence msg = change.msg + echo "change: ${change}" + echo " ${msg}" + echo " ${change.commitId}" + echo " ${change.author}" + echo "" + msg.eachMatch("HBASE-[0-9]+") { currentIssue -> + echo "[DEBUG] found jira key: ${currentIssue}" + if (currentIssue in seenJiras) { + echo "[DEBUG] already commented on ${currentIssue}." + } else { + echo "[INFO] commenting on ${currentIssue}." + seenJiras << currentIssue + } + } } } + return seenJiras } -- 2.14.1