Skip to content

Commit 8dc7868

Browse files
committed
Add secret variables expansion from CNode value
1 parent cd0564a commit 8dc7868

File tree

2 files changed

+41
-53
lines changed

2 files changed

+41
-53
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<dependency>
5959
<groupId>io.jenkins</groupId>
6060
<artifactId>configuration-as-code</artifactId>
61-
<version>1.0</version>
61+
<version>1.32</version>
6262
</dependency>
6363
</dependencies>
6464
</project>
Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,28 @@
11
package 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;
65
import 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.*;
127
import io.jenkins.plugins.casc.impl.attributes.MultivaluedAttribute;
138
import 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;
1511
import org.kohsuke.accmod.Restricted;
1612
import org.kohsuke.accmod.restrictions.NoExternalUse;
17-
import groovy.lang.GroovyShell;
18-
import groovy.lang.Binding;
1913

20-
import java.io.PrintWriter;
2114
import javax.annotation.CheckForNull;
2215
import 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)
3527
public 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

Comments
 (0)