Skip to content

Commit 1021197

Browse files
authored
Merge pull request jenkinsci#49 from sheepdreamofandroids/result-var
Result variable for DSL
2 parents 14b1aba + 81591b9 commit 1021197

File tree

5 files changed

+54
-13
lines changed

5 files changed

+54
-13
lines changed

src/main/java/org/jenkins/plugins/lockableresources/LockStep.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public class LockStep extends AbstractStepImpl implements Serializable {
2626

2727
public int quantity = 0;
2828

29+
/** name of environment variable to store locked resources in */
30+
@CheckForNull
31+
public String variable = null;
32+
2933
public boolean inversePrecedence = false;
3034

3135
// it should be LockStep() - without params. But keeping this for backward compatibility
@@ -49,6 +53,13 @@ public void setLabel(String label) {
4953
}
5054
}
5155

56+
@DataBoundSetter
57+
public void setVariable(String variable) {
58+
if (variable != null && !variable.isEmpty()) {
59+
this.variable = variable;
60+
}
61+
}
62+
5263
@DataBoundSetter
5364
public void setQuantity(int quantity) {
5465
this.quantity = quantity;

src/main/java/org/jenkins/plugins/lockableresources/LockStepExecution.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.jenkins.plugins.lockableresources;
22

3+
import java.io.IOException;
34
import java.util.ArrayList;
45
import java.util.List;
56
import java.util.logging.Level;
@@ -8,17 +9,23 @@
89
import org.jenkins.plugins.lockableresources.queue.LockableResourcesStruct;
910
import org.jenkinsci.plugins.workflow.steps.AbstractStepExecutionImpl;
1011
import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback;
12+
import org.jenkinsci.plugins.workflow.steps.BodyInvoker;
13+
import org.jenkinsci.plugins.workflow.steps.EnvironmentExpander;
1114
import org.jenkinsci.plugins.workflow.steps.StepContext;
1215
import org.jenkinsci.plugins.workflow.steps.StepContextParameter;
1316

17+
import com.google.common.base.Joiner;
1418
import com.google.inject.Inject;
1519

20+
import hudson.EnvVars;
1621
import hudson.model.Run;
1722
import hudson.model.TaskListener;
1823

1924
public class LockStepExecution extends AbstractStepExecutionImpl {
2025

21-
@Inject(optional = true)
26+
private static final Joiner COMMA_JOINER = Joiner.on(',');
27+
28+
@Inject(optional = true)
2229
private LockStep step;
2330

2431
@StepContextParameter
@@ -44,14 +51,14 @@ public boolean start() throws Exception {
4451
LockableResourcesStruct resourceHolder = new LockableResourcesStruct(resources, step.label, step.quantity);
4552
// determine if there are enough resources available to proceed
4653
List<LockableResource> available = LockableResourcesManager.get().checkResourcesAvailability(resourceHolder, listener.getLogger(), null);
47-
if (available == null || !LockableResourcesManager.get().lock(available, run, getContext(), step.toString(), step.inversePrecedence)) {
54+
if (available == null || !LockableResourcesManager.get().lock(available, run, getContext(), step.toString(), step.variable, step.inversePrecedence)) {
4855
listener.getLogger().println("[" + step + "] is locked, waiting...");
4956
LockableResourcesManager.get().queueContext(getContext(), resourceHolder, step.toString());
5057
} // proceed is called inside lock if execution is possible
5158
return false;
5259
}
5360

54-
public static void proceed(List<String> resourcenames, StepContext context, String resourceDescription, boolean inversePrecedence) {
61+
public static void proceed(final List<String> resourcenames, StepContext context, String resourceDescription, final String variable, boolean inversePrecedence) {
5562
Run<?, ?> r = null;
5663
try {
5764
r = context.get(Run.class);
@@ -62,10 +69,26 @@ public static void proceed(List<String> resourcenames, StepContext context, Stri
6269
}
6370

6471
LOGGER.finest("Lock acquired on [" + resourceDescription + "] by " + r.getExternalizableId());
65-
context.newBodyInvoker().
66-
withCallback(new Callback(resourcenames, resourceDescription, inversePrecedence)).
67-
withDisplayName(null).
68-
start();
72+
try {
73+
BodyInvoker bodyInvoker = context.newBodyInvoker().
74+
withCallback(new Callback(resourcenames, resourceDescription, inversePrecedence)).
75+
withDisplayName(null);
76+
if(variable != null && variable.length()>0)
77+
// set the variable for the duration of the block
78+
bodyInvoker.withContext(EnvironmentExpander.merge(context.get(EnvironmentExpander.class), new EnvironmentExpander() {
79+
@Override
80+
public void expand(EnvVars env) throws IOException, InterruptedException {
81+
final String resources = COMMA_JOINER.join(resourcenames);
82+
LOGGER.finest("Setting [" + variable + "] to [" + resources
83+
+ "] for the duration of the block");
84+
85+
env.override(variable, resources);
86+
}
87+
}));
88+
bodyInvoker.start();
89+
} catch (IOException | InterruptedException e) {
90+
throw new RuntimeException(e);
91+
}
6992
}
7093

7194
private static final class Callback extends BodyExecutionCallback.TailCall {

src/main/java/org/jenkins/plugins/lockableresources/LockableResourcesManager.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,15 @@ private boolean checkCurrentResourcesStatus(List<LockableResource> selected,
277277
}
278278

279279
public synchronized boolean lock(List<LockableResource> resources, Run<?, ?> build, @Nullable StepContext context) {
280-
return lock(resources, build, context, null, false);
280+
return lock(resources, build, context, null, null, false);
281281
}
282282

283283
/**
284284
* Try to lock the resource and return true if locked.
285285
*/
286286
public synchronized boolean lock(List<LockableResource> resources,
287-
Run<?, ?> build, @Nullable StepContext context, @Nullable String logmessage, boolean inversePrecedence) {
287+
Run<?, ?> build, @Nullable StepContext context, @Nullable String logmessage,
288+
final String variable, boolean inversePrecedence) {
288289
boolean needToWait = false;
289290

290291
for (LockableResource r : resources) {
@@ -305,7 +306,7 @@ public synchronized boolean lock(List<LockableResource> resources,
305306
for (LockableResource resource : resources) {
306307
resourceNames.add(resource.getName());
307308
}
308-
LockStepExecution.proceed(resourceNames, context, logmessage, inversePrecedence);
309+
LockStepExecution.proceed(resourceNames, context, logmessage, variable, inversePrecedence);
309310
}
310311
}
311312
save();
@@ -419,7 +420,7 @@ public synchronized void unlockNames(@Nullable List<String> resourceNamesToUnLoc
419420
freeResources(freeResources, build);
420421

421422
// continue with next context
422-
LockStepExecution.proceed(resourceNamesToLock, nextContext.getContext(), nextContext.getResourceDescription(), inversePrecedence);
423+
LockStepExecution.proceed(resourceNamesToLock, nextContext.getContext(), nextContext.getResourceDescription(), nextContext.getResources().requiredVar, inversePrecedence);
423424
}
424425
save();
425426
}

src/main/java/org/jenkins/plugins/lockableresources/queue/LockableResourcesStruct.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ public LockableResourcesStruct(@Nullable List<String> resources) {
7171
this(resources, null, 0);
7272
}
7373

74+
public LockableResourcesStruct(@Nullable List<String> resources, @Nullable String label, int quantity, String variable) {
75+
this(resources, label, quantity);
76+
requiredVar = variable;
77+
}
78+
7479
public LockableResourcesStruct(@Nullable List<String> resources, @Nullable String label, int quantity) {
7580
required = new ArrayList<LockableResource>();
7681
if (resources != null) {

src/test/java/org/jenkins/plugins/lockableresources/LockStepTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,16 @@ public void evaluate() throws Throwable {
6969
LockableResourcesManager.get().createResourceWithLabel("resource1", "label1");
7070
WorkflowJob p = story.j.jenkins.createProject(WorkflowJob.class, "p");
7171
p.setDefinition(new CpsFlowDefinition(
72-
"lock(label: 'label1') {\n" +
73-
" echo 'Resource locked'\n" +
72+
"lock(label: 'label1', variable: 'var') {\n" +
73+
" echo \"Resource locked: ${env.var}\"\n" +
7474
"}\n" +
7575
"echo 'Finish'"
7676
));
7777
WorkflowRun b1 = p.scheduleBuild2(0).waitForStart();
7878
story.j.waitForCompletion(b1);
7979
story.j.assertBuildStatus(Result.SUCCESS, b1);
8080
story.j.assertLogContains("Lock released on resource [Label: label1]", b1);
81+
story.j.assertLogContains("Resource locked: resource1", b1);
8182
}
8283
});
8384
}

0 commit comments

Comments
 (0)