From 00d77385f1d4daa511eb812dab8868a781e3d025 Mon Sep 17 00:00:00 2001 From: Sean Houghton Date: Tue, 8 Nov 2011 15:48:51 -0800 Subject: [PATCH 1/2] First working version of a factory that generates parameters from a set of files using a wildcard match --- .../FileBuildParameterFactory.java | 140 ++++++++++++++++++ .../FileBuildParameterFactory/config.jelly | 7 + .../help-filePattern.html | 5 + .../parameterizedtrigger/Messages.properties | 3 +- 4 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java create mode 100644 src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/config.jelly create mode 100644 src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/help-filePattern.html diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java b/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java new file mode 100644 index 00000000..6bbec74a --- /dev/null +++ b/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java @@ -0,0 +1,140 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package hudson.plugins.parameterizedtrigger; + +import com.google.common.collect.Lists; +import hudson.Extension; +import hudson.FilePath; +import hudson.Util; +import hudson.model.AbstractBuild; +import hudson.model.TaskListener; +import hudson.remoting.VirtualChannel; +import hudson.util.VariableResolver; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.logging.Level; +import java.util.logging.Logger; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.types.FileSet; +import org.kohsuke.stapler.DataBoundConstructor; + + +/** + * + * @author shoughton + */ +public class FileBuildParameterFactory extends AbstractBuildParameterFactory { + + private final String filePattern; + + @DataBoundConstructor + public FileBuildParameterFactory(String filePattern) { + this.filePattern = filePattern; + } + +// @Override + public List getParameters(AbstractBuild build, TaskListener listener) throws IOException, InterruptedException, AbstractBuildParameters.DontTriggerException { + + try { + FilePath workspace = getWorkspace(build); + + return workspace.act(new FilePath.FileCallable >() { + + public List invoke(File ws, VirtualChannel channel) throws IOException { + final long nowSlave = System.currentTimeMillis(); + FileSet fs = Util.createFileSet(new File(ws, ""), getFilePattern()); + DirectoryScanner ds = fs.getDirectoryScanner(); + String[] files = ds.getIncludedFiles(); + + if (files.length == 0) { + // no test result. Most likely a configuration error or fatal problem + return null; + + } + + ArrayList params = Lists.newArrayList(); + + for(int i=0; i < files.length; ++i) { + BufferedReader reader = null; + + try { + String filename = ds.getBasedir() + System.getProperty("file.separator") + files[i]; + Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.INFO, null, "Reading parameter file " + files[i]); + reader = new BufferedReader(new FileReader(filename)); + String text = null; + StringBuffer contents = new StringBuffer(); + while((text = reader.readLine()) != null) { + contents.append(text).append(System.getProperty("line.separator")); + } + + params.add(new PredefinedBuildParameters(contents.toString())); + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (reader != null) { + reader.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return params; + } + + }); + + } catch (Exception ex) { + Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.SEVERE, null, ex); + } + + return null; + } + + private FilePath getWorkspace(AbstractBuild build) { + FilePath workspace = build.getWorkspace(); + if (workspace == null) { + workspace = build.getProject().getSomeWorkspace(); + } + return workspace; + } + + //private PredefinedBuildParameters getParameterBlock() { + // String stringWithCount = Util.replaceMacro(paramExpr, ImmutableMap.of("CHANGELIST", changelist.toString())); + // return new PredefinedBuildParameters(stringWithCount); + //} + + @Extension + public static class DescriptorImpl extends AbstractBuildParameterFactoryDescriptor { + @Override + public String getDisplayName() { + return Messages.FileBuildParameterFactory_FileBuildParameterFactory(); + } + } + + private static final VariableResolver EMPTY_STRING_VARIABLE_RESOLVER = new VariableResolver() { + + @Override + public String resolve(String name) { + return ""; + } + }; + + public String getFilePattern() { + return filePattern; + } + +} diff --git a/src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/config.jelly b/src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/config.jelly new file mode 100644 index 00000000..6891aca0 --- /dev/null +++ b/src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/config.jelly @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/help-filePattern.html b/src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/help-filePattern.html new file mode 100644 index 00000000..6d6bce4e --- /dev/null +++ b/src/main/resources/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory/help-filePattern.html @@ -0,0 +1,5 @@ +
+ File wildcard pattern for for finding parameter list files. For example + 'Param*.txt' would generate a new configuration for each file that matches the + pattern and use the properties defined in each file. +
\ No newline at end of file diff --git a/src/main/resources/hudson/plugins/parameterizedtrigger/Messages.properties b/src/main/resources/hudson/plugins/parameterizedtrigger/Messages.properties index e4f917e7..e756fba3 100644 --- a/src/main/resources/hudson/plugins/parameterizedtrigger/Messages.properties +++ b/src/main/resources/hudson/plugins/parameterizedtrigger/Messages.properties @@ -1,2 +1,3 @@ CounterBuildParameterFactory.CounterBuildParameterFactory=Counter Parameter Factory -CounterBuildParameterFactory.CountingWillNotTerminate=Counting with step size 0 will not terminate! \ No newline at end of file +CounterBuildParameterFactory.CountingWillNotTerminate=Counting with step size 0 will not terminate! +FileBuildParameterFactory.FileBuildParameterFactory=File Parameter Factory \ No newline at end of file From 96091e99d89dcef664a849632359e447bc52e5eb Mon Sep 17 00:00:00 2001 From: Sean Houghton Date: Thu, 17 Nov 2011 21:33:51 -0800 Subject: [PATCH 2/2] Fixed problems with remote building. It's now using the simple FilePath methods to deal with workspace RPC issues. --- .../FileBuildParameterFactory.java | 133 +++++++++++------- 1 file changed, 85 insertions(+), 48 deletions(-) diff --git a/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java b/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java index 6bbec74a..7f82ef11 100644 --- a/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java +++ b/src/main/java/hudson/plugins/parameterizedtrigger/FileBuildParameterFactory.java @@ -7,19 +7,24 @@ import com.google.common.collect.Lists; import hudson.Extension; import hudson.FilePath; +import hudson.FilePath.FileCallable; import hudson.Util; import hudson.model.AbstractBuild; import hudson.model.TaskListener; import hudson.remoting.VirtualChannel; +import hudson.util.LogTaskListener; +import hudson.util.StreamTaskListener; import hudson.util.VariableResolver; import java.io.BufferedReader; import java.io.File; +import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.logging.Level; import java.util.logging.Logger; import java.io.IOException; +import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import org.apache.tools.ant.DirectoryScanner; @@ -39,69 +44,101 @@ public class FileBuildParameterFactory extends AbstractBuildParameterFactory { public FileBuildParameterFactory(String filePattern) { this.filePattern = filePattern; } - -// @Override - public List getParameters(AbstractBuild build, TaskListener listener) throws IOException, InterruptedException, AbstractBuildParameters.DontTriggerException { + + public class FileParameterCollector implements FilePath.FileCallable< List > { - try { - FilePath workspace = getWorkspace(build); + //protected String filePattern; + + + public FileParameterCollector(String filePattern) { + //this.filePattern = filePattern; + } + + //private void writeObject(java.io.ObjectOutputStream out) throws IOException { + //String foo = "Sean"; + //.defaultWriteObject(); + //out.writeObject(filePattern); + //} + + // private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + // in.defaultReadObject(); + //filePattern = (String) in.readObject(); + //} + + public List invoke(File ws, VirtualChannel channel) throws IOException { + + ArrayList params = Lists.newArrayList(); + return params; + /* + + final long nowSlave = System.currentTimeMillis(); + FileSet fs = Util.createFileSet(new File(ws, ""), filePattern); + DirectoryScanner ds = fs.getDirectoryScanner(); + String[] files = ds.getIncludedFiles(); + - return workspace.act(new FilePath.FileCallable >() { - public List invoke(File ws, VirtualChannel channel) throws IOException { - final long nowSlave = System.currentTimeMillis(); - FileSet fs = Util.createFileSet(new File(ws, ""), getFilePattern()); - DirectoryScanner ds = fs.getDirectoryScanner(); - String[] files = ds.getIncludedFiles(); + if (files.length == 0) { + + // no test result. Most likely a configuration error or fatal problem + Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.WARNING, null, "No parameter files found that match the pattern."); + return params; + } - if (files.length == 0) { - // no test result. Most likely a configuration error or fatal problem - return null; + for(int i=0; i < files.length; ++i) { + BufferedReader reader = null; + try { + String filename = ds.getBasedir() + System.getProperty("file.separator") + files[i]; + Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.INFO, null, "Reading parameter file " + filename); + reader = new BufferedReader(new FileReader(filename)); + String text = null; + StringBuffer contents = new StringBuffer(); + while((text = reader.readLine()) != null) { + contents.append(text).append(System.getProperty("line.separator")); } - - ArrayList params = Lists.newArrayList(); - - for(int i=0; i < files.length; ++i) { - BufferedReader reader = null; - - try { - String filename = ds.getBasedir() + System.getProperty("file.separator") + files[i]; - Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.INFO, null, "Reading parameter file " + files[i]); - reader = new BufferedReader(new FileReader(filename)); - String text = null; - StringBuffer contents = new StringBuffer(); - while((text = reader.readLine()) != null) { - contents.append(text).append(System.getProperty("line.separator")); - } - - params.add(new PredefinedBuildParameters(contents.toString())); - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (reader != null) { - reader.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } + + params.add(contents.toString()); + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (reader != null) { + reader.close(); } + } catch (IOException e) { + e.printStackTrace(); } - - return params; } + } - }); + return params;*/ + } + + } + +// @Override + public List getParameters(AbstractBuild build, TaskListener listener) throws IOException, InterruptedException, AbstractBuildParameters.DontTriggerException { + + List result = Lists.newArrayList(); + + try { + FilePath workspace = getWorkspace(build); + FilePath[] files = workspace.list(getFilePattern()); + for(FilePath f: files) { + String parametersStr = f.readToString(); + Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.INFO, null, "Triggering build with " + f.getBaseName()); + result.add(new PredefinedBuildParameters(parametersStr)); + } } catch (Exception ex) { Logger.getLogger(FileBuildParameterFactory.class.getName()).log(Level.SEVERE, null, ex); } - return null; + return result; } private FilePath getWorkspace(AbstractBuild build) {