From 28834cd6611331f46e275702419b763017b028b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20Bostro=CC=88m?= Date: Wed, 29 Oct 2014 17:51:02 +0100 Subject: [PATCH] JENKINS-25361 When retriggering a failed build status will not be QUEUED if the build ends up in queued. Added equals method for AbstractBuild since it dont work. --- .../diabol/jenkins/pipeline/domain/Task.java | 5 +++- .../jenkins/pipeline/util/BuildUtil.java | 17 ++++++++++- .../jenkins/pipeline/domain/TaskTest.java | 28 +++++++++++++++++++ .../jenkins/pipeline/util/BuildUtilTest.java | 18 ++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/main/java/se/diabol/jenkins/pipeline/domain/Task.java b/src/main/java/se/diabol/jenkins/pipeline/domain/Task.java index 3ac084b27..ee622e9e1 100644 --- a/src/main/java/se/diabol/jenkins/pipeline/domain/Task.java +++ b/src/main/java/se/diabol/jenkins/pipeline/domain/Task.java @@ -137,7 +137,10 @@ public static Task getPrototypeTask(AbstractProject project) { public Task getLatestTask(ItemGroup context, AbstractBuild firstBuild) { AbstractProject project = getProject(this, context); - AbstractBuild build = BuildUtil.match(project.getBuilds(), firstBuild); + AbstractBuild build = null; + if (!ProjectUtil.isQueued(project, firstBuild)) { + build = BuildUtil.match(project.getBuilds(), firstBuild); + } Status taskStatus = SimpleStatus.resolveStatus(project, build, firstBuild); String taskLink; diff --git a/src/main/java/se/diabol/jenkins/pipeline/util/BuildUtil.java b/src/main/java/se/diabol/jenkins/pipeline/util/BuildUtil.java index 0a3eb9124..f7da4eada 100644 --- a/src/main/java/se/diabol/jenkins/pipeline/util/BuildUtil.java +++ b/src/main/java/se/diabol/jenkins/pipeline/util/BuildUtil.java @@ -80,7 +80,8 @@ public static AbstractBuild getFirstUpstreamBuild(AbstractBuild build, AbstractP public static AbstractBuild match(RunList runList, AbstractBuild firstBuild) { if (firstBuild != null) { for (AbstractBuild currentBuild : runList) { - if (firstBuild.equals(BuildUtil.getFirstUpstreamBuild(currentBuild, firstBuild.getProject()))) { + AbstractBuild build = BuildUtil.getFirstUpstreamBuild(currentBuild, firstBuild.getProject()); + if (equals(build, firstBuild)) { return currentBuild; } } @@ -89,4 +90,18 @@ public static AbstractBuild match(RunList runList, Abst } + public static boolean equals(AbstractBuild b1, AbstractBuild b2) { + if (b1 != null && b2 != null) { + if (b1.getProject().getFullName().equals(b2.getProject().getFullName()) && b1.getNumber() == b2.getNumber()) { + return true; + } else { + return false; + } + } else { + return false; + } + + } + + } diff --git a/src/test/java/se/diabol/jenkins/pipeline/domain/TaskTest.java b/src/test/java/se/diabol/jenkins/pipeline/domain/TaskTest.java index 1e67fac38..eacaed65b 100644 --- a/src/test/java/se/diabol/jenkins/pipeline/domain/TaskTest.java +++ b/src/test/java/se/diabol/jenkins/pipeline/domain/TaskTest.java @@ -32,9 +32,13 @@ import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.FailureBuilder; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; +import se.diabol.jenkins.pipeline.DeliveryPipelineView; import se.diabol.jenkins.pipeline.PipelineProperty; +import se.diabol.jenkins.pipeline.domain.status.SimpleStatus; +import se.diabol.jenkins.pipeline.domain.status.Status; import java.io.IOException; import java.util.Collection; @@ -131,4 +135,28 @@ public void testTaskNameForMultiConfiguration() throws Exception { } + @Test + public void testFailedThenQueued() throws Exception { + FreeStyleProject a = jenkins.createFreeStyleProject("a"); + FreeStyleProject b = jenkins.createFreeStyleProject("b"); + jenkins.setQuietPeriod(0); + a.getPublishersList().add(new BuildPipelineTrigger("b", null)); + b.getBuildersList().add(new FailureBuilder()); + FreeStyleBuild build = jenkins.buildAndAssertSuccess(a); + Task task = Task.getPrototypeTask(b); + assertTrue(task.getLatestTask(jenkins.getInstance(), build).getStatus().isIdle()); + + DeliveryPipelineView view = new DeliveryPipelineView("Pipeline", jenkins.getInstance()); + view.triggerManual("b", "a", "1"); + jenkins.waitUntilNoActivity(); + assertTrue(task.getLatestTask(jenkins.getInstance(), build).getStatus().isFailed()); + jenkins.getInstance().setNumExecutors(0); + jenkins.getInstance().reload(); + view.triggerManual("b", "a", "1"); + + assertTrue(task.getLatestTask(jenkins.getInstance(), build).getStatus().isQueued()); + + } + + } diff --git a/src/test/java/se/diabol/jenkins/pipeline/util/BuildUtilTest.java b/src/test/java/se/diabol/jenkins/pipeline/util/BuildUtilTest.java index cd74e75a6..c040decd1 100644 --- a/src/test/java/se/diabol/jenkins/pipeline/util/BuildUtilTest.java +++ b/src/test/java/se/diabol/jenkins/pipeline/util/BuildUtilTest.java @@ -25,6 +25,7 @@ import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.WithoutJenkins; import se.diabol.jenkins.pipeline.test.TestUtil; @@ -87,6 +88,23 @@ public void testGetUpstreamBuildProjectRenamed() { } + @Test + public void testEquals() throws Exception { + MockFolder folder1 = jenkins.createFolder("Folder1"); + MockFolder folder2 = jenkins.createFolder("Folder2"); + FreeStyleProject job1 = folder1.createProject(FreeStyleProject.class, "a"); + FreeStyleProject job2 = folder2.createProject(FreeStyleProject.class, "a"); + AbstractBuild build1 = jenkins.buildAndAssertSuccess(job1); + AbstractBuild build2 = jenkins.buildAndAssertSuccess(job2); + assertFalse(BuildUtil.equals(build1, build2)); + assertTrue(BuildUtil.equals(build1, build1)); + AbstractBuild build3 = jenkins.buildAndAssertSuccess(job1); + assertFalse(BuildUtil.equals(build1, build3)); + assertFalse(BuildUtil.equals(null, null)); + + + } +