/** * Gets all upstream builds that triggered argument queue item. * @param item the queue item to find upstream builds for * @return set of upstream builds */ public static Set<AbstractBuild> getUpstreamBuilds(Queue.Item item) { Set<AbstractBuild> upstreamBuilds = new HashSet<AbstractBuild>(); for (Cause cause : item.getCauses()) { if (cause instanceof Cause.UpstreamCause) { Cause.UpstreamCause upstreamCause = (Cause.UpstreamCause)cause; Run<?, ?> upstreamRun = upstreamCause.getUpstreamRun(); if (upstreamRun != null && upstreamRun instanceof AbstractBuild) { upstreamBuilds.add((AbstractBuild)upstreamRun); } } } return Collections.unmodifiableSet(upstreamBuilds); }
/** * Check NO infinite loop of job triggers caused by {@link hudson.model.Cause.UpstreamCause}. * * @param initialBuild * @throws IllegalStateException if an infinite loop is detected */ public void checkNoInfiniteLoopOfUpstreamCause(@Nonnull Run initialBuild) throws IllegalStateException { java.util.Queue<Run> builds = new LinkedList<>(Collections.singleton(initialBuild)); Run currentBuild; while ((currentBuild = builds.poll()) != null) { for (Cause cause : ((List<Cause>) currentBuild.getCauses())) { if (cause instanceof Cause.UpstreamCause) { Cause.UpstreamCause upstreamCause = (Cause.UpstreamCause) cause; Run<?, ?> upstreamBuild = upstreamCause.getUpstreamRun(); if (upstreamBuild == null) { // Can be Authorization, build deleted on the file system... } else if (Objects.equals(upstreamBuild.getParent().getFullName(), initialBuild.getParent().getFullName())) { throw new IllegalStateException("Infinite loop of job triggers "); } else { builds.add(upstreamBuild); } } } } }
/** * Gets the queue ids of all upstream projects that triggered argument queue item. * @param item the queue item to find upstream projects for * @return set of upstream project names */ public static Set<Long> getUpstreamQueueIds(Queue.Item item) { Set<Long> upstreamProjects = new HashSet<Long>(); for (Cause cause : item.getCauses()) { if (cause instanceof Cause.UpstreamCause) { Cause.UpstreamCause upstreamCause = (Cause.UpstreamCause)cause; Run<?, ?> run = upstreamCause.getUpstreamRun(); upstreamCause.getUpstreamProject(); if (run != null) { upstreamProjects.add(run.getQueueId()); } } } return Collections.unmodifiableSet(upstreamProjects); }
if (cause instanceof Cause.UpstreamCause) { Cause.UpstreamCause upstream = (Cause.UpstreamCause) cause; Run<?, ?> upstreamRun = upstream.getUpstreamRun(); if (upstreamRun != null) { upstreamBuilds.add(upstreamRun);
if (cause instanceof UpstreamCause) { UpstreamCause upstream = (UpstreamCause) cause; Run<?, ?> upstreamRun = upstream.getUpstreamRun(); if (upstreamRun != null) { upstreamBuilds.add(upstreamRun);
/** * Identifies the {@link User} and {@link Run} that triggered the supplied {@link Run}. * * @param run the {@link Run} to find the trigger of. * @return the trigger of the supplied run or {@code null} if this could not be determined. */ @CheckForNull private static Map.Entry<User, Run<?, ?>> triggeredBy(Run<?, ?> run) { Cause.UserIdCause cause = run.getCause(Cause.UserIdCause.class); if (cause != null) { User u = User.get(cause.getUserId(), false, Collections.emptyMap()); return u == null ? null : new AbstractMap.SimpleImmutableEntry<User, Run<?, ?>>(u, run); } Cause.UpstreamCause c = run.getCause(Cause.UpstreamCause.class); run = (c != null) ? c.getUpstreamRun() : null; while (run != null) { cause = run.getCause(Cause.UserIdCause.class); if (cause != null) { User u = User.get(cause.getUserId(), false, Collections.emptyMap()); return u == null ? null : new AbstractMap.SimpleImmutableEntry<User, Run<?, ?>>(u, run); } c = run.getCause(Cause.UpstreamCause.class); run = (c != null) ? c.getUpstreamRun() : null; } return null; }
/** * Identifies the {@link User} and {@link Run} that triggered the supplied {@link Run}. * * @param run the {@link Run} to find the trigger of. * @return the trigger of the supplied run or {@code null} if this could not be determined. */ @CheckForNull private static Map.Entry<User, Run<?, ?>> triggeredBy(Run<?, ?> run) { Cause.UserIdCause cause = run.getCause(Cause.UserIdCause.class); if (cause != null) { User u = User.get(cause.getUserId(), false, Collections.emptyMap()); return u == null ? null : new AbstractMap.SimpleImmutableEntry<User, Run<?, ?>>(u, run); } Cause.UpstreamCause c = run.getCause(Cause.UpstreamCause.class); run = (c != null) ? c.getUpstreamRun() : null; while (run != null) { cause = run.getCause(Cause.UserIdCause.class); if (cause != null) { User u = User.get(cause.getUserId(), false, Collections.emptyMap()); return u == null ? null : new AbstractMap.SimpleImmutableEntry<User, Run<?, ?>>(u, run); } c = run.getCause(Cause.UpstreamCause.class); run = (c != null) ? c.getUpstreamRun() : null; } return null; }