All Downloads are FREE. Search and download functionalities are using the official Maven repository.

hudson.tasks.BuildTrigger Maven / Gradle / Ivy

package hudson.tasks;

import hudson.Launcher;
import hudson.model.Build;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Project;
import hudson.model.Result;
import hudson.util.FormFieldValidator;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.ServletException;
import java.io.IOException;
import java.util.List;
import java.util.StringTokenizer;

/**
 * Triggers builds of other projects.
 *
 * @author Kohsuke Kawaguchi
 */
public class BuildTrigger extends Publisher {

    /**
     * Comma-separated list of other projects to be scheduled.
     */
    private String childProjects;

    public BuildTrigger(String childProjects) {
        this.childProjects = childProjects;
    }

    public BuildTrigger(List childProjects) {
        this(Project.toNameList(childProjects));
    }

    public String getChildProjectsValue() {
        return childProjects;
    }

    public List getChildProjects() {
        return Project.fromNameList(childProjects);
    }

    public boolean perform(Build build, Launcher launcher, BuildListener listener) {
        if(build.getResult()== Result.SUCCESS) {
            for (Project p : getChildProjects()) {
                listener.getLogger().println("Triggering a new build of "+p.getName());
                p.scheduleBuild();
            }
        }

        return true;
    }

    /**
     * Called from {@link Job#renameTo(String)} when a job is renamed.
     *
     * @return true
     *      if this {@link BuildTrigger} is changed and needs to be saved.
     */
    public boolean onJobRenamed(String oldName, String newName) {
        // quick test
        if(!childProjects.contains(oldName))
            return false;

        boolean changed = false;

        // we need to do this per string, since old Project object is already gone.
        String[] projects = childProjects.split(",");
        for( int i=0; i0)    b.append(',');
                b.append(p);
            }
            childProjects = b.toString();
        }

        return changed;
    }

    public Descriptor getDescriptor() {
        return DESCRIPTOR;
    }


    public static final Descriptor DESCRIPTOR = new DescriptorImpl();

    public static class DescriptorImpl extends Descriptor {
        public DescriptorImpl() {
            super(BuildTrigger.class);
        }

        public String getDisplayName() {
            return "Build other projects";
        }

        public Publisher newInstance(StaplerRequest req) {
            return new BuildTrigger(req.getParameter("childProjects"));
        }

        /**
         * Form validation method.
         */
        public void doCheck( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
            new FormFieldValidator(req,rsp,true) {
                protected void check() throws IOException, ServletException {
                    String list = request.getParameter("value");

                    StringTokenizer tokens = new StringTokenizer(list,",");
                    while(tokens.hasMoreTokens()) {
                        String projectName = tokens.nextToken().trim();
                        Job job = Hudson.getInstance().getJob(projectName);
                        if(job==null) {
                            error("No such project '"+projectName+"'. Did you mean '"+
                                Project.findNearest(projectName).getName()+"'?");
                            return;
                        }
                        if(!(job instanceof Project)) {
                            error(projectName+" is not a software build");
                            return;
                        }
                    }

                    ok();
                }
            }.process();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy