in common/build.go [363:431]
func (b *Build) executeStage(ctx context.Context, buildStage BuildStage, executor Executor) error {
if ctx.Err() != nil {
return ctx.Err()
}
b.OnBuildStageStartFn.Call(buildStage)
defer b.OnBuildStageEndFn.Call(buildStage)
b.setCurrentStage(buildStage)
b.Log().WithField("build_stage", buildStage).Debug("Executing build stage")
defer func() {
if errors.Is(ctx.Err(), context.DeadlineExceeded) {
b.logger.Warningln(
string(buildStage) + " could not run to completion because the timeout was exceeded. " +
"For more control over job and script timeouts see: " +
"https://docs.gitlab.com/ci/runners/configure_runners/#set-script-and-after_script-timeouts")
}
}()
shell := executor.Shell()
if shell == nil {
return errors.New("no shell defined")
}
script, err := GenerateShellScript(ctx, buildStage, *shell)
if errors.Is(err, ErrSkipBuildStage) {
if b.IsFeatureFlagOn(featureflags.SkipNoOpBuildStages) {
b.Log().WithField("build_stage", buildStage).Debug("Skipping stage (nothing to do)")
return nil
}
err = nil
}
if err != nil {
return err
}
// Nothing to execute
if script == "" {
return nil
}
cmd := ExecutorCommand{
Context: ctx,
Script: script,
Stage: buildStage,
Predefined: getPredefinedEnv(buildStage),
}
section := helpers.BuildSection{
Name: string(buildStage),
SkipMetrics: !b.JobResponse.Features.TraceSections,
Run: func() error {
msg := fmt.Sprintf(
"%s%s%s",
helpers.ANSI_BOLD_CYAN,
GetStageDescription(buildStage),
helpers.ANSI_RESET,
)
b.logger.Println(msg)
return executor.Run(cmd)
},
}
return section.Execute(&b.logger)
}