diff --git a/src/main/java/org/jenkinsci/plugins/workflow/job/WorkflowRun.java b/src/main/java/org/jenkinsci/plugins/workflow/job/WorkflowRun.java index 0a584743..ccaf9342 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/job/WorkflowRun.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/job/WorkflowRun.java @@ -1024,7 +1024,15 @@ private final class NodePrintListener implements GraphListener.Synchronous { @Override public void doConsoleText(StaplerRequest req, StaplerResponse rsp) throws IOException { rsp.setContentType("text/plain;charset=UTF-8"); try (OutputStream os = rsp.getCompressedOutputStream(req)) { - getLogText().writeLogTo(0, os); + // Similar to writeWholeLogTo but terminates even if !logText.complete: + long pos = 0; + while (true) { + long pos2 = getLogText().writeLogTo(pos, os); + if (pos2 <= pos) { + break; + } + pos = pos2; + } } } diff --git a/src/test/java/org/jenkinsci/plugins/workflow/job/console/DefaultLogStorageTest.java b/src/test/java/org/jenkinsci/plugins/workflow/job/console/DefaultLogStorageTest.java index 09d0e874..5aa45e6c 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/job/console/DefaultLogStorageTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/job/console/DefaultLogStorageTest.java @@ -58,6 +58,7 @@ import org.jenkinsci.plugins.workflow.steps.StepDescriptor; import org.jenkinsci.plugins.workflow.steps.StepExecution; import org.jenkinsci.plugins.workflow.steps.SynchronousStepExecution; +import org.jenkinsci.plugins.workflow.test.steps.SemaphoreStep; import static org.junit.Assert.*; import static org.junit.Assume.*; import org.junit.Ignore; @@ -254,4 +255,14 @@ static class Execution extends SynchronousStepExecution { b.writeWholeLogTo(System.out); } + @Test public void doConsoleText() throws Exception { + WorkflowJob p = r.createProject(WorkflowJob.class, "p"); + p.setDefinition(new CpsFlowDefinition("@NonCPS def giant() {(0..19999).join('\\n')}; echo giant(); semaphore 'wait'", true)); + WorkflowRun b = p.scheduleBuild2(0).waitForStart(); + SemaphoreStep.waitForStart("wait/1", b); + assertThat(r.createWebClient().goTo(b.getUrl() + "consoleText", "text/plain").getWebResponse().getContentAsString(), containsString("\n12345\n")); + SemaphoreStep.success("wait/1", null); + r.assertBuildStatusSuccess(r.waitForCompletion(b)); + } + }