From 88e0f52c426605da0e265778d424f72c32e813b3 Mon Sep 17 00:00:00 2001 From: Martin Monperrus Date: Wed, 10 Apr 2019 11:40:32 +0200 Subject: [PATCH] refactor: move stamp-clover-tool --- README.md | 4 + jenkins-clover-coverage/README.md | 3 + jenkins-clover-coverage/clover.groovy | 380 ++++++++++++++++++ .../xwiki/Clover-2017-11-09-2018-04-03.pdf | Bin 0 -> 36148 bytes 4 files changed, 387 insertions(+) create mode 100644 jenkins-clover-coverage/README.md create mode 100644 jenkins-clover-coverage/clover.groovy create mode 100644 jenkins-clover-coverage/samples/xwiki/Clover-2017-11-09-2018-04-03.pdf diff --git a/README.md b/README.md index 7c9d3ba..83feceb 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,7 @@ A Jenkins Freestyle plugin ## descartes-jenkins-plugin ## stamp-jenkins-cookbooks + +## jenkins-clover-coverage + +Jenkins pipeline to generate Clover reports + script to compare results diff --git a/jenkins-clover-coverage/README.md b/jenkins-clover-coverage/README.md new file mode 100644 index 0000000..5bdfd2c --- /dev/null +++ b/jenkins-clover-coverage/README.md @@ -0,0 +1,3 @@ +Jenkins pipeline to generate Clover reports + script to compare results + +Main file is `clover.groovy` diff --git a/jenkins-clover-coverage/clover.groovy b/jenkins-clover-coverage/clover.groovy new file mode 100644 index 0000000..bf8e770 --- /dev/null +++ b/jenkins-clover-coverage/clover.groovy @@ -0,0 +1,380 @@ +/* + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +import org.apache.commons.lang3.StringUtils + +// To use on your own project: +// - Check all places mentioning XWiki and replace with your project's data + +// Computes the full Clover TPC for the XWiki project, taking into account all tests located in various repos: +// xwiki-commons, xwiki-rendering and xwiki-platform. +// This script should be loaded by a standard Jenkins Pipeline job, using the "Pipeline script from SCM" option. +// This script also performs an analysis of the repory by comparing it to a previous report and generating an email +// if some modules have a TPC lower than before. +node() { + def mvnHome + def localRepository + def cloverDir + def shortDateString = new Date().format("yyyyMMdd") + def dateString = new Date().format("yyyyMMdd-HHmm") + stage('Preparation') { + def workspace = pwd() + localRepository = "${workspace}/maven-repository" + // Make sure that the special Maven local repository exists + sh "mkdir -p ${localRepository}" + // Remove all XWiki artifacts from it + sh "rm -Rf ${localRepository}/org/xwiki" + sh "rm -Rf ${localRepository}/com/xpn" + // Make sure that the directory where clover will store its data exists in + // the workspace and that it's clean + cloverDir = "${workspace}/clover-data" + sh "rm -Rf ${cloverDir}" + sh "mkdir -p ${cloverDir}" + // Get the Maven tool. + // NOTE: Needs to be configured in the global configuration. + mvnHome = tool 'Maven' + } + ["xwiki-commons", "xwiki-rendering", "xwiki-platform"].each() { repoName -> + stage("Cloverify ${repoName}") { + dir (repoName) { + git "https://github.com/xwiki/${repoName}.git" + runCloverAndGenerateReport(mvnHome, localRepository, cloverDir) + } + } + } + stage("Analyze Results") { + // Find the Clover report to compare with. We compare against the latest version in which all modules have + // a higher TPC than before. + def latestReport = getLatestReport() + def (date, time) = latestReport.tokenize('-') + + // Read the Clover XML report and extract data + def tpcs1 = scrapeData( + "http://maven.xwiki.org/site/clover/${date}/clover-commons+rendering+platform-${latestReport}/clover.xml" + .toURL()) + + // Read the current generated Clover XML report from the file system + def cloverReportLocation = "${workspace}/xwiki-platform/target/site/clover/" + def cloverXMLLocation = new File("${cloverReportLocation}/clover.xml") + def tpcs2 + try { + tpcs2 = scrapeData(cloverXMLLocation) + + } catch (e) { + sh script: "ls -l ${workspace}", returnStatus: true + sh script: "ls -l ${cloverReportLocation}", returnStatus: true + throw e + } + + // Compute the TPCs for each module + def map1 = computeTPC(tpcs1.modules).sort() + def map2 = computeTPC(tpcs2.modules).sort() + + // Compute a diff map that we use to both test for TPC failures and for for generating the HTML report in such + // a case. + def map = computeDiplayMap(map1, map2) + if (hasFailures(map)) { + // Send the mail to notify about failures + sendMail(latestReport, map) + } else { + // Update the latest.txt file + new File("${cloverReportLocation}/latest.txt") << dateString + sh "scp ${cloverReportLocation}/latest.txt maven@maven.xwiki.org:public_html/site/clover/" + } + } + stage("Publish Clover Reports") { + def prefix = "clover-" + ["commons", "rendering", "platform"].each() { repoName -> + dir ("xwiki-${repoName}/target/site") { + if (repoName != 'commons') { + prefix = "${prefix}+${repoName}" + } else { + prefix = "${prefix}${repoName}" + } + sh "tar cvf ${prefix}-${dateString}.tar clover" + sh "gzip ${prefix}-${dateString}.tar" + sh "ssh maven@maven.xwiki.org mkdir -p public_html/site/clover/${shortDateString}" + sh "scp ${prefix}-${dateString}.tar.gz maven@maven.xwiki.org:public_html/site/clover/${shortDateString}/" + sh "rm ${prefix}-${dateString}.tar.gz" + sh "ssh maven@maven.xwiki.org 'cd public_html/site/clover/${shortDateString}; gunzip ${prefix}-${dateString}.tar.gz; tar xvf ${prefix}-${dateString}.tar; mv clover ${prefix}-${dateString};rm ${prefix}-${dateString}.tar'" + } + } + } +} +def runCloverAndGenerateReport(def mvnHome, def localRepository, def cloverDir) +{ + wrap([$class: 'Xvnc']) { + withEnv(["PATH+MAVEN=${mvnHome}/bin", 'MAVEN_OPTS=-Xmx4096m']) { + sh "mvn -Dmaven.repo.local='${localRepository}' clean clover:setup install -Pclover,integration-tests,flavor-integration-tests,distribution -Dmaven.clover.cloverDatabase=${cloverDir}/clover.db -Dmaven.test.failure.ignore=true -Dxwiki.revapi.skip=true" + sh "mvn -Dmaven.repo.local='${localRepository}' clover:clover -N -Dmaven.clover.cloverDatabase=${cloverDir}/clover.db" + } + } +} +def sendMail(def latestReport, def map) +{ + def (date, time) = latestReport.tokenize('-') + def cloverURL = + "http://maven.xwiki.org/site/clover/${date}/clover-commons+rendering+platform-${latestReport}/dashboard.html" + emailext ( + subject: "Global Coverage Failure - Build # ${env.BUILD_NUMBER}", + body: """ +At least one module got a TPC lower than in the latest passing Clover report [${latestReport}]. + +Please fix all elements in red in the report below (see the Clover report for details): + +${displayResultsInHTML("Module", map)} +""", + mimeType: 'text/html', + to: 'notifications@xwiki.org' + ) +} +def getLatestReport() +{ + try { + return new URL ("http://maven.xwiki.org/site/clover/latest.txt").getText() + } catch (all) { + // When no file exist, default to a fixed value we define. + return "20171222-1835" + } +} +// Example input: "/home/hudsonagent/jenkins_root/workspace/Clover/xwiki-commons/xwiki-commons-core/ +// xwiki-commons-stability/src/main/java/org/xwiki/stability/Unstable.java" +// Returns "xwiki-commons-stability" +def extractModuleName(def path) +{ + def before = StringUtils.substringBefore(path, '/src/') + return StringUtils.substringAfterLast(before, '/') +} +def emptyMetrics() +{ + def map = [:] + map.coveredconditionals = 0 + map.coveredstatements = 0 + map.coveredmethods = 0 + map.conditionals = 0 + map.statements = 0 + map.methods = 0 + map.coveredelements = 0 + return map +} +void addMetrics(def metricXMLElement, def map, def key) +{ + def innerMap = map.get(key) + if (!innerMap) { + innerMap = emptyMetrics() + map.put(key, innerMap) + } + innerMap.coveredelements += metricXMLElement.@coveredelements.toDouble() + innerMap.coveredconditionals += metricXMLElement.@coveredconditionals.toDouble() + innerMap.coveredstatements += metricXMLElement.@coveredstatements.toDouble() + innerMap.coveredmethods += metricXMLElement.@coveredmethods.toDouble() + innerMap.conditionals += metricXMLElement.@conditionals.toDouble() + innerMap.statements += metricXMLElement.@statements.toDouble() + innerMap.methods += metricXMLElement.@methods.toDouble() +} +// location can be a URL or a File +def scrapeData(def location) +{ + def packageMap = [:] + def moduleMap = [:] + def root = new XmlSlurper().parse(location.withReader()) + root.project.package.each() { packageElement -> + def packageName = packageElement.@name.text() + packageElement.file.each() { fileElement -> + def filePath = fileElement.@path.text() + // Iterate over all the files to remove test classes in order to harmonize TPC + if (!(filePath.contains('/test/') || filePath =~ /xwiki-.*-test/)) { + // Save metrics for packages + addMetrics(fileElement.metrics, packageMap, packageName) + // Save metrics for modules + addMetrics(fileElement.metrics, moduleMap, extractModuleName(filePath)) + if (filePath.contains('test')) { + println "* File that should maybe not be counted: ${filePath}" + } + } + } + } + return ['packages' : packageMap, 'modules' : moduleMap] +} +def computeTPC(def map) +{ + def totalcoveredconditionals = 0 + def totalcoveredstatements = 0 + def totalcoveredmethods = 0 + def totalconditionals = 0 + def totalstatements = 0 + def totalmethods = 0 + + map.reverseEach() { key, metrics -> + def coveredconditionals = metrics.get('coveredconditionals') + totalcoveredconditionals += coveredconditionals + def coveredstatements = metrics.get('coveredstatements') + totalcoveredstatements += coveredstatements + def coveredmethods = metrics.get('coveredmethods') + totalcoveredmethods += coveredmethods + def conditionals = metrics.get('conditionals') + totalconditionals += conditionals + def statements = metrics.get('statements') + totalstatements += statements + def methods = metrics.get('methods') + totalmethods += methods + def elementsCount = conditionals + statements + methods + def tpc + if (elementsCount == 0) { + tpc = 0 + } else { + def coveredElements = coveredconditionals + coveredstatements + coveredmethods + def elements = conditionals + statements + methods + tpc = (coveredElements/elements) * 100 + } + metrics.put('tpc', tpc) + } + def totalCoveredElements = totalcoveredconditionals + totalcoveredstatements + totalcoveredmethods + def totalElements = totalconditionals + totalstatements + totalmethods + def totalTPC = (totalCoveredElements/totalElements) * 100 + map.put('ALL', [ + 'tpc': totalTPC, + 'coveredconditionals': totalcoveredconditionals, + 'coveredstatements': totalcoveredstatements, + 'coveredmethods': totalcoveredmethods, + 'conditionals': totalconditionals, + 'statements': totalstatements, + 'methods': totalmethods + ]) + return map +} +def getDiffValue(key, all, metric1, metric2) +{ + def value = all.get(key) + if (metric2) { + value -= (metric2.get(key) - metric1.get(key)) + } else { + value -= metric1.get(key) + } + return value +} +def computeTPCWithout(all, metric1, metric2) +{ + def elementsCount = getDiffValue('conditionals', all, metric1, metric2) + + getDiffValue('statements', all, metric1, metric2) + getDiffValue('methods', all, metric1, metric2) + if (elementsCount == 0) { + return 0 + } else { + def coveredElementsCount = getDiffValue('coveredconditionals', all, metric1, metric2) + + getDiffValue('coveredstatements', all, metric1, metric2) + + getDiffValue('coveredmethods', all, metric1, metric2) + return (coveredElementsCount/elementsCount) * 100 + } +} +def round(number) +{ + return number.toDouble().trunc(2) +} +def computeDiplayMap(def map1, def map2) +{ + def newAll = map2.get('ALL') + def map = [:] + + // Process the new added modules + the modified ones + map2.each() { key, metrics -> + // New modules + if (!map1.containsKey(key)) { + def contribution = newAll.tpc - computeTPCWithout(newAll, metrics, null) + metrics.put('contrib', contribution) + metrics.put('newtpc', metrics.tpc) + map.put(key, metrics) + } else { + // Modified modules + def oldtpc = map1.get(key)?.tpc + def tpc = metrics.tpc + if (oldtpc && tpc != oldtpc) { + diff = tpc - oldtpc + metrics.put('oldtpc', oldtpc) + metrics.put('difftpc', diff) + metrics.put('newtpc', tpc) + def contribution = newAll.tpc - computeTPCWithout(newAll, map1.get(key), metrics) + metrics.put('contrib', contribution) + map.put(key, metrics) + } + } + } + // Process removed modules + map1.each() { key, metrics -> + if (!map2.containsKey(key)) { + def contribution = computeTPCWithout(newAll, metrics, null) - newAll.tpc + metrics.put('contrib', contribution) + metrics.put('oldtpc', metrics.tpc) + map.put(key, metrics) + } + } + + map = map.sort {it.value.contrib} + + return map +} +def hasFailures(def map) +{ + // Using a for so that we can exit the loop. + for (e in map) { + if (e.value.oldtpc != null && e.value.newtpc != null && round(e.value.newtpc - e.value.oldtpc) < 0) { + return true + } + } + return false +} +// Note: Not used but leaving as an example FTM. Useful if we want to run the code in a wiki page in XWiki. +def displayResultsInWikiSyntax(def topic, def map) +{ + def content = "" + content += "|=${topic}|=TPC Old|=TPC New|=TPC Diff|=Global TPC Contribution\n" + content += "|ALL|${round(map.ALL.oldtpc)}|${round(map.ALL.newtpc)}|${round(map.ALL.newtpc - map.ALL.oldtpc)}|N/A\n" + map.each() { key, value -> + if (key == 'ALL') return + def css = value.contrib < 0 ? '(% style="color:red;" %)' : '(% style="color:green;" %)' + def oldtpc = value.oldtpc != null ? round(value.oldtpc) : 'N/A' + def newtpc = value.newtpc != null ? round(value.newtpc) : 'N/A' + def difftpc = value.oldtpc != null && value.newtpc != null ? round(value.newtpc - value.oldtpc) : 'N/A' + def cssdiff = value.contrib < 0 || (value.oldtpc != null && value.newtpc != null + && value.newtpc - value.oldtpc < 0) ? '(% style="color:red;" %)' : '(% style="color:green;" %)' + content += "|${key}|${css}${oldtpc}|${css}${newtpc}|${cssdiff}${difftpc}|${css}${round(value.contrib)}\n" + } + return content +} +def displayResultsInHTML(def topic, def map) +{ + def content = "" + content += "" + content += "" + content += "" + content += "" + map.each() { key, value -> + if (key == 'ALL') return + def css = value.contrib < 0 ? 'style="color:red;"' : 'style="color:green;"' + def oldtpc = value.oldtpc != null ? round(value.oldtpc) : 'N/A' + def newtpc = value.newtpc != null ? round(value.newtpc) : 'N/A' + def difftpc = value.oldtpc != null && value.newtpc != null ? round(value.newtpc - value.oldtpc) : 'N/A' + def cssdiff = value.contrib < 0 || (value.oldtpc != null && value.newtpc != null + && value.newtpc - value.oldtpc < 0) ? 'style="color:red;"' : 'style="color:green;"' + content += "" + content += "" + } + content += "
${topic}TPC OldTPC NewTPC DiffGlobal TPC Contribution
ALL${round(map.ALL.oldtpc)}${round(map.ALL.newtpc)}${round(map.ALL.newtpc - map.ALL.oldtpc)}N/A
${key}${oldtpc}${newtpc}${difftpc}${round(value.contrib)}
" + return content +} diff --git a/jenkins-clover-coverage/samples/xwiki/Clover-2017-11-09-2018-04-03.pdf b/jenkins-clover-coverage/samples/xwiki/Clover-2017-11-09-2018-04-03.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f7f3803cce11416f8a78bd055d5792a649ac4c9 GIT binary patch literal 36148 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 DZ_@A& literal 0 HcmV?d00001