diff --git a/pom.xml b/pom.xml index 28b06c86..32f39da0 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,12 @@ ansicolor test + + org.jenkins-ci.plugins + pipeline-stage-step + 2.3 + test + org.jenkins-ci.plugins.workflow workflow-cps diff --git a/src/main/java/jenkins/plugins/logstash/LogstashConsoleLogFilter.java b/src/main/java/jenkins/plugins/logstash/LogstashConsoleLogFilter.java index d5995163..0f793e63 100644 --- a/src/main/java/jenkins/plugins/logstash/LogstashConsoleLogFilter.java +++ b/src/main/java/jenkins/plugins/logstash/LogstashConsoleLogFilter.java @@ -6,6 +6,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import hudson.EnvVars; import hudson.Extension; import hudson.console.ConsoleLogFilter; import hudson.model.AbstractBuild; @@ -16,14 +17,16 @@ public class LogstashConsoleLogFilter extends ConsoleLogFilter implements Serializable { + private EnvVars envVars; private static final Logger LOGGER = Logger.getLogger(LogstashConsoleLogFilter.class.getName()); private transient Run run; public LogstashConsoleLogFilter() {} - public LogstashConsoleLogFilter(Run run) + public LogstashConsoleLogFilter(Run run, EnvVars envVars) { this.run = run; + this.envVars = envVars; } private static final long serialVersionUID = 1L; @@ -62,7 +65,7 @@ public OutputStream decorateLogger(Run build, OutputStream logger) throws IOExce LogstashWriter getLogStashWriter(Run build, OutputStream errorStream) { - return new LogstashWriter(build, errorStream, null, build.getCharset()); + return new LogstashWriter(build, errorStream, null, build.getCharset(), envVars); } private boolean isLogstashEnabled(Run build) diff --git a/src/main/java/jenkins/plugins/logstash/LogstashWriter.java b/src/main/java/jenkins/plugins/logstash/LogstashWriter.java index 2523814a..70a14226 100644 --- a/src/main/java/jenkins/plugins/logstash/LogstashWriter.java +++ b/src/main/java/jenkins/plugins/logstash/LogstashWriter.java @@ -25,6 +25,7 @@ package jenkins.plugins.logstash; +import hudson.EnvVars; import hudson.model.AbstractBuild; import hudson.model.TaskListener; import hudson.model.Run; @@ -61,8 +62,14 @@ public class LogstashWriter { private final LogstashIndexerDao dao; private boolean connectionBroken; private final Charset charset; + private final EnvVars envVars; public LogstashWriter(Run run, OutputStream error, TaskListener listener, Charset charset) { + this(run, error, listener, charset, null); + } + + public LogstashWriter(Run run, OutputStream error, TaskListener listener, Charset charset, EnvVars envVars) { + this.envVars = envVars; this.errorStream = error != null ? error : System.err; this.build = run; this.listener = listener; @@ -154,7 +161,7 @@ BuildData getBuildData() { if (build instanceof AbstractBuild) { return new BuildData((AbstractBuild) build, new Date(), listener); } else { - return new BuildData(build, new Date(), listener); + return new BuildData(build, new Date(), listener, envVars); } } diff --git a/src/main/java/jenkins/plugins/logstash/persistence/BuildData.java b/src/main/java/jenkins/plugins/logstash/persistence/BuildData.java index 4379a4de..65a48669 100644 --- a/src/main/java/jenkins/plugins/logstash/persistence/BuildData.java +++ b/src/main/java/jenkins/plugins/logstash/persistence/BuildData.java @@ -24,6 +24,7 @@ package jenkins.plugins.logstash.persistence; +import hudson.EnvVars; import hudson.model.Action; import hudson.model.Environment; import hudson.model.Executor; @@ -212,20 +213,23 @@ public BuildData(AbstractBuild build, Date currentTime, TaskListener liste } // Pipeline project build - public BuildData(Run build, Date currentTime, TaskListener listener) { + public BuildData(Run build, Date currentTime, TaskListener listener, EnvVars envVars) { initData(build, currentTime); rootProjectName = projectName; rootFullProjectName = fullProjectName; rootProjectDisplayName = displayName; rootBuildNum = buildNum; - - try { - // TODO: sensitive variables are not filtered, c.f. https://stackoverflow.com/questions/30916085 - buildVariables = build.getEnvironment(listener); - } catch (IOException | InterruptedException e) { - LOGGER.log(WARNING,"Unable to get environment for " + build.getDisplayName(),e); - buildVariables = new HashMap<>(); + if (envVars != null) { + buildVariables = envVars; + } else { + try { + // TODO: sensitive variables are not filtered, c.f. https://stackoverflow.com/questions/30916085 + buildVariables = build.getEnvironment(listener); + } catch (IOException | InterruptedException e) { + LOGGER.log(WARNING,"Unable to get environment for " + build.getDisplayName(),e); + buildVariables = new HashMap<>(); + } } } diff --git a/src/main/java/jenkins/plugins/logstash/pipeline/LogstashStep.java b/src/main/java/jenkins/plugins/logstash/pipeline/LogstashStep.java index 142f97c1..317328b1 100644 --- a/src/main/java/jenkins/plugins/logstash/pipeline/LogstashStep.java +++ b/src/main/java/jenkins/plugins/logstash/pipeline/LogstashStep.java @@ -15,6 +15,7 @@ import org.jenkinsci.plugins.workflow.steps.StepExecution; import org.kohsuke.stapler.DataBoundConstructor; +import hudson.EnvVars; import hudson.Extension; import hudson.console.ConsoleLogFilter; import hudson.model.Run; @@ -59,6 +60,7 @@ public boolean start() throws Exception { context .newBodyInvoker() .withContext(createConsoleLogFilter(context)) + .withContext(context.get(EnvVars.class)) .withCallback(BodyExecutionCallback.wrap(context)) .start(); return false; @@ -68,7 +70,8 @@ private ConsoleLogFilter createConsoleLogFilter(StepContext context) throws IOException, InterruptedException { ConsoleLogFilter original = context.get(ConsoleLogFilter.class); Run build = context.get(Run.class); - ConsoleLogFilter subsequent = new LogstashConsoleLogFilter(build); + EnvVars envVars = context.get(EnvVars.class); + ConsoleLogFilter subsequent = new LogstashConsoleLogFilter(build, envVars); return BodyInvoker.mergeConsoleLogFilters(original, subsequent); } diff --git a/src/test/java/jenkins/plugins/logstash/PipelineTest.java b/src/test/java/jenkins/plugins/logstash/PipelineTest.java index ec67b616..27b484aa 100644 --- a/src/test/java/jenkins/plugins/logstash/PipelineTest.java +++ b/src/test/java/jenkins/plugins/logstash/PipelineTest.java @@ -13,6 +13,7 @@ import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.BuildWatcher; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import jenkins.plugins.logstash.configuration.MemoryIndexer; @@ -38,20 +39,28 @@ public void setup() throws Exception config.setEnabled(true); } + @Issue("JENKINS-61735") @Test public void logstash() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); - p.setDefinition(new CpsFlowDefinition("logstash {\n" + - "currentBuild.result = 'SUCCESS'\n" + - "echo 'Message'\n" + - "}", true)); + p.setDefinition(new CpsFlowDefinition( + "node('master') {\n" + + " stage('mystage') {\n" + + " logstash {\n" + + " currentBuild.result = 'SUCCESS'\n" + + " echo 'Message'\n" + + " }\n" + + " }\n" + + "}", true)); j.assertBuildStatusSuccess(p.scheduleBuild2(0).get()); List dataLines = memoryDao.getOutput(); assertThat(dataLines.size(), equalTo(1)); JSONObject firstLine = dataLines.get(0); JSONObject data = firstLine.getJSONObject("data"); assertThat(data.getString("result"),equalTo("SUCCESS")); + assertThat(data.getJSONObject("buildVariables").getString("STAGE_NAME"), equalTo("mystage")); + assertThat(data.getJSONObject("buildVariables").getString("NODE_NAME"), equalTo("master")); } @Test