Skip to content

Commit c1fcac8

Browse files
committed
Merge latest JobProperty logic and configuration
Add tests
1 parent 0916c1c commit c1fcac8

File tree

2 files changed

+356
-23
lines changed

2 files changed

+356
-23
lines changed

src/main/java/org/jenkinsci/plugins/envinject/EnvInjectPrebuildJobProperty.java

Lines changed: 226 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,42 @@
11
package org.jenkinsci.plugins.envinject;
22

3+
import hudson.DescriptorExtensionList;
34
import hudson.Extension;
45
import hudson.FilePath;
56
import hudson.model.BuildListener;
7+
import hudson.model.Environment;
68
import hudson.model.JobProperty;
79
import hudson.model.JobPropertyDescriptor;
810
import hudson.model.AbstractBuild;
911
import hudson.model.Computer;
1012
import hudson.model.Descriptor;
1113
import hudson.model.Job;
1214
import hudson.model.Node;
15+
import hudson.model.Result;
16+
import hudson.model.Run;
1317

1418
import java.io.PrintWriter;
1519
import java.io.StringWriter;
20+
import java.util.ArrayList;
21+
import java.util.Arrays;
22+
import java.util.HashMap;
1623
import java.util.LinkedHashMap;
24+
import java.util.List;
1725
import java.util.Map;
1826

27+
import javax.annotation.CheckForNull;
28+
1929
import jenkins.model.Jenkins;
30+
import net.sf.json.JSON;
31+
import net.sf.json.JSONException;
2032
import net.sf.json.JSONObject;
2133

34+
import org.jenkinsci.lib.envinject.EnvInjectException;
2235
import org.jenkinsci.lib.envinject.EnvInjectLogger;
36+
import org.jenkinsci.plugins.envinject.model.EnvInjectJobPropertyContributor;
37+
import org.jenkinsci.plugins.envinject.model.EnvInjectJobPropertyContributorDescriptor;
38+
import org.jenkinsci.plugins.envinject.service.EnvInjectActionSetter;
39+
import org.jenkinsci.plugins.envinject.service.EnvInjectContributorManagement;
2340
import org.jenkinsci.plugins.envinject.service.EnvInjectEnvVars;
2441
import org.jenkinsci.plugins.envinject.service.EnvInjectVariableGetter;
2542
import org.kohsuke.stapler.StaplerRequest;
@@ -32,6 +49,12 @@ public class EnvInjectPrebuildJobProperty<T extends Job<?, ?>> extends JobProper
3249

3350
private EnvInjectJobPropertyInfo info = new EnvInjectJobPropertyInfo();
3451
private boolean on;
52+
private boolean keepJenkinsSystemVariables;
53+
private boolean keepBuildVariables;
54+
private boolean overrideBuildParameters;
55+
private EnvInjectJobPropertyContributor[] contributors;
56+
57+
private transient EnvInjectJobPropertyContributor[] contributorsComputed;
3558

