in core/src/main/java/hudson/model/Run.java [1851:1972]
protected final void execute(@NonNull RunExecution job) {
if(result!=null)
return; // already built.
OutputStream logger = null;
StreamBuildListener listener=null;
runner = job;
onStartBuilding();
try {
// to set the state to COMPLETE in the end, even if the thread dies abnormally.
// otherwise the queue state becomes inconsistent
long start = System.currentTimeMillis();
try {
try {
Computer computer = Computer.currentComputer();
Charset charset = null;
if (computer != null) {
charset = computer.getDefaultCharset();
this.charset = charset.name();
}
logger = createLogger();
listener = createBuildListener(job, logger, charset);
listener.started(getCauses());
Authentication auth = Jenkins.getAuthentication();
if (auth.equals(ACL.SYSTEM)) {
listener.getLogger().println(Messages.Run_running_as_SYSTEM());
} else {
String id = auth.getName();
if (!auth.equals(Jenkins.ANONYMOUS)) {
final User usr = User.getById(id, false);
if (usr != null) { // Encode user hyperlink for existing users
id = ModelHyperlinkNote.encodeTo(usr);
}
}
listener.getLogger().println(Messages.Run_running_as_(id));
}
RunListener.fireStarted(this,listener);
setResult(job.run(listener));
LOGGER.log(FINEST, "{0} main build action completed: {1}", new Object[] {this, result});
CheckPoint.MAIN_COMPLETED.report();
} catch (ThreadDeath t) {
throw t;
} catch( AbortException e ) {// orderly abortion.
result = Result.FAILURE;
listener.error(e.getMessage());
LOGGER.log(FINE, "Build "+this+" aborted",e);
} catch( RunnerAbortedException e ) {// orderly abortion.
result = Result.FAILURE;
LOGGER.log(FINE, "Build "+this+" aborted",e);
} catch( InterruptedException e) {
// aborted
result = Executor.currentExecutor().abortResult();
listener.getLogger().println(Messages.Run_BuildAborted());
Executor.currentExecutor().recordCauseOfInterruption(Run.this,listener);
LOGGER.log(Level.INFO, this + " aborted", e);
} catch( Throwable e ) {
handleFatalBuildProblem(listener,e);
result = Result.FAILURE;
}
// even if the main build fails fatally, try to run post build processing
job.post(listener);
} catch (ThreadDeath t) {
throw t;
} catch( Throwable e ) {
handleFatalBuildProblem(listener,e);
result = Result.FAILURE;
} finally {
long end = System.currentTimeMillis();
duration = Math.max(end - start, 0); // @see HUDSON-5844
// advance the state.
// the significance of doing this is that Jenkins
// will now see this build as completed.
// things like triggering other builds requires this as pre-condition.
// see issue #980.
LOGGER.log(FINER, "moving into POST_PRODUCTION on {0}", this);
state = State.POST_PRODUCTION;
if (listener != null) {
RunListener.fireCompleted(this,listener);
try {
job.cleanUp(listener);
} catch (Exception e) {
handleFatalBuildProblem(listener,e);
// too late to update the result now
}
listener.finished(result);
listener.closeQuietly();
}
try {
save();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Failed to save build record",e);
}
}
try {
getParent().logRotate();
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Failed to rotate log",e);
}
} finally {
onEndBuilding();
if (logger != null) {
try {
logger.close();
} catch (IOException x) {
LOGGER.log(Level.WARNING, "failed to close log for " + Run.this, x);
}
}
}
}