From 0f1676b9857c0b183b835a2a8fd59efdd3fff45e Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 6 Aug 2018 15:44:03 +0200 Subject: [PATCH 1/4] Adapt the implementation to a single LogStorage implementation --- demo/src/main/groovy/4_Jobs.groovy | 20 +++++++++++++------ pom.xml | 9 +++++++-- .../ElasticsearchEventWriter.java | 5 ++++- .../ElasticsearchLogBrowser.java | 12 +++++++++-- .../ElasticsearchLogBrowserFactory.java | 6 +++--- .../ElasticsearchLoggingMethod.java | 6 +++--- .../elasticsearch/PipelineSmokeTest.java | 4 ++++ 7 files changed, 45 insertions(+), 17 deletions(-) diff --git a/demo/src/main/groovy/4_Jobs.groovy b/demo/src/main/groovy/4_Jobs.groovy index d0cc7e2..aeed750 100644 --- a/demo/src/main/groovy/4_Jobs.groovy +++ b/demo/src/main/groovy/4_Jobs.groovy @@ -1,4 +1,6 @@ //TODO: Migrate to JCasC once it supports disabling via system property + +import hudson.model.FreeStyleProject import jenkins.model.Jenkins import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition import org.jenkinsci.plugins.workflow.job.WorkflowJob @@ -11,8 +13,8 @@ if (!Boolean.getBoolean("io.jenkins.demo.external-task-logging-elk.enabled")) { println("-- Creating Jobs") //TODO: Classes do not work here, so some copy-paste for now -if(Jenkins.instance.getItem("Demo_master") == null) { - WorkflowJob project1 = Jenkins.instance.createProject(WorkflowJob.class, "Demo_master") +if(Jenkins.instance.getItem("Pipeline_master") == null) { + WorkflowJob project1 = Jenkins.instance.createProject(WorkflowJob.class, "Pipeline_master") project1.definition = new CpsFlowDefinition( "node('master') {\n" + " sh \"ping -c 20 google.com\"\n" + @@ -22,8 +24,8 @@ if(Jenkins.instance.getItem("Demo_master") == null) { project1.save() } -if(Jenkins.instance.getItem("Demo_agent") == null) { - WorkflowJob project2 = Jenkins.instance.createProject(WorkflowJob.class, "Demo_agent") +if(Jenkins.instance.getItem("Pipeline_agent") == null) { + WorkflowJob project2 = Jenkins.instance.createProject(WorkflowJob.class, "Pipeline_agent") project2.definition = new CpsFlowDefinition( "node('agent') {\n" + " sh \"echo Hello, world!\"\n" + @@ -35,8 +37,8 @@ if(Jenkins.instance.getItem("Demo_agent") == null) { project2.save() } -if(Jenkins.instance.getItem("Demo_parallel") == null) { - WorkflowJob project3 = Jenkins.instance.createProject(WorkflowJob.class, "Demo_parallel") +if(Jenkins.instance.getItem("Pipeline_parallel") == null) { + WorkflowJob project3 = Jenkins.instance.createProject(WorkflowJob.class, "Pipeline_parallel") project3.definition = new CpsFlowDefinition( "parallel local: {\n" + " node('master') {\n" + @@ -54,3 +56,9 @@ if(Jenkins.instance.getItem("Demo_parallel") == null) { ) project3.save() } + +{ + def prj = Jenkins.instance.createProject(FreeStyleProject.class, "Freestyle_master") + prj.getB + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index e6617a5..0cb4087 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,8 @@ 1.0-alpha-1 -SNAPSHOT - 2.131-SNAPSHOT + 2.137-20180806.095555-1 + 2.137-20180806.095623-1 8 true @@ -43,7 +44,7 @@ io.jenkins.plugins.external-logging external-logging-api - 1.0-alpha-1-SNAPSHOT + 1.0-alpha-1-20180806.114613-1 org.jenkins-ci.plugins @@ -118,6 +119,10 @@ repo.jenkins-ci.org https://repo.jenkins-ci.org/public/ + + incrementals + https://repo.jenkins-ci.org/incrementals/ + diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchEventWriter.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchEventWriter.java index 8ae7f18..aa83553 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchEventWriter.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchEventWriter.java @@ -14,6 +14,7 @@ import javax.annotation.Nonnull; import java.io.IOException; import java.io.Serializable; +import java.nio.charset.Charset; import java.util.Calendar; import java.util.Map; import java.util.logging.Level; @@ -32,7 +33,9 @@ public class ElasticsearchEventWriter extends ExternalLoggingEventWriter { private boolean connectionBroken; public ElasticsearchEventWriter(@CheckForNull String prefix, - @Nonnull ElasticSearchDao dao) { + @Nonnull ElasticSearchDao dao, + @Nonnull Charset charset) { + super(charset); this.prefix = prefix; this.dao = dao; } diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowser.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowser.java index ba3f0db..93992f9 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowser.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowser.java @@ -1,20 +1,22 @@ package io.jenkins.plugins.extlogging.elasticsearch; import hudson.console.AnnotatedLargeText; +import io.jenkins.plugins.extlogging.api.ExternalLogBrowser; import io.jenkins.plugins.extlogging.elasticsearch.util.ElasticSearchDao; -import jenkins.model.logging.LogBrowser; import jenkins.model.logging.Loggable; import jenkins.model.logging.impl.BrokenAnnotatedLargeText; import javax.annotation.CheckForNull; +import java.io.IOException; /** * Log browser for Elasticsearch. * @author Oleg Nenashev * @since TODO */ -public class ElasticsearchLogBrowser extends LogBrowser { +public class ElasticsearchLogBrowser extends ExternalLogBrowser { + //TODO(oleg-nenashev): jglick requests example of several implementations public ElasticsearchLogBrowser(Loggable loggable) { super(loggable); } @@ -43,4 +45,10 @@ public AnnotatedLargeText stepLog(@CheckForNull String stepId, boolean b) { return new ElasticsearchLogLargeTextProvider(dao, getOwner(), stepId).getLogText(); } + + @Override + public boolean deleteLog() { + // Not supported + return false; + } } diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowserFactory.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowserFactory.java index bafe4b6..3567d2d 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowserFactory.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLogBrowserFactory.java @@ -2,9 +2,9 @@ import hudson.Extension; import hudson.model.Run; +import io.jenkins.plugins.extlogging.api.ExternalLogBrowser; import io.jenkins.plugins.extlogging.api.ExternalLogBrowserFactory; import io.jenkins.plugins.extlogging.api.ExternalLogBrowserFactoryDescriptor; -import jenkins.model.logging.LogBrowser; import jenkins.model.logging.Loggable; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; @@ -25,7 +25,7 @@ public ElasticsearchLogBrowserFactory() { @CheckForNull @Override - public LogBrowser create(Loggable loggable) { + public ExternalLogBrowser create(Loggable loggable) { if (loggable instanceof Run) { return new ElasticsearchLogBrowser((Run) loggable); } @@ -33,7 +33,7 @@ public LogBrowser create(Loggable loggable) { } @Extension - @Symbol("logstashElasticsearch") + @Symbol("elasticsearch") public static class DescriptorImpl extends ExternalLogBrowserFactoryDescriptor { } diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLoggingMethod.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLoggingMethod.java index 1f68665..d8b5dbb 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLoggingMethod.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/ElasticsearchLoggingMethod.java @@ -5,12 +5,12 @@ import java.io.OutputStream; import java.util.List; +import io.jenkins.plugins.extlogging.api.ExternalLogBrowser; import io.jenkins.plugins.extlogging.api.ExternalLoggingEventWriter; import io.jenkins.plugins.extlogging.api.OutputStreamWrapper; import io.jenkins.plugins.extlogging.api.ExternalLoggingMethod; import io.jenkins.plugins.extlogging.api.impl.ExternalLoggingOutputStream; import io.jenkins.plugins.extlogging.elasticsearch.util.ElasticSearchDao; -import jenkins.model.logging.LogBrowser; import jenkins.model.logging.Loggable; import javax.annotation.CheckForNull; @@ -31,14 +31,14 @@ public ElasticsearchLoggingMethod(Loggable loggable, @CheckForNull String prefix } @Override - public LogBrowser getDefaultLogBrowser() { + public ExternalLogBrowser getDefaultLogBrowser() { return new ElasticsearchLogBrowser(getOwner()); } @Override protected ExternalLoggingEventWriter _createWriter() throws IOException { ElasticSearchDao dao = ElasticsearchGlobalConfiguration.getInstance().toDao(); - return new ElasticsearchEventWriter(prefix, dao); + return new ElasticsearchEventWriter(prefix, dao, getOwner().getCharset()); } // @Override diff --git a/src/test/java/io/jenkins/plugins/extlogging/elasticsearch/PipelineSmokeTest.java b/src/test/java/io/jenkins/plugins/extlogging/elasticsearch/PipelineSmokeTest.java index c100e14..6aaebfa 100644 --- a/src/test/java/io/jenkins/plugins/extlogging/elasticsearch/PipelineSmokeTest.java +++ b/src/test/java/io/jenkins/plugins/extlogging/elasticsearch/PipelineSmokeTest.java @@ -11,6 +11,9 @@ import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import static org.junit.Assert.assertThat; +import static org.hamcrest.Matchers.*; + /** * @author Oleg Nenashev * @since TODO @@ -41,6 +44,7 @@ public void spotcheck_Default() throws Exception { //to automate handling of such use-cases Thread.sleep(10000); j.assertLogContains("Hello", build); + assertThat(build.getLog(), not(containsString("[["))); } @Test From 09d9cc1d9352b5b722603644f31b52bb878730b9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 6 Aug 2018 20:16:27 +0200 Subject: [PATCH 2/4] Revert bogus code in Groovy init steps --- demo/src/main/groovy/4_Jobs.groovy | 6 ------ 1 file changed, 6 deletions(-) diff --git a/demo/src/main/groovy/4_Jobs.groovy b/demo/src/main/groovy/4_Jobs.groovy index aeed750..4dc05ba 100644 --- a/demo/src/main/groovy/4_Jobs.groovy +++ b/demo/src/main/groovy/4_Jobs.groovy @@ -56,9 +56,3 @@ if(Jenkins.instance.getItem("Pipeline_parallel") == null) { ) project3.save() } - -{ - def prj = Jenkins.instance.createProject(FreeStyleProject.class, "Freestyle_master") - prj.getB - -} \ No newline at end of file From 024922641d2211af4bfdccf57be3a8c39f3b1e53 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 6 Aug 2018 20:20:33 +0200 Subject: [PATCH 3/4] Fix Findbugs issues --- .../elasticsearch/UncompressedAnnotatedLargeText.java | 2 +- .../extlogging/elasticsearch/util/ElasticSearchDao.java | 3 +++ .../elasticsearch/util/RemoteLogstashOutputStream.java | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/UncompressedAnnotatedLargeText.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/UncompressedAnnotatedLargeText.java index 00b60f8..416fa8a 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/UncompressedAnnotatedLargeText.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/UncompressedAnnotatedLargeText.java @@ -39,7 +39,7 @@ public UncompressedAnnotatedLargeText(ByteBuffer memory, Charset charset, boolea public long writeHtmlTo(long start, Writer w) throws IOException { ConsoleAnnotationOutputStream caw = new ConsoleAnnotationOutputStream( w, createAnnotator(Stapler.getCurrentRequest()), context, charset); - long r = super.writeLogTo(start, caw); + super.writeLogTo(start, caw); caw.flush(); long initial = memory.length(); /* diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/ElasticSearchDao.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/ElasticSearchDao.java index ade34f1..bf33585 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/ElasticSearchDao.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/ElasticSearchDao.java @@ -26,6 +26,7 @@ package io.jenkins.plugins.extlogging.elasticsearch.util; import com.google.common.collect.Range; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; @@ -54,6 +55,8 @@ * @author Liam Newman * @author Oleg Nenashev */ +//TODO: fix before the release +@SuppressFBWarnings(value = "SE_NO_SERIALVERSIONID", justification = "To be set before the release") public class ElasticSearchDao implements Serializable { private static final Range SUCCESS_CODES = closedOpen(200,300); diff --git a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/RemoteLogstashOutputStream.java b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/RemoteLogstashOutputStream.java index 5ae2ffa..b3e14ff 100644 --- a/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/RemoteLogstashOutputStream.java +++ b/src/main/java/io/jenkins/plugins/extlogging/elasticsearch/util/RemoteLogstashOutputStream.java @@ -57,7 +57,7 @@ protected void eol(byte[] b, int len) throws IOException { try { this.flush(); if (!logstash.isConnectionBroken()) { - String line = new String(b, 0, len).trim(); + String line = new String(b, 0, len, logstash.getCharset()).trim(); line = ConsoleNote.removeNotes(line); logstash.writeMessage(prefix + line); } From f926c89caf69150a778a51cd8e76ed8aed862584 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 7 Aug 2018 18:02:56 +0200 Subject: [PATCH 4/4] Pick up new patches from upstream --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 0cb4087..2027570 100644 --- a/pom.xml +++ b/pom.xml @@ -20,8 +20,8 @@ 1.0-alpha-1 -SNAPSHOT - 2.137-20180806.095555-1 - 2.137-20180806.095623-1 + 2.137-20180807.141417-2 + 2.137-20180807.141447-2 8 true @@ -44,7 +44,7 @@ io.jenkins.plugins.external-logging external-logging-api - 1.0-alpha-1-20180806.114613-1 + 1.0-alpha-1-20180807.155933-3 org.jenkins-ci.plugins