diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java b/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java index 55bd1c35..fd5c179b 100644 --- a/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java +++ b/src/main/java/hudson/plugins/parameterizedtrigger/TriggerBuilder.java @@ -150,55 +150,59 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen continue; } for (QueueTaskFuture future : futures.get(p)) { - try { - if (future == null) { - listener.getLogger() - .println("Skipping " + ModelHyperlinkNote.encodeTo(p) - + ". The project was not triggered for some reason."); - continue; - } - + if (future == null) { listener.getLogger() - .println("Waiting for the completion of " - + HyperlinkNote.encodeTo('/' + p.getUrl(), p.getFullDisplayName())); - Run startedRun; - try { - startedRun = future.waitForStart(); - } catch (InterruptedException x) { - listener.getLogger() - .println("Build aborting: cancelling queued project " - + HyperlinkNote.encodeTo('/' + p.getUrl(), p.getFullDisplayName())); - future.cancel(true); - throw x; // rethrow so that the triggering project get flagged as cancelled - } + .println("Skipping " + ModelHyperlinkNote.encodeTo(p) + + ". The project was not triggered for some reason."); + continue; + } + listener.getLogger() + .println("Waiting for the completion of " + + HyperlinkNote.encodeTo('/' + p.getUrl(), p.getFullDisplayName())); + Run startedRun; + Result completedResult; + try { + startedRun = future.waitForStart(); listener.getLogger() .println(HyperlinkNote.encodeTo( '/' + startedRun.getUrl(), startedRun.getFullDisplayName()) + " started."); Run completedRun = future.get(); - Result completedResult = completedRun.getResult(); + completedResult = completedRun.getResult(); listener.getLogger() .println(HyperlinkNote.encodeTo( '/' + completedRun.getUrl(), completedRun.getFullDisplayName()) + " completed. Result was " + completedResult); + BuildInfoExporterAction.addBuildInfoExporterAction( build, completedRun.getParent().getFullName(), completedRun.getNumber(), completedResult); - if (buildStepResult && config.getBlock().mapBuildStepResult(completedResult)) { - Result r = config.getBlock().mapBuildResult(completedResult); - if (r != null) { // The blocking job is not a success - build.setResult(r); - } - } else { - buildStepResult = false; - } + } catch (InterruptedException x) { + listener.getLogger() + .println("Build aborting: cancelling queued project " + + HyperlinkNote.encodeTo('/' + p.getUrl(), p.getFullDisplayName())); + future.cancel(true); + throw x; // rethrow so that the triggering project get flagged as cancelled } catch (CancellationException x) { - throw new AbortException(p.getFullDisplayName() + " aborted."); + listener.getLogger() + .println("Not built: " + p.getFullDisplayName() + + " has been cancelled while waiting in the queue."); + completedResult = Result.NOT_BUILT; + } + + if (buildStepResult && config.getBlock().mapBuildStepResult(completedResult)) { + + Result r = config.getBlock().mapBuildResult(completedResult); + if (r != null) { // The blocking job is not a success + build.setResult(r); + } + } else { + buildStepResult = false; } } } diff --git a/src/test/java/hudson/plugins/parameterizedtrigger/test/TriggerBuilderTest.java b/src/test/java/hudson/plugins/parameterizedtrigger/test/TriggerBuilderTest.java index 733349eb..78aeaed1 100644 --- a/src/test/java/hudson/plugins/parameterizedtrigger/test/TriggerBuilderTest.java +++ b/src/test/java/hudson/plugins/parameterizedtrigger/test/TriggerBuilderTest.java @@ -253,6 +253,39 @@ public void testCancelsDownstreamBuildWhenInterrupted() throws Exception { assertEquals("No build left in queue", 0, r.jenkins.getQueue().countBuildableItems()); } + @Test + public void testCancelledFromBuildQueue() throws Exception { + r.jenkins.setNumExecutors(1); // the downstream-project would be in the build queue + + FreeStyleProject triggerProject = r.createFreeStyleProject("upstream-project"); + FreeStyleProject downstreamProject = r.createFreeStyleProject("downstream-project"); + + TriggerBuilder triggerBuilder = new TriggerBuilder(createTriggerConfig("downstream-project")); + + triggerProject.getBuildersList().add(triggerBuilder); + QueueTaskFuture parentBuild = triggerProject.scheduleBuild2(0); + + parentBuild.waitForStart(); + Thread.sleep(500); + + assertEquals( + "Downstream project is in build queue", 1, r.jenkins.getQueue().countBuildableItems()); + + // Cancel the queued build + r.jenkins.getQueue().clear(); + parentBuild.get(); + + assertLines( + triggerProject.getLastBuild(), + "Waiting for the completion of downstream-project", + "Not built: downstream-project has been cancelled while waiting in the queue.", + // The test class configures the BlockingBehaviour to never + // fail and that includes cancelled job. + "Finished: SUCCESS"); + assertNull("No downstream build has been run", downstreamProject.getLastBuild()); + assertEquals("No build left in queue", 0, r.jenkins.getQueue().countBuildableItems()); + } + @Test public void testConsoleOutputWithCounterParameters() throws Exception { r.createFreeStyleProject("project1");