From eb8773647e669a2b36c8d7de9bbb70e9394aeb0c Mon Sep 17 00:00:00 2001 From: ikedam Date: Sat, 5 Sep 2015 12:52:03 +0900 Subject: [PATCH] [FIXED JENKINS-17626] Stores retry counts in NaginatorAction and reschedules build exact configured times. --- .../plugin/naginator/NaginatorAction.java | 29 ++++++++++++++++ .../plugin/naginator/NaginatorListener.java | 34 ++++++++++++++++--- .../naginator/NaginatorMatrixAction.java | 13 +++++++ .../naginator/NaginatorRetryAction.java | 6 ++-- .../naginator/ProgressiveDelayTest.java | 2 +- 5 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorAction.java b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorAction.java index 0267cd2..7eba708 100644 --- a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorAction.java +++ b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorAction.java @@ -7,6 +7,23 @@ * @author: Nicolas De Loof */ public class NaginatorAction implements BuildBadgeAction { + private final int retryCount; + + /** + * @deprecated use {@link NaginatorAction#NaginatorAction(int)} + */ + @Deprecated + public NaginatorAction() { + this(0); + } + + /** + * @param retryCount the number of retry this build is rescheduled for. + * @since 1.16 + */ + public NaginatorAction(int retryCount) { + this.retryCount = retryCount; + } public String getIconFileName() { return null; @@ -19,4 +36,16 @@ public String getDisplayName() { public String getUrlName() { return null; } + + /** + * Returns the number of retry this build is rescheduled for. + * This may be 0 for builds rescheduled with + * older versions of naginator-plugin. + * + * @return the number of retry this build is rescheduled for. + * @since 1.16 + */ + public int getRetryCount() { + return retryCount; + } } diff --git a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorListener.java b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorListener.java index e2385a6..bd2d4e8 100644 --- a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorListener.java +++ b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorListener.java @@ -59,9 +59,9 @@ public void onCompleted(AbstractBuild build, @Nonnull TaskListener listene if (!combsToRerun.isEmpty()) { LOGGER.log(Level.FINE, "schedule matrix rebuild"); - scheduleMatrixBuild(build, combsToRerun, n); + scheduleMatrixBuild(build, combsToRerun, n, retryCount + 1); } else { - scheduleBuild(build, n); + scheduleBuild(build, n, retryCount + 1); } } } @@ -87,7 +87,16 @@ public boolean canSchedule(Run build, NaginatorPublisher naginator) { return n < max; } - private int calculateRetryCount(@Nonnull Run r) { + public static int calculateRetryCount(@Nonnull Run r) { + NaginatorAction naginatorAction = r.getAction(NaginatorAction.class); + if (naginatorAction == null) { + return 0; + } + if (naginatorAction.getRetryCount() > 0) { + return naginatorAction.getRetryCount(); + } + + // fallback for build made by older versions. int n = 0; while (r != null && r.getAction(NaginatorAction.class) != null) { @@ -97,8 +106,16 @@ private int calculateRetryCount(@Nonnull Run r) { return n; } + /** + * @deprecated use {@link NaginatorScheduleAction} to make a build rescheduled. + */ + @Deprecated public boolean scheduleMatrixBuild(AbstractBuild build, List combinations, int n) { - NaginatorMatrixAction nma = new NaginatorMatrixAction(); + return scheduleMatrixBuild(build, combinations, n, NaginatorListener.calculateRetryCount(build)); + } + + private boolean scheduleMatrixBuild(AbstractBuild build, List combinations, int n, int retryCount) { + NaginatorMatrixAction nma = new NaginatorMatrixAction(retryCount); for (Combination c : combinations) { nma.addCombinationToRerun(c); } @@ -107,9 +124,16 @@ public boolean scheduleMatrixBuild(AbstractBuild build, List /** * Wrapper method for mocking purposes. + * + * @deprecated use {@link NaginatorScheduleAction} to make a build rescheduled. */ + @Deprecated public boolean scheduleBuild(AbstractBuild build, int n) { - return NaginatorRetryAction.scheduleBuild(build, n); + return scheduleBuild(build, n, NaginatorListener.calculateRetryCount(build)); + } + + private boolean scheduleBuild(AbstractBuild build, int n, int retryCount) { + return NaginatorRetryAction.scheduleBuild(build, n, retryCount); } private static final Logger LOGGER = Logger.getLogger(NaginatorListener.class.getName()); diff --git a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorMatrixAction.java b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorMatrixAction.java index f83c5e5..29b7267 100644 --- a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorMatrixAction.java +++ b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorMatrixAction.java @@ -12,7 +12,20 @@ public class NaginatorMatrixAction extends NaginatorAction { private List combsToRerun; + /** + * @deprecated use {@link NaginatorMatrixAction#NaginatorMatrixAction(int)}. + */ + @Deprecated public NaginatorMatrixAction() { + this(0); + } + + /** + * @param retryCount the number of retry this build is rescheduled for. + * @since 1.16 + */ + public NaginatorMatrixAction(int retryCount) { + super(retryCount); this.combsToRerun = new ArrayList(); } diff --git a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorRetryAction.java b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorRetryAction.java index e3f9772..f246254 100644 --- a/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorRetryAction.java +++ b/src/main/java/com/chikli/hudson/plugin/naginator/NaginatorRetryAction.java @@ -37,12 +37,12 @@ public String getUrlName() { public void doIndex(StaplerResponse res, @AncestorInPath AbstractBuild build) throws IOException { Jenkins.getInstance().checkPermission(Item.BUILD); - NaginatorRetryAction.scheduleBuild(build, 0); + NaginatorRetryAction.scheduleBuild(build, 0, NaginatorListener.calculateRetryCount(build)); res.sendRedirect2(build.getUpUrl()); } - static boolean scheduleBuild(final AbstractBuild build, final int delay) { - return scheduleBuild(build, delay, new NaginatorAction()); + static boolean scheduleBuild(final AbstractBuild build, final int delay, int retryCount) { + return scheduleBuild(build, delay, new NaginatorAction(retryCount)); } static boolean scheduleBuild(final AbstractBuild build, final int delay, final NaginatorAction action) { diff --git a/src/test/java/com/chikli/hudson/plugin/naginator/ProgressiveDelayTest.java b/src/test/java/com/chikli/hudson/plugin/naginator/ProgressiveDelayTest.java index c4d9201..ca8dce5 100644 --- a/src/test/java/com/chikli/hudson/plugin/naginator/ProgressiveDelayTest.java +++ b/src/test/java/com/chikli/hudson/plugin/naginator/ProgressiveDelayTest.java @@ -55,7 +55,7 @@ public void testComputeScheduleDelayNoMax() { private static AbstractBuild createBuild(final boolean hasNaginatorAction, final AbstractBuild previousBuild) { final AbstractBuild build = mock(AbstractBuild.class); when(build.getPreviousBuild()).thenReturn(previousBuild); - when(build.getAction(NaginatorAction.class)).thenReturn(hasNaginatorAction ? new NaginatorAction() : null); + when(build.getAction(NaginatorAction.class)).thenReturn(hasNaginatorAction ? new NaginatorAction(0) : null); return build; } }