11package io .jenkins .plugins .cascgroovy ;
22
3- import jenkins .model .Jenkins ;
4- import edu .umd .cs .findbugs .annotations .SuppressFBWarnings ;
5- import hudson .EnvVars ;
3+ import groovy .lang .Binding ;
4+ import groovy .lang .GroovyShell ;
65import hudson .Extension ;
7- import io .jenkins .plugins .casc .Attribute ;
8- import io .jenkins .plugins .casc .ConfigurationContext ;
9- import io .jenkins .plugins .casc .ConfiguratorException ;
10- import io .jenkins .plugins .casc .Configurator ;
11- import io .jenkins .plugins .casc .RootElementConfigurator ;
6+ import io .jenkins .plugins .casc .*;
127import io .jenkins .plugins .casc .impl .attributes .MultivaluedAttribute ;
138import io .jenkins .plugins .casc .model .CNode ;
14- import io .jenkins .plugins .casc .model .Sequence ;
9+ import io .jenkins .plugins .casc .model .Mapping ;
10+ import jenkins .model .Jenkins ;
1511import org .kohsuke .accmod .Restricted ;
1612import org .kohsuke .accmod .restrictions .NoExternalUse ;
17- import groovy .lang .GroovyShell ;
18- import groovy .lang .Binding ;
1913
20- import java .io .PrintWriter ;
2114import javax .annotation .CheckForNull ;
2215import javax .annotation .Nonnull ;
23- import java .io .IOException ;
24- import java .util .ArrayList ;
25- import java .util .Collections ;
26- import java .util .List ;
27- import java .util .Set ;
16+ import java .util .*;
17+
18+ import static io .vavr .API .Try ;
19+ import static io .vavr .API .unchecked ;
2820
2921
3022/**
3123 * @author <a href="mailto:tomasz.szandala@gmail.com">Tomasz Szandala</a>
3224 */
33- @ Extension (optional = true )
25+ @ Extension (optional = true , ordinal = - 50 )
3426@ Restricted (NoExternalUse .class )
3527public class GroovyScriptCaller implements RootElementConfigurator <Boolean []> {
3628
@@ -56,41 +48,36 @@ public Boolean[] getTargetComponent(ConfigurationContext context) {
5648
5749 @ Override
5850 public Boolean [] configure (CNode config , ConfigurationContext context ) throws ConfiguratorException {
59- //JenkinsJobManagement mng = new JenkinsJobManagement(System.out, new EnvVars(), null, null, LookupStrategy.JENKINS_ROOT);
60- final Sequence sources = config .asSequence ();
61- final Configurator <GroovyScriptSource > con = context .lookup (GroovyScriptSource .class );
62- List <Boolean > generated = new ArrayList <>();
63- for (CNode source : sources ) {
64- final String script ;
65- try {
66- script = con .configure (source , context ).getScript ();
67- } catch (IOException e ) {
68- throw new ConfiguratorException (this , "Failed to retrieve Groovy script" , e );
69- }
70- try {
71- //Binding binding = new Binding();
72- //binding.setVariable("foo", new Integer(2));
73- //GroovyShell shell = new GroovyShell();
74- //shell.evaluate(script);
75-
76- Binding binding = new Binding ();
77- //binding.setProperty("out",new PrintWriter(stdout,true));
78- //binding.setProperty("stdin",stdin);
79- //binding.setProperty("stdout",stdout);
80- //binding.setProperty("stderr",stderr);
81-
82- GroovyShell groovy = new GroovyShell (Jenkins .getActiveInstance ().getPluginManager ().uberClassLoader , binding );
83- groovy .run (script , "Configuration-as-Code-Groovy" , new ArrayList ());
84-
85- generated .add (true );
86-
87- } catch (Exception ex ) {
88- throw new ConfiguratorException (this , "Failed to execute script with hash " + script .hashCode (), ex );
89- }
90- }
91- return generated .toArray (new Boolean [generated .size ()]);
51+ final Configurator <GroovyScriptSource > c = context .lookup (GroovyScriptSource .class );
52+ return config .asSequence ().stream ()
53+ .map (source -> getActualValue (source , context ))
54+ .map (source -> Try (() -> c .configure (source , context ).getScript ())
55+ .onSuccess (GroovyScriptCaller .this ::runGroovyShell )
56+ .isSuccess ())
57+ .toArray (Boolean []::new );
9258 }
9359
60+ private CNode getActualValue (CNode source , ConfigurationContext context ) {
61+ return unchecked (() -> source .asMapping ().entrySet ().stream ().findFirst ()).apply ()
62+ .map (entry -> resolveSourceOrGetValue (entry , context ))
63+ .orElse (source );
64+ }
65+
66+ private CNode resolveSourceOrGetValue (Map .Entry <String , CNode > entry , ConfigurationContext context ) {
67+ final Mapping m = new Mapping ();
68+ m .put (
69+ entry .getKey (),
70+ SecretSourceResolver .resolve (context , unchecked (() -> entry .getValue ().asScalar ().getValue ()).apply ())
71+ );
72+ return m ;
73+ }
74+
75+ private void runGroovyShell (String script ) {
76+ final GroovyShell s = new GroovyShell (Jenkins .getActiveInstance ().getPluginManager ().uberClassLoader , new Binding ());
77+ unchecked (() -> s .run (script , "Configuration-as-Code-Groovy" , new ArrayList ()));
78+ }
79+
80+
9481 @ Override
9582 public Boolean [] check (CNode config , ConfigurationContext context ) throws ConfiguratorException {
9683 // Any way to dry-run a Groovy script ?
@@ -99,7 +86,7 @@ public Boolean[] check(CNode config, ConfigurationContext context) throws Config
9986
10087 @ Nonnull
10188 @ Override
102- public List <Configurator > getConfigurators (ConfigurationContext context ) {
89+ public List <Configurator < Boolean []> > getConfigurators (ConfigurationContext context ) {
10390 return Collections .singletonList (context .lookup (GroovyScriptSource .class ));
10491 }
10592
@@ -108,4 +95,5 @@ public List<Configurator> getConfigurators(ConfigurationContext context) {
10895 public CNode describe (Boolean [] instance , ConfigurationContext context ) throws Exception {
10996 return null ;
11097 }
98+
11199}
0 commit comments