package hudson.plugins.m2extrasteps; import hudson.EnvVars; import hudson.Extension; import hudson.Launcher; import hudson.maven.AbstractMavenProject; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.Computer; import hudson.model.Descriptor; import hudson.model.Hudson; import hudson.model.Result; import hudson.slaves.NodeProperty; import hudson.slaves.EnvironmentVariablesNodeProperty; import hudson.tasks.BuildStep; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import hudson.tasks.Builder; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.json.JSONObject; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.DataBoundConstructor; /** * Wraps a build with pre and post build steps. These steps can take * any action. This is based on the release plugin, but is specifically * intended to provide for additional actions to be run as part of an * m2 project build. * * @author Andrew Bayer * @since 1.0 */ public class M2ExtraStepsWrapper extends BuildWrapper { private List<Builder> preBuildSteps = new ArrayList<Builder>(); private List<Builder> postBuildSteps = new ArrayList<Builder>(); private String runIfResult; @DataBoundConstructor public M2ExtraStepsWrapper(final String runIfResult) { this.runIfResult = runIfResult; } /** * @return Returns the preBuildSteps. */ public List<Builder> getPreBuildSteps() { return preBuildSteps; } /** * @param preBuildSteps The preBuildSteps to set. */ public void setPreBuildSteps(List<Builder> preBuildSteps) { this.preBuildSteps = preBuildSteps; } /** * @return Returns the postBuildSteps. */ public List<Builder> getPostBuildSteps() { return postBuildSteps; } /** * @param postBuildSteps The postBuildSteps to set. */ public void setPostBuildSteps(List<Builder> postBuildSteps) { this.postBuildSteps = postBuildSteps; } /** * @return Returns the runIfResult value. */ public String getRunIfResult() { return runIfResult; } /** * @param runIfResult The runIfResult to set. */ public void setRunIfResult(String runIfResult) { this.runIfResult = runIfResult; } private boolean shouldPostStepsRun(AbstractBuild build) { // If runIfResult is null, set it to "allCases". if (runIfResult == null) { setRunIfResult("allCases"); } // If runIfResult is "allCases", we're running regardless. if (runIfResult.equals("allCases")) { return true; } else { // Otherwise, we're going to need to compare against the build result. Result buildResult = build.getResult(); if (runIfResult.equals("success")) { return ((buildResult==null) || (buildResult.isBetterOrEqualTo(Result.SUCCESS))); } else if (runIfResult.equals("unstable")) { return ((buildResult==null) || (buildResult.isBetterOrEqualTo(Result.UNSTABLE))); } } // If we get down here, something weird's going on. Return false. return false; } @Override public Environment setUp(AbstractBuild build, final Launcher launcher, BuildListener listener) throws IOException, InterruptedException { build.addAction(new M2ExtraStepsAction()); if (!executeBuildSteps(preBuildSteps, build, launcher, listener)) { throw new IOException("Could not execute pre-build steps"); } // return environment return new Environment() { @Override public boolean tearDown(AbstractBuild build, BuildListener listener) throws IOException, InterruptedException { if (shouldPostStepsRun(build)) { return executeBuildSteps(postBuildSteps, build, launcher, listener); } else { return true; } } }; } private boolean executeBuildSteps(List<Builder> buildSteps, AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { boolean shouldContinue = true; // execute prebuild steps, stop processing if indicated for (BuildStep buildStep : buildSteps) { if (!shouldContinue) { break; } shouldContinue = buildStep.prebuild(build, listener); } // execute build step, stop processing if indicated for (BuildStep buildStep : buildSteps) { if (!shouldContinue) { break; } shouldContinue = buildStep.perform(build, launcher, listener); } return shouldContinue; } @Extension public static final class DescriptorImpl extends BuildWrapperDescriptor { @Override public String getDisplayName() { return "Configure M2 Extra Build Steps"; } @Override public BuildWrapper newInstance(StaplerRequest req, JSONObject formData) throws FormException { M2ExtraStepsWrapper instance = req.bindJSON(M2ExtraStepsWrapper.class, formData); instance.preBuildSteps = Descriptor.newInstancesFromHeteroList(req, formData, "preBuildSteps", Builder.all()); instance.postBuildSteps = Descriptor.newInstancesFromHeteroList(req, formData, "postBuildSteps", Builder.all()); return instance; } @Override public boolean isApplicable(AbstractProject<?, ?> item) { return (item instanceof AbstractMavenProject); } @Override public String getHelpFile() { return "/plugin/m2-extra-steps/help-projectConfig.html"; } } private static final Logger LOGGER = Logger.getLogger(M2ExtraStepsWrapper.class.getName()); }