diff --git a/src/main/java/jenkins/plugins/slack/ActiveNotifier.java b/src/main/java/jenkins/plugins/slack/ActiveNotifier.java index 9cd9a688..0018aef8 100755 --- a/src/main/java/jenkins/plugins/slack/ActiveNotifier.java +++ b/src/main/java/jenkins/plugins/slack/ActiveNotifier.java @@ -13,6 +13,7 @@ import hudson.scm.ChangeLogSet; import hudson.scm.ChangeLogSet.AffectedFile; import hudson.scm.ChangeLogSet.Entry; +import hudson.tasks.junit.TestResultAction; import hudson.tasks.test.AbstractTestResultAction; import hudson.tasks.test.TestResult; import hudson.triggers.SCMTrigger; @@ -96,6 +97,20 @@ private void notifyStart(AbstractBuild build, String message) { } public void finalized(AbstractBuild r) { + AbstractProject project = r.getProject(); + Result result = r.getResult(); + AbstractBuild previousBuild = project.getLastBuild(); + do { + previousBuild = previousBuild.getPreviousCompletedBuild(); + } while (previousBuild != null && previousBuild.getResult() == Result.ABORTED); + Result previousResult = (previousBuild != null) ? previousBuild.getResult() : Result.SUCCESS; + if((result.isWorseThan(previousResult) || moreTestFailuresThanPreviousBuild(r, previousBuild)) && notifier.getNotifyRegression()) { + getSlack(r).publish(getBuildStatusMessage(r, notifier.includeTestSummary(), + notifier.includeFailedTests(), notifier.includeCustomMessage()), getBuildColor(r)); + if (notifier.getCommitInfoChoice().showAnything()) { + getSlack(r).publish(getCommitList(r), getBuildColor(r)); + } + } } public void completed(AbstractBuild r) { @@ -127,6 +142,31 @@ public void completed(AbstractBuild r) { } } + private boolean moreTestFailuresThanPreviousBuild(AbstractBuild currentBuild, AbstractBuild previousBuild) { + if (getTestResult(currentBuild) != null && getTestResult(previousBuild) != null) { + if (getTestResult(currentBuild).getFailCount() > getTestResult(previousBuild).getFailCount()) + return true; + + // test if different tests failed. + return !getFailedTestIds(currentBuild).equals(getFailedTestIds(previousBuild)); + } + return false; + } + + private TestResultAction getTestResult(AbstractBuild build) { + return build.getAction(TestResultAction.class); + } + + private Set getFailedTestIds(AbstractBuild currentBuild) { + Set failedTestIds = new HashSet(); + List failedTests = getTestResult(currentBuild).getFailedTests(); + for(TestResult result : failedTests) { + failedTestIds.add(result.getId()); + } + + return failedTestIds; + } + String getChanges(AbstractBuild r, boolean includeCustomMessage) { if (!r.hasChangeSetComputed()) { logger.info("No change set computed..."); @@ -242,6 +282,7 @@ public static class MessageBuilder { ABORTED_STATUS_MESSAGE = "Aborted", NOT_BUILT_STATUS_MESSAGE = "Not built", UNSTABLE_STATUS_MESSAGE = "Unstable", + REGRESSION_STATUS_MESSAGE = "Regression", UNKNOWN_STATUS_MESSAGE = "Unknown"; private StringBuffer message; @@ -318,6 +359,9 @@ private String getStatusMessage(AbstractBuild r) { if (result == Result.UNSTABLE) { return UNSTABLE_STATUS_MESSAGE; } + if (lastNonAbortedBuild != null && result.isWorseThan(previousResult)) { + return REGRESSION_STATUS_MESSAGE; + } return UNKNOWN_STATUS_MESSAGE; } diff --git a/src/main/java/jenkins/plugins/slack/SlackListener.java b/src/main/java/jenkins/plugins/slack/SlackListener.java index 1aa2ad6d..a0ba6d54 100755 --- a/src/main/java/jenkins/plugins/slack/SlackListener.java +++ b/src/main/java/jenkins/plugins/slack/SlackListener.java @@ -42,8 +42,8 @@ public void onDeleted(AbstractBuild r) { @Override public void onFinalized(AbstractBuild r) { - // getNotifier(r.getProject()).finalized(r); - // super.onFinalized(r); + getNotifier(r.getProject(), null).finalized(r); + super.onFinalized(r); } @SuppressWarnings("unchecked") diff --git a/src/main/java/jenkins/plugins/slack/SlackNotifier.java b/src/main/java/jenkins/plugins/slack/SlackNotifier.java index 4c708a2d..dd35cc5b 100755 --- a/src/main/java/jenkins/plugins/slack/SlackNotifier.java +++ b/src/main/java/jenkins/plugins/slack/SlackNotifier.java @@ -53,6 +53,7 @@ public class SlackNotifier extends Notifier { private boolean notifyAborted; private boolean notifyNotBuilt; private boolean notifyUnstable; + private boolean notifyRegression; private boolean notifyFailure; private boolean notifyBackToNormal; private boolean notifyRepeatedFailure; @@ -153,6 +154,10 @@ public boolean getNotifyUnstable() { return notifyUnstable; } + public boolean getNotifyRegression() { + return notifyRegression; + } + public boolean getNotifyBackToNormal() { return notifyBackToNormal; } @@ -212,6 +217,11 @@ public void setNotifyUnstable(boolean notifyUnstable) { this.notifyUnstable = notifyUnstable; } + @DataBoundSetter + public void setNotifyRegression(boolean notifyRegression) { + this.notifyRegression = notifyRegression; + } + @DataBoundSetter public void setNotifyBackToNormal(boolean notifyBackToNormal) { this.notifyBackToNormal = notifyBackToNormal; @@ -244,7 +254,7 @@ public SlackNotifier() { public SlackNotifier(final String baseUrl, final String teamDomain, final String authToken, final boolean botUser, final String room, final String authTokenCredentialId, final String sendAs, final boolean startNotification, final boolean notifyAborted, final boolean notifyFailure, - final boolean notifyNotBuilt, final boolean notifySuccess, final boolean notifyUnstable, final boolean notifyBackToNormal, + final boolean notifyNotBuilt, final boolean notifySuccess, final boolean notifyUnstable, final boolean notifyRegression, final boolean notifyBackToNormal, final boolean notifyRepeatedFailure, final boolean includeTestSummary, final boolean includeFailedTests, CommitInfoChoice commitInfoChoice, boolean includeCustomMessage, String customMessage) { super(); @@ -264,6 +274,7 @@ public SlackNotifier(final String baseUrl, final String teamDomain, final String this.notifyNotBuilt = notifyNotBuilt; this.notifySuccess = notifySuccess; this.notifyUnstable = notifyUnstable; + this.notifyRegression = notifyRegression; this.notifyBackToNormal = notifyBackToNormal; this.notifyRepeatedFailure = notifyRepeatedFailure; this.includeTestSummary = includeTestSummary; @@ -423,6 +434,7 @@ public SlackNotifier newInstance(StaplerRequest sr, JSONObject json) { boolean notifyAborted = "true".equals(sr.getParameter("slackNotifyAborted")); boolean notifyNotBuilt = "true".equals(sr.getParameter("slackNotifyNotBuilt")); boolean notifyUnstable = "true".equals(sr.getParameter("slackNotifyUnstable")); + boolean notifyRegression = "true".equals(sr.getParameter("slackNotifyRegression")); boolean notifyFailure = "true".equals(sr.getParameter("slackNotifyFailure")); boolean notifyBackToNormal = "true".equals(sr.getParameter("slackNotifyBackToNormal")); boolean notifyRepeatedFailure = "true".equals(sr.getParameter("slackNotifyRepeatedFailure")); @@ -432,7 +444,7 @@ public SlackNotifier newInstance(StaplerRequest sr, JSONObject json) { boolean includeCustomMessage = "on".equals(sr.getParameter("includeCustomMessage")); String customMessage = sr.getParameter("customMessage"); return new SlackNotifier(baseUrl, teamDomain, token, botUser, room, tokenCredentialId, sendAs, startNotification, notifyAborted, - notifyFailure, notifyNotBuilt, notifySuccess, notifyUnstable, notifyBackToNormal, notifyRepeatedFailure, + notifyFailure, notifyNotBuilt, notifySuccess, notifyUnstable, notifyRegression, notifyBackToNormal, notifyRepeatedFailure, includeTestSummary, includeFailedTests, commitInfoChoice, includeCustomMessage, customMessage); } @@ -515,6 +527,7 @@ public static class SlackJobProperty extends hudson.model.JobProperty + + + + + diff --git a/src/test/java/jenkins/plugins/slack/SlackNotifierStub.java b/src/test/java/jenkins/plugins/slack/SlackNotifierStub.java index c2ed563f..84150762 100644 --- a/src/test/java/jenkins/plugins/slack/SlackNotifierStub.java +++ b/src/test/java/jenkins/plugins/slack/SlackNotifierStub.java @@ -4,11 +4,11 @@ public class SlackNotifierStub extends SlackNotifier { public SlackNotifierStub(String baseUrl, String teamDomain, String authToken, boolean botUser, String room, String authTokenCredentialId, String sendAs, boolean startNotification, boolean notifyAborted, boolean notifyFailure, - boolean notifyNotBuilt, boolean notifySuccess, boolean notifyUnstable, boolean notifyBackToNormal, + boolean notifyNotBuilt, boolean notifySuccess, boolean notifyUnstable, boolean notifyRegression, boolean notifyBackToNormal, boolean notifyRepeatedFailure, boolean includeTestSummary, boolean includeFailedTests, CommitInfoChoice commitInfoChoice, boolean includeCustomMessage, String customMessage) { super(baseUrl, teamDomain, authToken, botUser, room, authTokenCredentialId, sendAs, startNotification, notifyAborted, notifyFailure, - notifyNotBuilt, notifySuccess, notifyUnstable, notifyBackToNormal, notifyRepeatedFailure, + notifyNotBuilt, notifySuccess, notifyUnstable, notifyRegression, notifyBackToNormal, notifyRepeatedFailure, includeTestSummary, includeFailedTests, commitInfoChoice, includeCustomMessage, customMessage); } diff --git a/src/test/java/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest.java b/src/test/java/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest.java index c474200d..e84b4f48 100644 --- a/src/test/java/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest.java +++ b/src/test/java/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest.java @@ -50,6 +50,7 @@ public void testBasicMigration() { assertFalse(notifier.getNotifyAborted()); assertFalse(notifier.getNotifyNotBuilt()); assertFalse(notifier.getNotifyUnstable()); + assertFalse(notifier.getNotifyRegression()); assertTrue(notifier.getNotifyFailure()); assertFalse(notifier.getNotifyBackToNormal()); assertFalse(notifier.getNotifyRepeatedFailure()); @@ -77,6 +78,7 @@ public void testGlobalSettingsOverriden() { assertFalse(notifier.getNotifyAborted()); assertFalse(notifier.getNotifyNotBuilt()); assertFalse(notifier.getNotifyUnstable()); + assertFalse(notifier.getNotifyRegression()); assertTrue(notifier.getNotifyFailure()); assertFalse(notifier.getNotifyBackToNormal()); assertFalse(notifier.getNotifyRepeatedFailure()); @@ -104,6 +106,7 @@ public void testGlobalSettingsNotOverridden() throws IOException { assertFalse(notifier.getNotifyAborted()); assertFalse(notifier.getNotifyNotBuilt()); assertFalse(notifier.getNotifyUnstable()); + assertFalse(notifier.getNotifyRegression()); assertTrue(notifier.getNotifyFailure()); assertFalse(notifier.getNotifyBackToNormal()); assertFalse(notifier.getNotifyRepeatedFailure()); @@ -159,6 +162,7 @@ public void testMigrationOfSomeJobs() throws IOException { assertTrue(notifier.getNotifyAborted()); assertTrue(notifier.getNotifyNotBuilt()); assertTrue(notifier.getNotifyUnstable()); + assertTrue(notifier.getNotifyRegression()); assertTrue(notifier.getNotifyFailure()); assertTrue(notifier.getNotifyBackToNormal()); assertTrue(notifier.getNotifyRepeatedFailure()); diff --git a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testBasicMigration/jobs/Test_Slack_Plugin/config.xml b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testBasicMigration/jobs/Test_Slack_Plugin/config.xml index b5c573f8..567cae21 100644 --- a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testBasicMigration/jobs/Test_Slack_Plugin/config.xml +++ b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testBasicMigration/jobs/Test_Slack_Plugin/config.xml @@ -13,6 +13,7 @@ false false false + false true false false diff --git a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsNotOverridden/jobs/Test_Slack_Plugin/config.xml b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsNotOverridden/jobs/Test_Slack_Plugin/config.xml index 7b976eaf..38b5e660 100644 --- a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsNotOverridden/jobs/Test_Slack_Plugin/config.xml +++ b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsNotOverridden/jobs/Test_Slack_Plugin/config.xml @@ -13,6 +13,7 @@ false false false + false true false false diff --git a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsOverriden/jobs/Test_Slack_Plugin/config.xml b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsOverriden/jobs/Test_Slack_Plugin/config.xml index b5c573f8..567cae21 100644 --- a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsOverriden/jobs/Test_Slack_Plugin/config.xml +++ b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testGlobalSettingsOverriden/jobs/Test_Slack_Plugin/config.xml @@ -13,6 +13,7 @@ false false false + false true false false diff --git a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationOfSomeJobs/jobs/Test_02/config.xml b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationOfSomeJobs/jobs/Test_02/config.xml index 40ff1817..ac64d54e 100644 --- a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationOfSomeJobs/jobs/Test_02/config.xml +++ b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationOfSomeJobs/jobs/Test_02/config.xml @@ -13,6 +13,7 @@ true true true + true true true true diff --git a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationWithNoNotifier/jobs/Test_01/config.xml b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationWithNoNotifier/jobs/Test_01/config.xml index 477394d2..208bb67b 100644 --- a/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationWithNoNotifier/jobs/Test_01/config.xml +++ b/src/test/resources/jenkins/plugins/slack/config/BackwordsCompatible_1_8_SlackNotifierTest/testMigrationWithNoNotifier/jobs/Test_01/config.xml @@ -13,6 +13,7 @@ false false false + false false false false