3659
@SuppressWarnings("unused")
3760
public EnvInjectJobPropertyInfo getInfo() {
@@ -43,6 +66,67 @@ public boolean isOn() {
4366
return on;
4467
}
4568

69+
@SuppressWarnings("unused")
70+
public boolean isKeepJenkinsSystemVariables() {
71+
return keepJenkinsSystemVariables;
72+
}
73+
74+
@SuppressWarnings("unused")
75+
public boolean isKeepBuildVariables() {
76+
return keepBuildVariables;
77+
}
78+
79+
@SuppressWarnings("unused")
80+
public boolean isOverrideBuildParameters() {
81+
return overrideBuildParameters;
82+
}
83+
84+
@SuppressWarnings("unused")
85+
public EnvInjectJobPropertyContributor[] getContributors() {
86+
if (contributorsComputed == null) {
87+
try {
88+
contributorsComputed = computeEnvInjectContributors();
89+
} catch (org.jenkinsci.lib.envinject.EnvInjectException e) {
90+
e.printStackTrace();
91+
}
92+
contributors = contributorsComputed;
93+
}
94+
95+
return Arrays.copyOf(contributors, contributors.length);
96+
}
97+
98+
private EnvInjectJobPropertyContributor[] computeEnvInjectContributors() throws org.jenkinsci.lib.envinject.EnvInjectException {
99+
100+
DescriptorExtensionList<EnvInjectJobPropertyContributor, EnvInjectJobPropertyContributorDescriptor>
101+
descriptors = EnvInjectJobPropertyContributor.all();
102+
103+
// If the config are loaded with success (this step) and the descriptors size doesn't have change
104+
// we considerate, they are the same, therefore we retrieve instances
105+
if (contributors != null && contributors.length == descriptors.size()) {
106+
return contributors;
107+
}
108+
109+
EnvInjectContributorManagement envInjectContributorManagement = new EnvInjectContributorManagement();
110+
EnvInjectJobPropertyContributor[] contributorsInstance = envInjectContributorManagement.getNewContributorsInstance();
111+
112+
//No jobProperty Contributors ==> new configuration
113+
if (contributors == null || contributors.length == 0) {
114+
return contributorsInstance;
115+
}
116+
117+
List<EnvInjectJobPropertyContributor> result = new ArrayList<EnvInjectJobPropertyContributor>();
118+
for (EnvInjectJobPropertyContributor contributor1 : contributorsInstance) {
119+
for (EnvInjectJobPropertyContributor contributor2 : contributors) {
120+
if (contributor1.getDescriptor().getClass() == contributor2.getDescriptor().getClass()) {
121+
result.add(contributor2);
122+
} else {
123+
result.add(contributor1);
124+
}
125+
}
126+
}
127+
return result.toArray(new EnvInjectJobPropertyContributor[result.size()]);
128+
}
129+
46130
public void setInfo(EnvInjectJobPropertyInfo info) {
47131
this.info = info;
48132
}
@@ -51,14 +135,31 @@ public void setOn(boolean on) {
51135
this.on = on;
52136
}
53137

138+
public void setKeepJenkinsSystemVariables(boolean keepJenkinsSystemVariables) {
139+
this.keepJenkinsSystemVariables = keepJenkinsSystemVariables;
140+
}
141+
142+
public void setKeepBuildVariables(boolean keepBuildVariables) {
143+
this.keepBuildVariables = keepBuildVariables;
144+
}
145+
146+
public void setOverrideBuildParameters(boolean overrideBuildParameters) {
147+
this.overrideBuildParameters = overrideBuildParameters;
148+
}
149+
150+
public void setContributors(EnvInjectJobPropertyContributor[] jobPropertyContributors) {
151+
this.contributors = jobPropertyContributors;
152+
}
153+
54154
@Override
55155
public JobProperty<?> reconfigure(StaplerRequest req, JSONObject form) throws Descriptor.FormException {
56156
EnvInjectPrebuildJobProperty property = (EnvInjectPrebuildJobProperty) super.reconfigure(req, form);
57157
if (property != null && property.info != null && !Jenkins.getInstance().hasPermission(Jenkins.RUN_SCRIPTS)) {
58158
// Don't let non RUN_SCRIPT users set arbitrary groovy script
59159
property.info = new EnvInjectJobPropertyInfo(property.info.propertiesFilePath, property.info.propertiesContent,
60-
property.info.getScriptFilePath(), property.info.getScriptContent(),
61-
this.info != null ? this.info.getGroovyScriptContent() : "", property.info.isLoadFilesFromMaster());
160+
property.info.getScriptFilePath(), property.info.getScriptContent(),
161+
this.info != null ? this.info.getGroovyScriptContent() : "",
162+
property.info.isLoadFilesFromMaster());
62163
}
63164
return property;
64165
}
@@ -69,7 +170,7 @@ public static final class DescriptorImpl extends JobPropertyDescriptor {
69170

70171
@Override
71172
public String getDisplayName() {
72-
return "[Environment Inject] -" + Messages.envinject_set_displayName();
173+
return "[Environment Inject (Prebuild)] -" + Messages.envinject_set_displayName();
73174
}
74175

75176
@Override
@@ -88,16 +189,60 @@ public EnvInjectPrebuildJobProperty newInstance(StaplerRequest req, JSONObject f
88189

89190
if (onObject != null) {
90191
EnvInjectPrebuildJobProperty envInjectJobProperty = new EnvInjectPrebuildJobProperty();
91-
EnvInjectJobPropertyInfo info = req.bindParameters(EnvInjectJobPropertyInfo.class,
92-
"envInjectInfoPrebuildJobProperty.");
192+
EnvInjectJobPropertyInfo info = req.bindParameters(EnvInjectJobPropertyInfo.class, "envInjectInfoPrebuildJobProperty.");
93193
envInjectJobProperty.setInfo(info);
94194
envInjectJobProperty.setOn(true);
195+
if (onObject instanceof JSONObject) {
196+
JSONObject onJSONObject = (JSONObject) onObject;
197+
envInjectJobProperty.setKeepJenkinsSystemVariables(onJSONObject.getBoolean("keepJenkinsSystemVariables"));
198+
envInjectJobProperty.setKeepBuildVariables(onJSONObject.getBoolean("keepBuildVariables"));
199+
envInjectJobProperty.setOverrideBuildParameters(onJSONObject.getBoolean("overrideBuildParameters"));
95200

96-
return envInjectJobProperty;
201+
//Process contributions
202+
setContributors(req, envInjectJobProperty, onJSONObject);
203+
204+
return envInjectJobProperty;
205+
}
97206
}
98207

99208
return null;
100209
}
210+
211+
private void setContributors(StaplerRequest req, EnvInjectPrebuildJobProperty envInjectJobProperty, JSONObject onJSONObject) {
212+
if (!onJSONObject.containsKey("contributors")) {
213+
envInjectJobProperty.setContributors(new EnvInjectJobPropertyContributor[0]);
214+
} else {
215+
JSON contribJSON;
216+
try {
217+
contribJSON = onJSONObject.getJSONArray("contributors");
218+
} catch (JSONException jsone) {
219+
contribJSON = onJSONObject.getJSONObject("contributors");
220+
}
221+
List<EnvInjectJobPropertyContributor> contributions = req.bindJSONToList(EnvInjectJobPropertyContributor.class, contribJSON);
222+
EnvInjectJobPropertyContributor[] contributionsArray = contributions.toArray(new EnvInjectJobPropertyContributor[contributions.size()]);
223+
envInjectJobProperty.setContributors(contributionsArray);
224+
}
225+
}
226+
227+
public DescriptorExtensionList<EnvInjectJobPropertyContributor, EnvInjectJobPropertyContributorDescriptor> getEnvInjectContributors() {
228+
return EnvInjectJobPropertyContributor.all();
229+
}
230+
231+
public @CheckForNull EnvInjectJobPropertyContributor[] getContributorsInstance() {
232+
EnvInjectContributorManagement envInjectContributorManagement = new EnvInjectContributorManagement();
233+
try {
234+
return envInjectContributorManagement.getNewContributorsInstance();
235+
} catch (org.jenkinsci.lib.envinject.EnvInjectException e) {
236+
e.printStackTrace();
237+
}
238+
return null;
239+
}
240+
241+
public boolean isEnvInjectContributionActivated() {
242+
EnvInjectContributorManagement envInjectContributorManagement = new EnvInjectContributorManagement();
243+
return envInjectContributorManagement.isEnvInjectContributionActivated();
244+
}
245+
101246
}
102247

