From ea2f0c8e5927407ac1146896f3d830d156b9e990 Mon Sep 17 00:00:00 2001 From: timwu Date: Wed, 27 Jul 2016 10:24:03 +0200 Subject: [PATCH 1/2] Support user defined classpath --- .../com/cloudbees/plugins/flow/FlowDSL.groovy | 31 ++++++++++++++++--- .../com/cloudbees/plugins/flow/BuildFlow.java | 11 ++++++- .../cloudbees/plugins/flow/FlowListener.java | 3 +- .../com/cloudbees/plugins/flow/FlowRun.java | 20 +++++++----- .../flow/BuildFlow/configure-entries.jelly | 5 +++ .../flow/BuildFlow/help-classpath.jelly | 30 ++++++++++++++++++ 6 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/com/cloudbees/plugins/flow/BuildFlow/help-classpath.jelly diff --git a/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy b/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy index 5f4e4a6..02533a3 100644 --- a/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy +++ b/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy @@ -33,8 +33,6 @@ import hudson.slaves.EnvironmentVariablesNodeProperty import hudson.slaves.NodeProperty import hudson.util.spring.ClosureScript import jenkins.model.Jenkins - -import org.acegisecurity.context.SecurityContextHolder import org.codehaus.groovy.control.CompilerConfiguration import org.codehaus.groovy.control.customizers.ImportCustomizer @@ -46,7 +44,7 @@ import static hudson.model.Result.SUCCESS public class FlowDSL { - def void executeFlowScript(FlowRun flowRun, String dsl, BuildListener listener) { + def void executeFlowScript(FlowRun flowRun, String dsl, String classpath, BuildListener listener) { // Retrieve the upstream build if the flow was triggered by another job Run upstream = null; flowRun.causes.each{ cause -> @@ -77,7 +75,20 @@ public class FlowDSL { ic.addStaticStars(Result.class.name) cc.addCompilationCustomizers(ic) - ClosureScript dslScript = (ClosureScript)new GroovyShell(Jenkins.instance.pluginManager.uberClassLoader,new Binding(),cc).parse(dsl) + def classpathList = [] + + if (classpath?.trim()){ + classpath.eachLine { + def pathURL = pathToURL(it) + if (pathURL != null){ + classpathList.add(pathURL) + } + } + } + + def uberLoader = Jenkins.instance.pluginManager.uberClassLoader + def extendedLoader = new URLClassLoader(classpathList as URL[], uberLoader); + ClosureScript dslScript = (ClosureScript)new GroovyShell(extendedLoader,new Binding(),cc).parse(dsl) dslScript.setDelegate(flow); try { @@ -99,6 +110,18 @@ public class FlowDSL { } } + def pathToURL(path){ + try { + return new URL(path); + } catch (MalformedURLException x) { + try{ + return new File(path).toURI().toURL(); + }catch (MalformedURLException x1){ + return null + } + } + } + private void killRunningJobs(FlowRun flowRun, BuildListener listener) { flowRun.state.result = Executor.currentExecutor().abortResult(); Executor.currentExecutor().recordCauseOfInterruption(flowRun, listener); diff --git a/src/main/java/com/cloudbees/plugins/flow/BuildFlow.java b/src/main/java/com/cloudbees/plugins/flow/BuildFlow.java index 8b0de28..8fa4d78 100644 --- a/src/main/java/com/cloudbees/plugins/flow/BuildFlow.java +++ b/src/main/java/com/cloudbees/plugins/flow/BuildFlow.java @@ -66,7 +66,7 @@ public class BuildFlow extends Project implements TopLevelIt private String dsl; private String dslFile; - + private String classpath; private boolean buildNeedsWorkspace; @@ -82,6 +82,14 @@ public void setDsl(String dsl) { this.dsl = dsl; } + public String getClasspath() { + return classpath; + } + + public void setClasspath(String classpath) { + this.classpath = classpath; + } + public boolean getBuildNeedsWorkspace() { return buildNeedsWorkspace; } @@ -105,6 +113,7 @@ protected void submit(StaplerRequest req, StaplerResponse rsp) throws IOExceptio this.buildNeedsWorkspace = json.containsKey("buildNeedsWorkspace"); if (Jenkins.getInstance().hasPermission(Jenkins.RUN_SCRIPTS)) { this.dsl = json.getString("dsl"); + this.classpath = json.getString("classpath"); if (this.buildNeedsWorkspace) { JSONObject o = json.getJSONObject("buildNeedsWorkspace"); this.dslFile = Util.fixEmptyAndTrim(o.getString("dslFile")); diff --git a/src/main/java/com/cloudbees/plugins/flow/FlowListener.java b/src/main/java/com/cloudbees/plugins/flow/FlowListener.java index 81f6e36..3cee263 100644 --- a/src/main/java/com/cloudbees/plugins/flow/FlowListener.java +++ b/src/main/java/com/cloudbees/plugins/flow/FlowListener.java @@ -41,8 +41,7 @@ public synchronized void onStarted(Run startedBuild, List causes = startedBuild.getCauses(); for (Cause cause : causes) { if (cause instanceof FlowCause) { - ((FlowCause) cause).getAssociatedJob().buildStarted( - startedBuild); + ((FlowCause) cause).getAssociatedJob().buildStarted(startedBuild); } } } diff --git a/src/main/java/com/cloudbees/plugins/flow/FlowRun.java b/src/main/java/com/cloudbees/plugins/flow/FlowRun.java index 9848036..6abfa27 100644 --- a/src/main/java/com/cloudbees/plugins/flow/FlowRun.java +++ b/src/main/java/com/cloudbees/plugins/flow/FlowRun.java @@ -60,6 +60,7 @@ public class FlowRun extends Build { private String dsl; private String dslFile; + private String classpath; private boolean buildNeedsWorkspace; @@ -90,6 +91,7 @@ private void setup(BuildFlow job) { } this.dsl = job.getDsl(); this.dslFile = job.getDslFile(); + this.classpath = job.getClasspath(); this.buildNeedsWorkspace = job.getBuildNeedsWorkspace(); startJob.buildStarted(this); jobsGraph.addVertex(startJob); @@ -150,9 +152,9 @@ public synchronized void addBuild(JobInvocation job) throws ExecutionException, @Override public void run() { if (buildNeedsWorkspace) { - execute(new BuildWithWorkspaceRunnerImpl(dsl, dslFile)); + execute(new BuildWithWorkspaceRunnerImpl(dsl, dslFile, classpath)); } else { - execute(new FlyweightTaskRunnerImpl(dsl)); + execute(new FlyweightTaskRunnerImpl(dsl,classpath)); } } @@ -160,10 +162,12 @@ protected class BuildWithWorkspaceRunnerImpl extends BuildExecution { private final String dsl; private final String dslFile; + private final String classpath; - public BuildWithWorkspaceRunnerImpl(String dsl, String dslFile) { + public BuildWithWorkspaceRunnerImpl(String dsl, String dslFile, String classpath) { this.dsl = dsl; this.dslFile = dslFile; + this.classpath = classpath; } protected Result doRun(BuildListener listener) throws Exception { @@ -175,9 +179,9 @@ protected Result doRun(BuildListener listener) throws Exception { if (dslFile != null) { listener.getLogger().printf("[build-flow] reading DSL from file '%s'\n", dslFile); String fileContent = getWorkspace().child(dslFile).readToString(); - new FlowDSL().executeFlowScript(FlowRun.this, fileContent, listener); + new FlowDSL().executeFlowScript(FlowRun.this, fileContent, classpath, listener); } else { - new FlowDSL().executeFlowScript(FlowRun.this, dsl, listener); + new FlowDSL().executeFlowScript(FlowRun.this, dsl, classpath, listener); } } finally { boolean failed=false; @@ -208,15 +212,17 @@ public void cleanUp(BuildListener listener) throws Exception { protected class FlyweightTaskRunnerImpl extends RunExecution { private final String dsl; + private final String classpath; - public FlyweightTaskRunnerImpl(String dsl) { + public FlyweightTaskRunnerImpl(String dsl, String classpath) { this.dsl = dsl; + this.classpath = classpath; } @Override public Result run(BuildListener listener) throws Exception, RunnerAbortedException { setResult(SUCCESS); - new FlowDSL().executeFlowScript(FlowRun.this, dsl, listener); + new FlowDSL().executeFlowScript(FlowRun.this, dsl, classpath, listener); return getState().getResult(); } diff --git a/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/configure-entries.jelly b/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/configure-entries.jelly index 53d102d..c88e60e 100644 --- a/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/configure-entries.jelly +++ b/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/configure-entries.jelly @@ -46,6 +46,11 @@ + + + + + diff --git a/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/help-classpath.jelly b/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/help-classpath.jelly new file mode 100644 index 0000000..11909a8 --- /dev/null +++ b/src/main/resources/com/cloudbees/plugins/flow/BuildFlow/help-classpath.jelly @@ -0,0 +1,30 @@ + + + +
+ Specify additional classpath here. Each line is one class path item.Both URL and path are supported +
+
\ No newline at end of file From 7a6d2060290eb0b6eb380880c10d85e86df99a26 Mon Sep 17 00:00:00 2001 From: timwu Date: Wed, 27 Jul 2016 13:46:51 +0200 Subject: [PATCH 2/2] Fix unit test error --- src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy b/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy index 02533a3..8e8b27a 100644 --- a/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy +++ b/src/main/groovy/com/cloudbees/plugins/flow/FlowDSL.groovy @@ -33,6 +33,8 @@ import hudson.slaves.EnvironmentVariablesNodeProperty import hudson.slaves.NodeProperty import hudson.util.spring.ClosureScript import jenkins.model.Jenkins + +import org.acegisecurity.context.SecurityContextHolder import org.codehaus.groovy.control.CompilerConfiguration import org.codehaus.groovy.control.customizers.ImportCustomizer