11package org .jenkinsci .plugins .envinject ;
22
3+ import hudson .DescriptorExtensionList ;
34import hudson .Extension ;
45import hudson .FilePath ;
56import hudson .model .BuildListener ;
7+ import hudson .model .Environment ;
68import hudson .model .JobProperty ;
79import hudson .model .JobPropertyDescriptor ;
810import hudson .model .AbstractBuild ;
911import hudson .model .Computer ;
1012import hudson .model .Descriptor ;
1113import hudson .model .Job ;
1214import hudson .model .Node ;
15+ import hudson .model .Result ;
16+ import hudson .model .Run ;
1317
1418import java .io .PrintWriter ;
1519import java .io .StringWriter ;
20+ import java .util .ArrayList ;
21+ import java .util .Arrays ;
22+ import java .util .HashMap ;
1623import java .util .LinkedHashMap ;
24+ import java .util .List ;
1725import java .util .Map ;
1826
27+ import javax .annotation .CheckForNull ;
28+
1929import jenkins .model .Jenkins ;
30+ import net .sf .json .JSON ;
31+ import net .sf .json .JSONException ;
2032import net .sf .json .JSONObject ;
2133
34+ import org .jenkinsci .lib .envinject .EnvInjectException ;
2235import 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 ;
2340import org .jenkinsci .plugins .envinject .service .EnvInjectEnvVars ;
2441import org .jenkinsci .plugins .envinject .service .EnvInjectVariableGetter ;
2542import 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