103248
/*
@@ -108,6 +253,9 @@ public EnvInjectPrebuildJobProperty newInstance(StaplerRequest req, JSONObject f
108253
*/
109254
@Override
110255
public boolean prebuild(AbstractBuild<?, ?> build, BuildListener listener) {
256+
if(!isOn()) {
257+
return true;
258+
}
111259
EnvInjectLogger logger = new EnvInjectLogger(listener);
112260
FilePath ws = build.getWorkspace();
113261

@@ -130,33 +278,54 @@ public boolean prebuild(AbstractBuild<?, ?> build, BuildListener listener) {
130278
}
131279
}
132280

133-
// Add Jenkins System variables
134-
logger.info("Keeping Jenkins system variables.");
135-
infraEnvVarsMaster.putAll(variableGetter.getJenkinsSystemVariables(true));
136-
infraEnvVarsNode.putAll(variableGetter.getJenkinsSystemVariables(false));
281+
//Add Jenkins System variables
282+
if (isKeepJenkinsSystemVariables()) {
283+
logger.info("Keeping Jenkins system variables.");
284+
infraEnvVarsMaster.putAll(variableGetter.getJenkinsSystemVariables(true));
285+
infraEnvVarsNode.putAll(variableGetter.getJenkinsSystemVariables(false));
286+
}
137287

