From d6b4c8b3f0626760b7b34be574bc147d003cdffd Mon Sep 17 00:00:00 2001 From: Sean Torpey <33637759+storpeyCHT@users.noreply.github.com> Date: Wed, 1 Jul 2020 16:13:51 -0400 Subject: [PATCH] Add support for coverage thresholds and tolerance of minor drops in coverage in status checks --- .../CompareCoverageAction.java | 32 +++++++++++++++++-- .../githubprcoveragestatus/Configuration.java | 12 +++++++ .../githubprcoveragestatus/Message.java | 15 +++++++-- .../SettingsRepository.java | 2 ++ .../CompareCoverageAction/config.jelly | 7 ++++ .../Configuration/global.groovy | 4 +++ 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/CompareCoverageAction.java b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/CompareCoverageAction.java index 875b5ce..dc8ac98 100644 --- a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/CompareCoverageAction.java +++ b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/CompareCoverageAction.java @@ -65,11 +65,17 @@ public class CompareCoverageAction extends Recorder implements SimpleBuildStep { private Map scmVars; private String jacocoCoverageCounter; private String publishResultAs; + private String comparisonMode; @DataBoundConstructor public CompareCoverageAction() { } + @DataBoundSetter + public void setComparisonMode(String comparisonMode) { + this.comparisonMode = comparisonMode; + } + @DataBoundSetter public void setPublishResultAs(String publishResultAs) { this.publishResultAs = publishResultAs; @@ -100,6 +106,10 @@ public void setJacocoCoverageCounter(String jacocoCoverageCounter) { this.jacocoCoverageCounter = jacocoCoverageCounter; } + public String getComparisonMode() { + return comparisonMode; + } + public String getPublishResultAs() { return publishResultAs; } @@ -156,7 +166,7 @@ public void perform( publishComment(message, buildUrl, jenkinsUrl, settingsRepository, gitHubRepository, prId, listener); } else { buildLog.println(BUILD_LOG_PREFIX + "publishing result as status check"); - publishStatusCheck(message, gitHubRepository, prId, masterCoverage, coverage, buildUrl, listener); + publishStatusCheck(message, settingsRepository, gitHubRepository, prId, masterCoverage, coverage, buildUrl, listener); } } @@ -185,6 +195,7 @@ private void publishComment( private void publishStatusCheck( Message message, + SettingsRepository settingsRepository, GHRepository gitHubRepository, int prId, float targetCoverage, @@ -195,12 +206,27 @@ private void publishStatusCheck( try { String text = message.forStatusCheck(); List commits = gitHubRepository.getPullRequest(prId).listCommits().asList(); + String statusMessage; + boolean comparison; + if ("threshold".equalsIgnoreCase(comparisonMode)){ + comparison = Percent.of(coverage) <= settingsRepository.getGreenThreshold(); + statusMessage = message.forThresholdStatusCheck( settingsRepository.getGreenThreshold() ); + } else if ("tolerance".equalsIgnoreCase(comparisonMode)){ + float tolerance = settingsRepository.getTolerance(); + float result = Math.abs(coverage - targetCoverage) * 100; + comparison = result > tolerance; + statusMessage = message.forToleranceStatusCheck(tolerance); + } else { + comparison = Percent.roundFourAfterDigit(coverage) < Percent.roundFourAfterDigit(targetCoverage); + statusMessage = message.forStatusCheck(); + } + ServiceRegistry.getPullRequestRepository().createCommitStatus( gitHubRepository, commits.get(commits.size() - 1).getSha(), - coverage < targetCoverage ? GHCommitState.FAILURE : GHCommitState.SUCCESS, + comparison ? GHCommitState.FAILURE : GHCommitState.SUCCESS, buildUrl, - message.forStatusCheck() + statusMessage ); } catch (Exception e) { PrintWriter pw = listener.error("Couldn't add status check to pull request #" + prId + "!"); diff --git a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/Configuration.java b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/Configuration.java index 1121343..f62d846 100644 --- a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/Configuration.java +++ b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/Configuration.java @@ -65,6 +65,10 @@ public static String getSonarToken() { return DESCRIPTOR.getSonarToken(); } + public static String getTolerance() { + return Float.toString(DESCRIPTOR.getTolerance()); + } + public static String getSonarLogin() { return DESCRIPTOR.getSonarLogin(); } @@ -91,6 +95,7 @@ public static final class ConfigurationDescriptor extends Descriptor coverageByRepo = new ConcurrentHashMap(); @@ -107,6 +112,7 @@ public static final class ConfigurationDescriptor extends Descriptor${%Status Check} + + + diff --git a/src/main/resources/com/github/terma/jenkins/githubprcoveragestatus/Configuration/global.groovy b/src/main/resources/com/github/terma/jenkins/githubprcoveragestatus/Configuration/global.groovy index 356f051..16867c9 100644 --- a/src/main/resources/com/github/terma/jenkins/githubprcoveragestatus/Configuration/global.groovy +++ b/src/main/resources/com/github/terma/jenkins/githubprcoveragestatus/Configuration/global.groovy @@ -27,6 +27,10 @@ f.section(title: descriptor.displayName) { f.entry(field: "greenThreshold", title: _("Green Threshold 0-100%")) { f.textbox() } + + f.entry(field: "tolerance", title: _("Tolerance for comparing to master 0.0-1.0")) { + f.textbox() + } f.entry(field: "useSonarForMasterCoverage", title: _("Use Sonar for master coverage")) { f.checkbox()