diff --git a/.gitignore b/.gitignore index 805bf2a0..283e3ca9 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ work .classpath .project .settings/ + +.DS_Store diff --git a/pom.xml b/pom.xml index da16b0b1..63b3af1b 100644 --- a/pom.xml +++ b/pom.xml @@ -218,6 +218,24 @@ clean verify + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M3 + + false + + + + org.apache.maven.plugins + maven-site-plugin + 3.7.1 + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.0.0-M5 + org.apache.maven.plugins maven-failsafe-plugin diff --git a/src/main/java/jenkins/plugins/logstash/LogstashOutputStream.java b/src/main/java/jenkins/plugins/logstash/LogstashOutputStream.java index f6ae5de2..e780198d 100644 --- a/src/main/java/jenkins/plugins/logstash/LogstashOutputStream.java +++ b/src/main/java/jenkins/plugins/logstash/LogstashOutputStream.java @@ -29,6 +29,9 @@ import java.io.IOException; import java.io.OutputStream; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Output stream that writes each line to the provided delegate output stream @@ -38,13 +41,28 @@ * @author Rusty Gerard */ public class LogstashOutputStream extends LineTransformationOutputStream { + private static final Logger LOGGER = Logger.getLogger(LogstashOutputStream.class.getName()); + private final OutputStream delegate; private final LogstashWriter logstash; + private final AtomicBoolean isBuildConnectionBroken; + private final String run; public LogstashOutputStream(OutputStream delegate, LogstashWriter logstash) { + this(delegate, logstash, new AtomicBoolean(false), ""); + } + + public LogstashOutputStream(OutputStream delegate, LogstashWriter logstash, AtomicBoolean isBuildConnectionBroken, String run) { super(); this.delegate = delegate; this.logstash = logstash; + this.isBuildConnectionBroken = isBuildConnectionBroken; + this.run = run; + + } + + public AtomicBoolean getIsBuildConnectionBroken() { + return isBuildConnectionBroken; } // for testing purposes @@ -58,11 +76,19 @@ protected void eol(byte[] b, int len) throws IOException { delegate.write(b, 0, len); this.flush(); - if(!logstash.isConnectionBroken()) { - String line = new String(b, 0, len, logstash.getCharset()); - line = ConsoleNote.removeNotes(line).trim(); - logstash.write(line); + if (!getIsBuildConnectionBroken().get()) { + if (!logstash.isConnectionBroken()) { + String line = new String(b, 0, len, logstash.getCharset()); + line = ConsoleNote.removeNotes(line).trim(); + logstash.write(line); + } + // Once it gets connection broken, set the build connection flag to true. + if (logstash.isConnectionBroken()) { + getIsBuildConnectionBroken().set(true); + LOGGER.log(Level.WARNING, "Mark logstash connection broken for build: {0}.", run); + } } + } /** diff --git a/src/main/java/jenkins/plugins/logstash/pipeline/GlobalDecorator.java b/src/main/java/jenkins/plugins/logstash/pipeline/GlobalDecorator.java index a8509f1c..5c3513e7 100644 --- a/src/main/java/jenkins/plugins/logstash/pipeline/GlobalDecorator.java +++ b/src/main/java/jenkins/plugins/logstash/pipeline/GlobalDecorator.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -25,6 +26,7 @@ public class GlobalDecorator extends TaskListenerDecorator { private transient Run run; private String stageName; private String agentName; + AtomicBoolean isBuildScopedConnectionBroken; public GlobalDecorator(WorkflowRun run) { this(run, null, null); @@ -34,12 +36,13 @@ public GlobalDecorator(WorkflowRun run, String stageName, String agentName) { this.run = run; this.stageName = stageName; this.agentName = agentName; + this.isBuildScopedConnectionBroken = new AtomicBoolean(false); } @Override public OutputStream decorate(OutputStream logger) throws IOException, InterruptedException { LogstashWriter writer = new LogstashWriter(run, logger, null, StandardCharsets.UTF_8, stageName, agentName); - LogstashOutputStream out = new LogstashOutputStream(logger, writer); + LogstashOutputStream out = new LogstashOutputStream(logger, writer, isBuildScopedConnectionBroken, run.toString()); return out; } diff --git a/src/main/resources/jar/maven-jxr-plugin-3.0.0.jar b/src/main/resources/jar/maven-jxr-plugin-3.0.0.jar new file mode 100644 index 00000000..b6ecd9b5 Binary files /dev/null and b/src/main/resources/jar/maven-jxr-plugin-3.0.0.jar differ diff --git a/src/test/java/jenkins/plugins/logstash/LogstashOutputStreamTest.java b/src/test/java/jenkins/plugins/logstash/LogstashOutputStreamTest.java index 163626cf..ca62ad8e 100644 --- a/src/test/java/jenkins/plugins/logstash/LogstashOutputStreamTest.java +++ b/src/test/java/jenkins/plugins/logstash/LogstashOutputStreamTest.java @@ -8,6 +8,7 @@ import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; import org.junit.Before; @@ -61,7 +62,7 @@ public void eolSuccess() throws Exception { // Verify results assertEquals("Results don't match", msg, buffer.toString()); - verify(mockWriter).isConnectionBroken(); + verify(mockWriter, times(2)).isConnectionBroken(); verify(mockWriter).write(msg); verify(mockWriter).getCharset(); } @@ -104,14 +105,14 @@ public void eolSuccessConnectionBroken() throws Exception { //Verify calls were made to the dao logging twice, not three times. verify(mockWriter, times(2)).write(msg); - verify(mockWriter, times(3)).isConnectionBroken(); + verify(mockWriter, times(6)).isConnectionBroken(); verify(mockWriter, times(2)).getCharset(); } @Test public void eolSuccessNoDao() throws Exception { when(mockWriter.isConnectionBroken()).thenReturn(true); - LogstashOutputStream los = new LogstashOutputStream(buffer, mockWriter); + LogstashOutputStream los = new LogstashOutputStream(buffer, mockWriter, new AtomicBoolean(false),""); String msg = "test"; buffer.reset(); @@ -120,6 +121,6 @@ public void eolSuccessNoDao() throws Exception { // Verify results assertEquals("Results don't match", msg, buffer.toString()); - verify(mockWriter).isConnectionBroken(); + verify(mockWriter, times(2)).isConnectionBroken(); } }