diff --git a/pkg/cli/audit.go b/pkg/cli/audit.go index e615bb7aa2d..927c0f60b5b 100644 --- a/pkg/cli/audit.go +++ b/pkg/cli/audit.go @@ -675,6 +675,9 @@ func collectAuditAnalysisResults(ctx context.Context, run WorkflowRun, runOutput if err := g.Wait(); err != nil { return results, err } + if ctx.Err() != nil { + return results, ctx.Err() + } return results, nil } @@ -743,6 +746,9 @@ func launchJobDetailsAnalysis(g *errgroup.Group, gctx context.Context, results * } jobDetails, failedJobCount, err := fetchJobDetailsWithCounts(gctx, runID, verbose) if err != nil { + if gctx.Err() != nil { + return gctx.Err() + } auditLog.Printf("fetchJobDetailsWithCounts failed: %v", err) if verbose { fmt.Fprintln(os.Stderr, console.FormatWarningMessage(fmt.Sprintf("Failed to fetch job details: %v", err))) @@ -839,6 +845,9 @@ func runAuditAnalysis[T any](g *errgroup.Group, gctx context.Context, verbose bo } value, err := fn() if err != nil { + if gctx.Err() != nil { + return gctx.Err() + } auditLog.Printf("%s failed: %v", name, err) if verbose { fmt.Fprintln(os.Stderr, console.FormatWarningMessage(fmt.Sprintf("%s: %v", warning, err))) diff --git a/pkg/cli/audit_concurrency_test.go b/pkg/cli/audit_concurrency_test.go index 9198ab85b09..08880644e91 100644 --- a/pkg/cli/audit_concurrency_test.go +++ b/pkg/cli/audit_concurrency_test.go @@ -35,3 +35,28 @@ func TestRunAuditAnalysisSoftFailuresRemainNonFatal(t *testing.T) { t.Fatal("expected setter not to be called on soft failure") } } + +func TestRunAuditAnalysisReturnsCancellationForSoftFailuresWhenContextCanceled(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + g, gctx := errgroup.WithContext(ctx) + called := false + started := make(chan struct{}) + + runAuditAnalysis(g, gctx, false, "test", "test warning", func(v int) { + called = true + }, func() (int, error) { + close(started) + <-gctx.Done() + return 0, errors.New("soft failure") + }) + + <-started + cancel() + + if err := g.Wait(); !errors.Is(err, context.Canceled) { + t.Fatalf("expected context canceled error for canceled context soft failure, got %v", err) + } + if called { + t.Fatal("expected setter not to be called when context is canceled") + } +}