in common/build.go [1050:1124]
func (b *Build) Run(globalConfig *Config, trace JobTrace) (err error) {
b.setCurrentState(BuildRunStatePending)
// These defers are ordered because runBuild could panic and the recover needs to handle that panic.
// setTraceStatus needs to be last since it needs a correct error value to report the job's status
defer func() { b.setTraceStatus(trace, err) }()
defer func() {
if r := recover(); r != nil {
err = &BuildError{FailureReason: RunnerSystemFailure, Inner: fmt.Errorf("panic: %s", r)}
b.Log().WithError(err).Error(string(debug.Stack()))
}
}()
b.logUsedImages()
b.printRunningWithHeader(trace)
err = b.resolveSecrets(trace)
if err != nil {
return err
}
b.expandContainerOptions()
b.logger = buildlogger.New(
trace,
b.Log(),
buildlogger.Options{
MaskPhrases: b.GetAllVariables().Masked(),
MaskTokenPrefixes: b.JobResponse.Features.TokenMaskPrefixes,
Timestamping: b.IsFeatureFlagOn(featureflags.UseTimestamps),
MaskAllDefaultTokens: b.IsFeatureFlagOn(featureflags.MaskAllDefaultTokens),
},
)
defer b.logger.Close()
ctx, cancel := context.WithTimeout(context.Background(), b.GetBuildTimeout())
defer cancel()
b.configureTrace(trace, cancel)
b.printSettingErrors()
options := b.createExecutorPrepareOptions(ctx, globalConfig)
provider := GetExecutorProvider(b.Runner.Executor)
if provider == nil {
return errors.New("executor not found")
}
err = provider.GetFeatures(&b.ExecutorFeatures)
if err != nil {
return fmt.Errorf("retrieving executor features: %w", err)
}
executor, err := b.executeBuildSection(options, provider)
if err != nil {
return err
}
defer executor.Cleanup()
// override context that can be canceled by the executor if supported
if withContext, ok := b.ExecutorData.(WithContext); ok {
ctx, cancel = withContext.WithContext(ctx)
defer cancel()
}
err = b.run(ctx, trace, executor)
if errWait := b.waitForTerminal(ctx, globalConfig.SessionServer.GetSessionTimeout()); errWait != nil {
b.Log().WithError(errWait).Debug("Stopped waiting for terminal")
}
executor.Finish(err)
return err
}