/** * Builds up the environment variable map that's sufficient to identify a process * as ours. This is used to kill run-away processes via {@link ProcessTree#killAll(Map)}. */ public @Nonnull final EnvVars getCharacteristicEnvVars() { EnvVars env = getParent().getCharacteristicEnvVars(); env.put("BUILD_NUMBER",String.valueOf(number)); env.put("BUILD_ID",getId()); env.put("BUILD_TAG","jenkins-"+getParent().getFullName().replace('/', '-')+"-"+number); return env; }
/** * Returns the {@link Cause}s that triggered a build. * * <p> * If a build sits in the queue for a long time, multiple build requests made during this period * are all rolled up into one build, hence this method may return a list. * * @return * can be empty but never null. read-only. * @since 1.321 */ public @Nonnull List<Cause> getCauses() { CauseAction a = getAction(CauseAction.class); if (a==null) return Collections.emptyList(); return Collections.unmodifiableList(a.getCauses()); }
private boolean fitsSearchParams(@Nonnull Run run) { if (searchString == null) { return true; } if (fitsSearchString(run.getDisplayName())) { return true; } else if (fitsSearchString(run.getDescription())) { return true; } else if (fitsSearchString(run.getNumber())) { return true; } else if (fitsSearchString(run.getQueueId())) { return true; } else if (fitsSearchString(run.getResult())) { return true; } else if (run instanceof AbstractBuild && fitsSearchBuildVariables((AbstractBuild) run)) { return true; } else { ParametersAction parametersAction = run.getAction(ParametersAction.class); if (parametersAction != null && fitsSearchBuildParameters(parametersAction)) { return true; } } // Non of the fuzzy matches "liked" the search term. return false; }
@Override public boolean apply(Run<?, ?> run) { return !run.isBuilding() && run.getResult()==Result.FAILURE; } };
/** * Returns the last build that was actually built - i.e., skipping any with Result.NOT_BUILT */ public @CheckForNull RunT getPreviousBuiltBuild() { RunT r=getPreviousBuild(); // in certain situations (aborted m2 builds) r.getResult() can still be null, although it should theoretically never happen while( r!=null && (r.getResult() == null || r.getResult()==Result.NOT_BUILT) ) r=r.getPreviousBuild(); return r; }
/** * Gets the most recent {@linkplain #isBuilding() completed} build excluding 'this' Run itself. */ public final @CheckForNull RunT getPreviousCompletedBuild() { RunT r=getPreviousBuild(); while (r!=null && r.isBuilding()) r=r.getPreviousBuild(); return r; }
@Override public void onCompleted(@Nonnull Run r, @Nonnull TaskListener listener) { Collection<ReverseBuildTrigger> triggers; synchronized (this) { if (upstream2Trigger == null) { upstream2Trigger = calculateCache(); } Collection<ReverseBuildTrigger> _triggers = upstream2Trigger.get(r.getParent()); if (_triggers == null || _triggers.isEmpty()) { return; } triggers = new ArrayList<>(_triggers); } for (final ReverseBuildTrigger trigger : triggers) { if (trigger.shouldTrigger(r, listener)) { if (!trigger.job.isBuildable()) { listener.getLogger().println(hudson.tasks.Messages.BuildTrigger_Disabled(ModelHyperlinkNote.encodeTo(trigger.job))); continue; } String name = ModelHyperlinkNote.encodeTo(trigger.job) + " #" + trigger.job.getNextBuildNumber(); if (ParameterizedJobMixIn.scheduleBuild2(trigger.job, -1, new CauseAction(new Cause.UpstreamCause(r))) != null) { listener.getLogger().println(hudson.tasks.Messages.BuildTrigger_Triggering(name)); } else { listener.getLogger().println(hudson.tasks.Messages.BuildTrigger_InQueue(name)); } } } } }
/** * Ordering based on build numbers. * If numbers are equal order based on names of parent projects. */ public int compareTo(@Nonnull RunT that) { final int res = this.number - that.number; if (res == 0) return this.getParent().getFullName().compareTo(that.getParent().getFullName()); return res; }
/** * Adds a usage reference to the build. * @param b {@link Run} to be referenced in {@link #usages} * @since 1.577 */ public synchronized void addFor(@Nonnull Run b) throws IOException { add(b.getParent().getFullName(), b.getNumber()); }
/** * Produces an identifier for this run unique in the system. * @return the {@link Job#getFullName}, then {@code #}, then {@link #getNumber} * @see #fromExternalizableId */ public @Nonnull String getExternalizableId() { return project.getFullName() + "#" + getNumber(); }
/** * Gets the subset of {@link #getActions()} that consists of {@link BuildBadgeAction}s. */ public @Nonnull List<BuildBadgeAction> getBadgeActions() { List<BuildBadgeAction> r = getActions(BuildBadgeAction.class); if(isKeepLog()) { r = new ArrayList<>(r); r.add(new KeepLogBuildBadge()); } return r; }
private long getNextBuildNumber(@Nonnull Object entry) { if (entry instanceof Queue.Item) { Queue.Task task = ((Queue.Item) entry).task; if (task instanceof Job) { return ((Job) task).getNextBuildNumber(); } } else if (entry instanceof Run) { return ((Run) entry).getParent().getNextBuildNumber(); } // TODO maybe this should be an error? return HistoryPageEntry.getEntryId(entry) + 1; }
/** * Obtains the absolute URL to this build. * * @deprecated * This method shall <b>NEVER</b> be used during HTML page rendering, as it's too easy for * misconfiguration to break this value, with network set up like Apache reverse proxy. * This method is only intended for the remote API clients who cannot resolve relative references. */ @Exported(visibility=2,name="url") @Deprecated public final @Nonnull String getAbsoluteUrl() { return project.getAbsoluteUrl()+getNumber()+'/'; }
/** * See if the new build matches any of the peephole permalink. */ @Override public void onCompleted(Run<?,?> run, @Nonnull TaskListener listener) { Job<?, ?> j = run.getParent(); for (PeepholePermalink pp : Util.filter(j.getPermalinks(), PeepholePermalink.class)) { if (pp.apply(run)) { Run<?, ?> cur = pp.resolve(j); if (cur==null || cur.getNumber()<run.getNumber()) { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine("Updating "+pp.getPermalinkFile(j).getName()+" permalink to completed "+run.getNumber()); pp.updateCache(j,run); } } } } }
@Nonnull @Override public Collection<? extends Action> createFor(@Nonnull Job j) { List<Action> actions = new LinkedList<>(); Run r = j.getLastSuccessfulBuild(); if (r != null) { for (LastBuildAction a : r.getActions(LastBuildAction.class)) { actions.addAll(a.getProjectActions()); } } // TODO should there be an option to check lastCompletedBuild even if it failed? // Not useful for, say, TestResultAction, since if you have a build that fails before recording test // results, the job would then have no TestResultProjectAction. return actions; }
public @Nonnull EnvVars getEnvironment(@Nonnull TaskListener listener) throws IOException, InterruptedException { Computer c = Computer.currentComputer(); Node n = c==null ? null : c.getNode(); EnvVars env = getParent().getEnvironment(n,listener); env.putAll(getCharacteristicEnvVars()); for (EnvironmentContributingAction a : getActions(EnvironmentContributingAction.class)) { a.buildEnvironment(this, env);
onStartBuilding(); try { logger = createLogger(); listener = createBuildListener(job, logger, charset); listener.started(getCauses()); updateSymlinks(listener); setResult(job.run(listener)); LOGGER.log(Level.INFO, this + " aborted", e); } catch( Throwable e ) { handleFatalBuildProblem(listener,e); result = Result.FAILURE; throw t; } catch( Throwable e ) { handleFatalBuildProblem(listener,e); result = Result.FAILURE; } finally { job.cleanUp(listener); } catch (Exception e) { handleFatalBuildProblem(listener,e); save(); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed to save build record",e);
@Override public void perform(@Nonnull Run<?, ?> run, @Nonnull FilePath workspace, @Nonnull Launcher launcher, @Nonnull TaskListener listener) throws InterruptedException, IOException { jenkins.plugins.zulip.DescriptorImpl globalConfig = Jenkins.getInstance().getDescriptorByType(jenkins.plugins.zulip.DescriptorImpl.class); Zulip zulip = new Zulip(globalConfig.getUrl(), globalConfig.getEmail(), globalConfig.getApiKey()); String stream = ZulipUtil.getDefaultValue(getStream(), globalConfig.getStream()); String topic = ZulipUtil.getDefaultValue(ZulipUtil.getDefaultValue(getTopic(), globalConfig.getTopic()), run.getParent().getDisplayName()); String expandedMessage = getMessage(); try { expandedMessage = run.getEnvironment(listener).expand(expandedMessage); } catch (IOException ex) { logger.severe("Failed to expand message variables: " + ex.getMessage()); } zulip.sendStreamMessage(stream, topic, expandedMessage); }
public void perform(@Nonnull final Run<?, ?> build, @Nonnull final FilePath filePath, @Nonnull final Launcher launcher, @Nonnull final TaskListener listener) throws InterruptedException, IOException { build.setResult(Result.SUCCESS); return; final PluginWrapper wrapper = Jenkins.getInstance().getPluginManager().getPlugin(DependencyCheckDescriptor.PLUGIN_ID); listener.getLogger().println(OUT_TAG + wrapper.getLongName() + " v" + wrapper.getVersion()); final boolean isMaster = build.getExecutor().getOwner().getNode() == Jenkins.getInstance(); build.setResult(Result.SUCCESS); } else { build.setResult(Result.FAILURE);
private JellyContext createContext(Object it, @Nonnull Run<?, ?> build, @Nonnull TaskListener listener) { JellyContext context = new JellyContext(); ExtendedEmailPublisherDescriptor descriptor = Jenkins.getActiveInstance().getDescriptorByType(ExtendedEmailPublisherDescriptor.class); context.setVariable("it", it); context.setVariable("build", build); context.setVariable("project", build.getParent()); context.setVariable("logger", listener.getLogger()); context.setVariable("rooturl", descriptor.getHudsonUrl()); return context; } }