138-
// Add build variables
139-
logger.info("Keeping Jenkins build variables.");
140-
Map<String, String> buildVariables = variableGetter.getBuildVariables(build, logger);
141-
infraEnvVarsMaster.putAll(buildVariables);
142-
infraEnvVarsNode.putAll(buildVariables);
288+
//Add build variables
289+
if (isKeepBuildVariables()) {
290+
logger.info("Keeping Jenkins build variables.");
291+
Map<String, String> buildVariables = variableGetter.getBuildVariables(build, logger);
292+
infraEnvVarsMaster.putAll(buildVariables);
293+
infraEnvVarsNode.putAll(buildVariables);
294+
}
143295

144296
final FilePath rootPath = getNodeRootPath();
145297
if (rootPath != null) {
146298

147299
final EnvInjectEnvVars envInjectEnvVarsService = new EnvInjectEnvVars(logger);
148300

149-
// Execute script
150-
int resultCode = envInjectEnvVarsService.executeScript(info.isLoadFilesFromMaster(), info.getScriptContent(),
151-
rootPath, info.getScriptFilePath(), infraEnvVarsMaster, infraEnvVarsNode,
152-
rootPath.createLauncher(listener), listener);
301+
//Execute script
302+
int resultCode = envInjectEnvVarsService.executeScript(info.isLoadFilesFromMaster(),
303+
info.getScriptContent(),
304+
rootPath, info.getScriptFilePath(), infraEnvVarsMaster, infraEnvVarsNode, rootPath.createLauncher(listener), listener);
153305
if (resultCode != 0) {
154-
logger.error("Remote script " + rootPath + " returned an error: " + resultCode);
155-
return false;
306+
build.setResult(Result.FAILURE);
307+
throw new Run.RunnerAbortedException();
156308
}
157309

158-
// Evaluate Groovy script
159-
envInjectEnvVarsService.executeAndGetMapGroovyScript(logger, info.getGroovyScriptContent(), infraEnvVarsNode);
310+
//Evaluate Groovy script
311+
Map<String, String> groovyMapEnvVars = envInjectEnvVarsService.executeAndGetMapGroovyScript(logger, info.getGroovyScriptContent(), infraEnvVarsNode);
312+
313+
final Map<String, String> propertiesVariables = envInjectEnvVarsService.getEnvVarsPropertiesJobProperty(rootPath,
314+
logger, info.isLoadFilesFromMaster(),
315+
info.getPropertiesFilePath(), info.getPropertiesContentMap(previousEnvVars),
316+
infraEnvVarsMaster, infraEnvVarsNode);
317+
318+
//Get variables get by contribution
319+
Map<String, String> contributionVariables = getEnvVarsByContribution(build, this, logger, listener);
320+
321+
final Map<String, String> mergedVariables = envInjectEnvVarsService.getMergedVariables(
322+
infraEnvVarsNode,
323+
propertiesVariables,
324+
groovyMapEnvVars,
325+
contributionVariables);
326+
327+
//Add an action to share injected environment variables
328+
new EnvInjectActionSetter(rootPath).addEnvVarsToEnvInjectBuildAction(build, mergedVariables);
160329
}
161330
} catch (Throwable t) {
162331
StringWriter sw = new StringWriter();
@@ -184,4 +353,38 @@ private FilePath getNodeRootPath() {
184353
}
185354
return null;
186355
}
356+
357+
private Map<String, String> getEnvVarsByContribution(AbstractBuild build, EnvInjectPrebuildJobProperty envInjectJobProperty,
358+
EnvInjectLogger logger, BuildListener listener) throws EnvInjectException {
359+
360+
assert envInjectJobProperty != null;
361+
Map<String, String> contributionVariables = new HashMap<String, String>();
362+
363+
EnvInjectJobPropertyContributor[] contributors = envInjectJobProperty.getContributors();
364+
if (contributors != null) {
365+
logger.info("Injecting contributions.");
366+
for (EnvInjectJobPropertyContributor contributor : contributors) {
367+
contributionVariables.putAll(contributor.getEnvVars(build, listener));
368+
}
369+
}
370+
return contributionVariables;
371+
}
372+
373+
374+
@Deprecated
375+
private transient boolean injectGlobalPasswords;
376+
@Deprecated
377+
private transient EnvInjectPasswordEntry[] passwordEntries;
378+
@Deprecated
379+
private transient boolean keepSystemVariables;
380+
381+
@Deprecated
382+
public boolean isInjectGlobalPasswords() {
383+
return injectGlobalPasswords;
384+
}
385+
386+
@Deprecated
387+
public EnvInjectPasswordEntry[] getPasswordEntries() {
388+
return passwordEntries;
389+
}
187390
}

0 commit comments

Comments
 (0)