in common/build.go [343:393]
func (b *Build) Run(globalConfig *Config, trace JobTrace) (err error) {
var executor Executor
logger := NewBuildLogger(trace, b.Log())
logger.Println(fmt.Sprintf("Running with %s\n on %s (%s)", AppVersion.Line(), b.Runner.Name, b.Runner.ShortDescription()))
b.CurrentState = BuildRunStatePending
defer func() {
if _, ok := err.(*BuildError); ok {
logger.SoftErrorln("Job failed:", err)
trace.Fail(err)
} else if err != nil {
logger.Errorln("Job failed (system failure):", err)
trace.Fail(err)
} else {
logger.Infoln("Job succeeded")
trace.Success()
}
if executor != nil {
executor.Cleanup()
}
}()
context, cancel := context.WithTimeout(context.Background(), b.GetBuildTimeout())
defer cancel()
trace.SetCancelFunc(cancel)
options := ExecutorPrepareOptions{
Config: b.Runner,
Build: b,
Trace: trace,
User: globalConfig.User,
Context: context,
}
provider := GetExecutor(b.Runner.Executor)
if provider == nil {
return errors.New("executor not found")
}
executor, err = b.retryCreateExecutor(options, provider, logger)
if err == nil {
err = b.run(context, executor)
}
if executor != nil {
executor.Finish(err)
}
return err
}