parent
8058906971
commit
c0d12350b8
|
|
@ -221,7 +221,7 @@
|
|||
<dependency>
|
||||
<groupId>org.jenkins-ci.plugins</groupId>
|
||||
<artifactId>job-dsl</artifactId>
|
||||
<version>1.72</version>
|
||||
<version>1.73</version>
|
||||
<optional>true</optional>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
|
|
|
|||
|
|
@ -38,19 +38,6 @@
|
|||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jenkins-ci.plugins</groupId>
|
||||
<artifactId>job-dsl</artifactId>
|
||||
<version>1.66</version>
|
||||
<optional>true</optional>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy-all</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jenkins-ci.plugins</groupId>
|
||||
<artifactId>role-strategy</artifactId>
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
package io.jenkins.plugins.casc.support.jobdsl;
|
||||
|
||||
import io.jenkins.plugins.casc.Configurable;
|
||||
import io.jenkins.plugins.casc.ConfiguratorException;
|
||||
import io.jenkins.plugins.casc.model.CNode;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
|
||||
*/
|
||||
public abstract class ConfigurableScriptSource extends ScriptSource implements Configurable {
|
||||
|
||||
@Override
|
||||
public void configure(CNode node) throws ConfiguratorException {
|
||||
configure(node.asScalar().getValue());
|
||||
}
|
||||
|
||||
protected abstract void configure(String value);
|
||||
|
||||
@Override
|
||||
public void check(CNode node) throws ConfiguratorException {
|
||||
node.asScalar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CNode describe() throws Exception {
|
||||
return null; // Not relevant here
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package io.jenkins.plugins.casc.support.jobdsl;
|
||||
|
||||
import hudson.Extension;
|
||||
import hudson.model.Descriptor;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.jenkinsci.Symbol;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
|
||||
*/
|
||||
public class FromFileScriptSource extends ConfigurableScriptSource {
|
||||
|
||||
public String path;
|
||||
|
||||
@Override
|
||||
public void configure(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getScript() throws IOException {
|
||||
return FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
@Extension
|
||||
@Symbol("file")
|
||||
public static class DescriptorImpl extends Descriptor<ScriptSource> {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package io.jenkins.plugins.casc.support.jobdsl;
|
||||
|
||||
import hudson.Extension;
|
||||
import hudson.model.Descriptor;
|
||||
import io.jenkins.plugins.casc.Configurable;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.jenkinsci.Symbol;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
|
||||
*/
|
||||
public class FromUrlScriptSource extends ConfigurableScriptSource implements Configurable {
|
||||
|
||||
public String url;
|
||||
|
||||
@Override
|
||||
public void configure(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getScript() throws IOException {
|
||||
return IOUtils.toString(URI.create(url));
|
||||
}
|
||||
|
||||
@Extension
|
||||
@Symbol("url")
|
||||
public static class DescriptorImpl extends Descriptor<ScriptSource> {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
package io.jenkins.plugins.casc.support.jobdsl;
|
||||
|
||||
import hudson.Extension;
|
||||
import hudson.model.Descriptor;
|
||||
import io.jenkins.plugins.casc.Configurable;
|
||||
import java.io.IOException;
|
||||
import org.jenkinsci.Symbol;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
|
||||
*/
|
||||
public class InlineGroovyScriptSource extends ConfigurableScriptSource implements Configurable {
|
||||
|
||||
public String script;
|
||||
|
||||
@Override
|
||||
public void configure(String script) {
|
||||
this.script = script;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getScript() throws IOException {
|
||||
return script;
|
||||
}
|
||||
|
||||
@Extension
|
||||
@Symbol("script")
|
||||
public static class DescriptorImpl extends Descriptor<ScriptSource> {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
package io.jenkins.plugins.casc.support.jobdsl;
|
||||
|
||||
import hudson.ExtensionPoint;
|
||||
import hudson.model.AbstractDescribableImpl;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
|
||||
*/
|
||||
public abstract class ScriptSource extends AbstractDescribableImpl<ScriptSource> implements ExtensionPoint {
|
||||
|
||||
public abstract String getScript() throws IOException;
|
||||
}
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
package io.jenkins.plugins.casc.support.jobdsl;
|
||||
|
||||
import edu.umd.cs.findbugs.annotations.CheckForNull;
|
||||
import edu.umd.cs.findbugs.annotations.NonNull;
|
||||
import hudson.Extension;
|
||||
import io.jenkins.plugins.casc.Attribute;
|
||||
import io.jenkins.plugins.casc.ConfigurationContext;
|
||||
import io.jenkins.plugins.casc.Configurator;
|
||||
import io.jenkins.plugins.casc.ConfiguratorException;
|
||||
import io.jenkins.plugins.casc.RootElementConfigurator;
|
||||
import io.jenkins.plugins.casc.SecretSourceResolver;
|
||||
import io.jenkins.plugins.casc.impl.attributes.MultivaluedAttribute;
|
||||
import io.jenkins.plugins.casc.model.CNode;
|
||||
import io.jenkins.plugins.casc.model.Mapping;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import javaposse.jobdsl.dsl.GeneratedItems;
|
||||
import javaposse.jobdsl.plugin.JenkinsDslScriptLoader;
|
||||
import javaposse.jobdsl.plugin.JenkinsJobManagement;
|
||||
import javaposse.jobdsl.plugin.LookupStrategy;
|
||||
import org.kohsuke.accmod.Restricted;
|
||||
import org.kohsuke.accmod.restrictions.NoExternalUse;
|
||||
|
||||
import static io.vavr.API.Try;
|
||||
import static io.vavr.API.unchecked;
|
||||
|
||||
// TODO: Move outside the plugin?
|
||||
/**
|
||||
* @author <a href="mailto:nicolas.deloof@gmail.com">Nicolas De Loof</a>
|
||||
*/
|
||||
@Extension(optional = true, ordinal = -100) // Ordinal -100 Ensure it is loaded after GlobalJobDslSecurityConfiguration
|
||||
@Restricted(NoExternalUse.class)
|
||||
public class SeedJobConfigurator implements RootElementConfigurator<GeneratedItems[]> {
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getName() {
|
||||
return "jobs";
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Class getTarget() {
|
||||
return GeneratedItems[].class;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Set<Attribute<GeneratedItems[], ?>> describe() {
|
||||
return Collections.singleton(new MultivaluedAttribute("", ScriptSource.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeneratedItems[] getTargetComponent(ConfigurationContext context) {
|
||||
return new GeneratedItems[0]; // Doesn't really make sense
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public GeneratedItems[] configure(CNode config, ConfigurationContext context) throws ConfiguratorException {
|
||||
JenkinsJobManagement management = new JenkinsJobManagement(System.out, System.getenv(), null, null, LookupStrategy.JENKINS_ROOT);
|
||||
Configurator<ScriptSource> configurator = context.lookupOrFail(ScriptSource.class);
|
||||
return config.asSequence().stream()
|
||||
.map(source -> getActualValue(source, context))
|
||||
.map(source -> getScriptFromSource(source, context, configurator))
|
||||
.map(script -> generateFromScript(script, management))
|
||||
.toArray(GeneratedItems[]::new);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeneratedItems[] check(CNode config, ConfigurationContext context) throws ConfiguratorException {
|
||||
// Any way to dry-run a job-dsl script ?
|
||||
return new GeneratedItems[0];
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public List<Configurator<GeneratedItems[]>> getConfigurators(ConfigurationContext context) {
|
||||
return Collections.singletonList(context.lookup(ScriptSource.class));
|
||||
}
|
||||
|
||||
@CheckForNull
|
||||
@Override
|
||||
public CNode describe(GeneratedItems[] instance, ConfigurationContext context) throws Exception {
|
||||
return null;
|
||||
}
|
||||
|
||||
private CNode getActualValue(CNode config, ConfigurationContext context) {
|
||||
return unchecked(() -> config.asMapping().entrySet().stream().findFirst()).apply()
|
||||
.map(entry -> {
|
||||
Mapping mapping = new Mapping();
|
||||
mapping.put(entry.getKey(), revealSourceOrGetValue(entry, context));
|
||||
return (CNode) mapping;
|
||||
}).orElse(config);
|
||||
}
|
||||
|
||||
private String revealSourceOrGetValue(Map.Entry<String, CNode> entry, ConfigurationContext context) {
|
||||
String value = unchecked(() -> entry.getValue().asScalar().getValue()).apply();
|
||||
return SecretSourceResolver.resolve(context, value);
|
||||
}
|
||||
|
||||
private GeneratedItems generateFromScript(String script, JenkinsJobManagement management) {
|
||||
return unchecked(() ->
|
||||
Try(() -> new JenkinsDslScriptLoader(management).runScript(script))
|
||||
.getOrElseThrow(t -> new ConfiguratorException(this, "Failed to execute script with hash " + script.hashCode(), t))).apply();
|
||||
}
|
||||
|
||||
private String getScriptFromSource(CNode source, ConfigurationContext context, Configurator<ScriptSource> configurator) {
|
||||
return unchecked(() ->
|
||||
Try(() -> configurator.configure(source, context))
|
||||
.getOrElseThrow(t -> new ConfiguratorException(this, "Failed to retrieve job-dsl script", t))
|
||||
.getScript()).apply();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue