package hudson.plugins.promoted_builds; import hudson.Extension; import hudson.model.AbstractProject; import hudson.model.AutoCompletionCandidates; import hudson.model.Item; import hudson.model.Job; import hudson.plugins.promoted_builds.util.JenkinsHelper; import hudson.triggers.Trigger; import hudson.triggers.TriggerDescriptor; import hudson.util.FormValidation; import hudson.util.ListBoxModel; import hudson.util.ListBoxModel.Option; import jenkins.model.Jenkins; import org.apache.commons.lang.StringUtils; import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import java.util.List; /** * {@link Trigger} that starts a build when a promotion happens. * * @author Kohsuke Kawaguchi */ public class PromotionTrigger extends Trigger<AbstractProject> { private final String jobName; private final String process; @DataBoundConstructor public PromotionTrigger(String jobName, String process) { this.jobName = jobName; this.process = process; } public String getJobName() { return jobName; } public String getProcess() { return process; } public boolean appliesTo(PromotionProcess proc) { return proc.getName().equals(process) && proc.getParent().getOwner().getFullName().equals(jobName); } public void consider(Promotion p) { if (appliesTo(p.getParent()) && job != null) { job.scheduleBuild2(job.getQuietPeriod()); } } @Extension public static class DescriptorImpl extends TriggerDescriptor { @Override public boolean isApplicable(Item item) { return true; } @Override public String getDisplayName() { return "Build when another project is promoted"; } /** * Checks the job name. * @param project Current project * @param value Value to be validated * @return Validation result */ public FormValidation doCheckJobName(@AncestorInPath Item project, @QueryParameter String value ) { if (!project.hasPermission(Item.CONFIGURE) && project.hasPermission(Item.EXTENDED_READ)) { return FormValidation.ok(); } project.checkPermission(Item.CONFIGURE); if (StringUtils.isNotBlank(value)) { AbstractProject p = JenkinsHelper.getInstance().getItem(value,project,AbstractProject.class); if(p==null) { AbstractProject nearest = AbstractProject.findNearest(value, project.getParent()); return FormValidation.error( nearest != null ? hudson.tasks.Messages.BuildTrigger_NoSuchProject(value, nearest.getRelativeNameFrom(project)) : Messages.Shared_noSuchProject(value)); } } return FormValidation.ok(); } public AutoCompletionCandidates doAutoCompleteJobName(@QueryParameter String value) { AutoCompletionCandidates candidates = new AutoCompletionCandidates(); List<AbstractProject> jobs = JenkinsHelper.getInstance().getItems(AbstractProject.class); for (AbstractProject job: jobs) { if (job.getFullName().startsWith(value)) { if (job.hasPermission(Item.READ)) { candidates.add(job.getFullName()); } } } return candidates; } /** * Fills in the available promotion processes. * @param defaultJob Base job * @param jobName Current name of the job specified in the form * @return List of possible project names. May be empty */ public ListBoxModel doFillProcessItems(@AncestorInPath Item defaultJob, @QueryParameter("jobName") String jobName) { if (!defaultJob.hasPermission(Item.CONFIGURE) && defaultJob.hasPermission(Item.EXTENDED_READ)) { return new ListBoxModel(); } defaultJob.checkPermission(Item.CONFIGURE); AbstractProject<?,?> j = null; if (jobName!=null) j = JenkinsHelper.getInstance().getItem(jobName,defaultJob,AbstractProject.class); ListBoxModel r = new ListBoxModel(); if (j!=null) { JobPropertyImpl pp = j.getProperty(JobPropertyImpl.class); if (pp!=null) { for (PromotionProcess proc : pp.getActiveItems()) r.add(new Option(proc.getDisplayName(),proc.getName())); } } return r; } } }