/* This file is part of Delivery Pipeline Plugin. Delivery Pipeline Plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Delivery Pipeline Plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Delivery Pipeline Plugin. If not, see <http://www.gnu.org/licenses/>. */ package se.diabol.jenkins.pipeline.domain.task; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Item; import hudson.model.Result; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import se.diabol.jenkins.pipeline.domain.AbstractItem; import se.diabol.jenkins.pipeline.trigger.ManualTriggerResolver; import se.diabol.jenkins.pipeline.util.BuildUtil; import se.diabol.jenkins.pipeline.util.JenkinsUtil; import se.diabol.jenkins.pipeline.util.ProjectUtil; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.CheckForNull; @ExportedBean(defaultVisibility = AbstractItem.VISIBILITY) public class ManualStep { private final String upstreamProject; private final String upstreamId; private final boolean enabled; private final boolean permission; private final Map<String, String> possibleVersions; public ManualStep(String upstreamProject, String upstreamId, boolean enabled, boolean permission, Map<String, String> possibleVersions) { this.upstreamProject = upstreamProject; this.upstreamId = upstreamId; this.enabled = enabled; this.permission = permission; this.possibleVersions = possibleVersions; } @CheckForNull public static ManualStep resolveManualStep(AbstractProject project) { if (isManualTrigger(project)) { return new ManualStep(project.getName(), null, false, project.hasPermission(Item.BUILD), null); } else { return null; } } static boolean isManualTrigger(AbstractProject<?, ?> project) { List<ManualTriggerResolver> resolvers = ManualTriggerResolver.all(); for (ManualTriggerResolver manualTriggerResolver : resolvers) { if (manualTriggerResolver.isManualTrigger(project)) { return true; } } return false; } private static List<AbstractProject> getUpstreamManualTriggered(AbstractProject<?, ?> project) { List<ManualTriggerResolver> resolvers = ManualTriggerResolver.all(); List<AbstractProject> result = new ArrayList<AbstractProject>(); for (ManualTriggerResolver manualTriggerResolver : resolvers) { result.addAll(manualTriggerResolver.getUpstreamManualTriggered(project)); } return result; } @CheckForNull public static ManualStep getManualStepLatest(AbstractProject project, AbstractBuild build, AbstractBuild firstBuild) { if (isManualTrigger(project)) { List<AbstractProject> upstreams = getUpstreamManualTriggered(project); for (int i = 0; i < upstreams.size(); i++) { AbstractProject upstream = upstreams.get(i); @SuppressWarnings("unchecked") AbstractBuild upstreamBuild = BuildUtil.match(upstream.getBuilds(), firstBuild); if (build == null) { if (upstreamBuild != null && !upstreamBuild.isBuilding() && !ProjectUtil.isQueued(project, firstBuild)) { Result result = upstreamBuild.getResult(); return new ManualStep(upstream.getRelativeNameFrom(JenkinsUtil.getInstance()), String.valueOf(upstreamBuild.getNumber()), result != null && !result.isWorseThan(Result.UNSTABLE), project.hasPermission(Item.BUILD), null); } } else { Result result = build.getResult(); if (upstreamBuild != null && !build.isBuilding() && !ProjectUtil.isQueued(project, firstBuild) && result != null && result.isWorseThan(Result.UNSTABLE)) { return new ManualStep(upstream.getRelativeNameFrom(JenkinsUtil.getInstance()), String.valueOf(upstreamBuild.getNumber()), true, project.hasPermission(Item.BUILD), null); } } if (i == upstreams.size() - 1) { return new ManualStep(upstream.getRelativeNameFrom(JenkinsUtil.getInstance()), null, false, project.hasPermission(Item.BUILD), null); } } } return null; } @CheckForNull public static ManualStep getManualStepAggregated(AbstractProject project, AbstractProject firstProject) { if (isManualTrigger(project)) { Map<String, String> versions = new HashMap<String, String>(); AbstractProject<?, ?> upstream = (AbstractProject<?, ?>) project.getUpstreamProjects().get(0); for (AbstractBuild build : upstream.getBuilds()) { AbstractBuild versionBuild = BuildUtil.getFirstUpstreamBuild(build, firstProject); if (versionBuild != null && !versions.containsKey(versionBuild.getDisplayName())) { versions.put(versionBuild.getDisplayName(), String.valueOf(versionBuild.getNumber())); } } if (versions.isEmpty()) { return new ManualStep(upstream.getName(), null, false, project.hasPermission(Item.BUILD), versions); } return new ManualStep(upstream.getName(), null, true, project.hasPermission(Item.BUILD), versions); } return null; } @Exported public String getUpstreamProject() { return upstreamProject; } @Exported public String getUpstreamId() { return upstreamId; } @Exported public boolean isEnabled() { return enabled; } @Exported public boolean isPermission() { return permission; } @Exported public Map<String, String> getPossibleVersions() { return possibleVersions; } }