@@ -418,6 +418,7 @@ func (b *Build) StartBuild(
418418 return nil
419419}
420420
421+ //nolint:gocognit
421422func (b * Build ) executeStepStage (ctx context.Context , connector steps.Connector , buildStage BuildStage , req []schema.Step ) error {
422423 if ctx .Err () != nil {
423424 return ctx .Err ()
@@ -453,30 +454,46 @@ func (b *Build) executeStepStage(ctx context.Context, connector steps.Connector,
453454 Variables : b .GetAllVariables (),
454455 }
455456
456- err := steps .Execute (ctx , connector , info , req , stdout )
457- if err != nil {
458- berr := & BuildError {Inner : err }
459-
460- var cserr * steps.ClientStatusError
461- if errors .As (err , & cserr ) {
462- switch cserr .Status .State {
463- case client .StateUnspecified :
464- berr .FailureReason = UnknownFailure
465- case client .StateFailure :
466- berr .FailureReason = ScriptFailure
467- }
468- }
469-
470- return berr
471- }
472-
473- return err
457+ return wrapStepStageErr (steps .Execute (ctx , connector , info , req , stdout ))
474458 },
475459 }
476460
477461 return section .Execute (& b .logger )
478462}
479463
464+ func wrapStepStageErr (err error ) error {
465+ if err == nil {
466+ return nil
467+ }
468+
469+ if errors .Is (err , steps .ErrNoStepRunnerButOkay ) {
470+ return nil
471+ }
472+
473+ berr := & BuildError {Inner : err }
474+
475+ var cserr * steps.ClientStatusError
476+ if errors .As (err , & cserr ) {
477+ switch cserr .Status .State {
478+ case client .StateUnspecified :
479+ berr .FailureReason = UnknownFailure
480+ case client .StateFailure :
481+ berr .FailureReason = ScriptFailure
482+ }
483+ }
484+
485+ // hack: for now, we parse the exit code from the error response
486+ // later we might want to introduce a proper exit code from the step-runner
487+ // https://gitlab.com/gitlab-org/step-runner/-/work_items/349
488+ if _ , code , ok := strings .Cut (err .Error (), "exit status" ); ok {
489+ if exitCode , err := strconv .Atoi (strings .TrimSpace (code )); err == nil {
490+ berr .ExitCode = exitCode
491+ }
492+ }
493+
494+ return berr
495+ }
496+
480497//nolint:gocognit
481498func (b * Build ) executeStage (ctx context.Context , buildStage BuildStage , executor Executor ) error {
482499 if b .UseNativeSteps () {
0 commit comments