Skip to content

Commit d9f2a6c

Browse files
authored
Merge pull request #229 from t-8ch/step-environment-contributor
[JENKINS-51170] Enable the usage of the StepEnvironmentContributor extensionpoint
2 parents a18ed94 + 213af04 commit d9f2a6c

File tree

3 files changed

+80
-4
lines changed

3 files changed

+80
-4
lines changed

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<parent>
2929
<groupId>org.jenkins-ci.plugins</groupId>
3030
<artifactId>plugin</artifactId>
31-
<version>3.28</version>
31+
<version>3.32</version>
3232
<relativePath />
3333
</parent>
3434
<groupId>org.jenkins-ci.plugins.workflow</groupId>
@@ -68,7 +68,7 @@
6868
<java.level>8</java.level>
6969
<no-test-jar>false</no-test-jar>
7070
<git-plugin.version>3.1.0</git-plugin.version>
71-
<workflow-support-plugin.version>2.21</workflow-support-plugin.version>
71+
<workflow-support-plugin.version>3.2-rc711.a7efba98306d</workflow-support-plugin.version>
7272
<scm-api-plugin.version>2.2.6</scm-api-plugin.version>
7373
<groovy-cps.version>1.25</groovy-cps.version>
7474
<structs-plugin.version>1.17</structs-plugin.version>
@@ -77,7 +77,7 @@
7777
<dependency>
7878
<groupId>org.jenkins-ci.plugins.workflow</groupId>
7979
<artifactId>workflow-step-api</artifactId>
80-
<version>2.18</version>
80+
<version>2.19-rc508.410020b15345</version>
8181
</dependency>
8282
<dependency>
8383
<groupId>org.jenkins-ci.plugins.workflow</groupId>

src/main/java/org/jenkinsci/plugins/workflow/cps/EnvActionImpl.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ private EnvActionImpl() {
6464
}
6565

6666
@Override public EnvVars getEnvironment() throws IOException, InterruptedException {
67+
return getEnvironment(getListener());
68+
}
69+
70+
private TaskListener getListener() throws IOException {
6771
TaskListener listener;
6872
if (owner instanceof FlowExecutionOwner.Executable) {
6973
FlowExecutionOwner executionOwner = ((FlowExecutionOwner.Executable) owner).asFlowExecutionOwner();
@@ -75,6 +79,10 @@ private EnvActionImpl() {
7579
} else {
7680
listener = new LogTaskListener(LOGGER, Level.INFO);
7781
}
82+
return listener;
83+
}
84+
85+
private EnvVars getEnvironment(TaskListener listener) throws IOException, InterruptedException {
7886
EnvVars e = owner.getEnvironment(listener);
7987
e.putAll(env);
8088
return e;
@@ -88,7 +96,12 @@ private EnvActionImpl() {
8896
@Override public String getProperty(String propertyName) {
8997
try {
9098
CpsThread t = CpsThread.current();
91-
return EnvironmentExpander.getEffectiveEnvironment(getEnvironment(), t.getContextVariable(EnvVars.class), t.getContextVariable(EnvironmentExpander.class)).get(propertyName);
99+
TaskListener listener = getListener();
100+
101+
return EnvironmentExpander.getEffectiveEnvironment(
102+
getEnvironment(listener), t.getContextVariable(EnvVars.class),
103+
t.getContextVariable(EnvironmentExpander.class), null, listener)
104+
.get(propertyName);
92105
} catch (Exception x) {
93106
LOGGER.log(Level.WARNING, null, x);
94107
return null;

src/test/java/org/jenkinsci/plugins/workflow/DynamicEnvironmentExpanderTest.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,30 @@
2424

2525
package org.jenkinsci.plugins.workflow;
2626

27+
import com.google.common.collect.ImmutableSet;
2728
import hudson.EnvVars;
2829
import hudson.model.EnvironmentContributor;
2930
import hudson.model.Run;
3031
import hudson.model.TaskListener;
3132
import java.io.IOException;
3233
import java.util.Collections;
34+
import java.util.HashMap;
35+
import java.util.Map;
3336
import java.util.Set;
37+
import javax.annotation.CheckForNull;
38+
import javax.annotation.Nonnull;
3439
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
40+
import org.jenkinsci.plugins.workflow.graph.FlowNode;
3541
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
3642
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
3743
import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback;
3844
import org.jenkinsci.plugins.workflow.steps.EnvironmentExpander;
3945
import org.jenkinsci.plugins.workflow.steps.Step;
4046
import org.jenkinsci.plugins.workflow.steps.StepContext;
4147
import org.jenkinsci.plugins.workflow.steps.StepDescriptor;
48+
import org.jenkinsci.plugins.workflow.steps.StepEnvironmentContributor;
4249
import org.jenkinsci.plugins.workflow.steps.StepExecution;
50+
import org.jenkinsci.plugins.workflow.steps.SynchronousStepExecution;
4351
import org.jenkinsci.plugins.workflow.test.steps.SemaphoreStep;
4452
import org.junit.ClassRule;
4553
import org.junit.Rule;
@@ -145,4 +153,59 @@ private static class ExpanderImpl extends EnvironmentExpander {
145153
}
146154
}
147155

156+
@Issue("JENKINS-51170")
157+
@Test public void perStepEnvironment() {
158+
story.then(r -> {
159+
WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p");
160+
p.setDefinition(new CpsFlowDefinition("printEnv \"VAR\"; printEnv \"VAR\"", true));
161+
WorkflowRun b = story.j.buildAndAssertSuccess(p);
162+
r.assertLogContains("VAR=1", b);
163+
r.assertLogContains("VAR=2", b);
164+
});
165+
}
166+
167+
@TestExtension("perStepEnvironment") public static class StepEnvAdder extends StepEnvironmentContributor {
168+
private Map<String, Integer> stepNumbers = new HashMap<>();
169+
170+
@Override
171+
public void buildEnvironmentFor(@CheckForNull StepContext stepContext,
172+
@Nonnull EnvVars envs,
173+
@CheckForNull TaskListener listener) throws IOException, InterruptedException {
174+
175+
FlowNode node = stepContext.get(FlowNode.class);
176+
int stepNumber = stepNumbers.computeIfAbsent(node.getId(), (k) -> stepNumbers.size() + 1);
177+
envs.override("VAR", String.valueOf(stepNumber));
178+
}
179+
}
180+
181+
public static class PrintEnvStep extends Step {
182+
private final String var;
183+
@DataBoundConstructor
184+
public PrintEnvStep(String var) {
185+
this.var = var;
186+
}
187+
188+
@Override
189+
public StepExecution start(StepContext context) throws Exception { return new Execution(context, var); }
190+
191+
private static class Execution extends SynchronousStepExecution<Void> {
192+
private final String var;
193+
194+
Execution(StepContext context, String var) { super(context); this.var = var; }
195+
196+
@Override
197+
protected Void run() throws Exception {
198+
StepContext context = getContext();
199+
String message = this.var + "=" + context.get(EnvVars.class).get(var);
200+
context.get(TaskListener.class).getLogger().println(message);
201+
return null;
202+
}
203+
}
204+
205+
@TestExtension("perStepEnvironment") public static class DescriptorImpl extends StepDescriptor {
206+
@Override public String getFunctionName() { return "printEnv"; }
207+
@Override public Set<? extends Class<?>> getRequiredContext() { return ImmutableSet.of(EnvVars.class, TaskListener.class); }
208+
}
209+
}
210+
148211
}

0 commit comments

Comments
 (0)