package org.jenkinsci.plugins.ghprb.manager.impl.downstreambuilds; import com.cloudbees.plugins.flow.FlowRun; import com.cloudbees.plugins.flow.JobInvocation; import hudson.model.Run; import hudson.tasks.test.AggregatedTestResultAction; import org.jenkinsci.plugins.ghprb.manager.configuration.JobConfiguration; import org.jenkinsci.plugins.ghprb.manager.impl.GhprbBaseBuildManager; import org.jgrapht.DirectedGraph; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; /** * @author mdelapenya (Manuel de la Peña) */ public class BuildFlowBuildManager extends GhprbBaseBuildManager { private static final Logger logger = Logger.getLogger(BuildFlowBuildManager.class.getName()); public BuildFlowBuildManager(Run<?, ?> build) { super(build); } public BuildFlowBuildManager(Run<?, ?> build, JobConfiguration jobConfiguration) { super(build, jobConfiguration); } /** * Calculate the build URL of a build of BuildFlow type, traversing its downstream builds graph * * @return the build URL of a BuildFlow build, with all its downstream builds */ @SuppressWarnings("unchecked") @Override public String calculateBuildUrl(String publishedURL) { Iterator<JobInvocation> iterator = (Iterator<JobInvocation>) downstreamProjects(); StringBuilder sb = new StringBuilder(); while (iterator.hasNext()) { JobInvocation jobInvocation = iterator.next(); sb.append("\n"); sb.append("<a href='"); sb.append(jobInvocation.getBuildUrl()); sb.append("'>"); sb.append(jobInvocation.getBuildUrl()); sb.append("</a>"); } return sb.toString(); } /** * Return a downstream iterator of a build of default type. This will be overriden by specific build types. * * @return the downstream builds as an iterator */ @Override public Iterator<?> downstreamProjects() { FlowRun flowRun = (FlowRun) build; DirectedGraph<JobInvocation, FlowRun.JobEdge> directedGraph = flowRun.getJobsGraph(); return directedGraph.vertexSet().iterator(); } /** * Return the tests results of a build of default type. This will be overriden by specific build types. * * @return the tests result of a build of default type */ @SuppressWarnings("unchecked") @Override public String getTestResults() { Iterator<JobInvocation> iterator = (Iterator<JobInvocation>) downstreamProjects(); StringBuilder sb = new StringBuilder(); while (iterator.hasNext()) { JobInvocation jobInvocation = iterator.next(); try { Run<?, ?> build = (Run<?, ?>) jobInvocation.getBuild(); AggregatedTestResultAction testResultAction = build.getAction(AggregatedTestResultAction.class); if (testResultAction != null) { sb.append("\n"); sb.append(jobInvocation.getBuildUrl()); sb.append("\n"); sb.append(getAggregatedTestResults(build)); } } catch (Exception e) { logger.log(Level.SEVERE, "Job execution has failed", e); } } return sb.toString(); } }