Persist partial analysis artifact results
This commit is contained in:
@@ -253,6 +253,7 @@ func executeStages(ctx context.Context, cfg *config.Config, stages []stage.Stage
|
||||
skipped := make([]string, 0, len(decisions))
|
||||
for _, d := range decisions {
|
||||
s := d.Stage
|
||||
stageEnv.Force = opts.Force
|
||||
runNames = append(runNames, s.Name())
|
||||
d.Action = decideStageAction(s, m, opts.Force)
|
||||
|
||||
@@ -305,6 +306,7 @@ func executeStages(ctx context.Context, cfg *config.Config, stages []stage.Stage
|
||||
}
|
||||
executed = append(executed, s.Name())
|
||||
priorOutcome := capturePriorStageOutcome(m, s.Name())
|
||||
priorAnalyzeState := captureAnalyzeState(m, s.Name())
|
||||
|
||||
now := nowUTC()
|
||||
runManifest.SetStageAction(s.Name(), manifest.RunStageActionRun, now)
|
||||
@@ -339,10 +341,23 @@ func executeStages(ctx context.Context, cfg *config.Config, stages []stage.Stage
|
||||
env.Logger.Debug("manifest saved", "stage", s.Name(), "transition", "running", "path", manifestPath)
|
||||
|
||||
result, err := s.Run(ctx, stageEnv, m)
|
||||
var analyzeProjection *validatedAnalyzeProjection
|
||||
if err == nil {
|
||||
err = validateStageResult(result)
|
||||
if err == nil {
|
||||
analyzeProjection, err = validateSuccessfulAnalyzeProjection(s.Name(), result)
|
||||
}
|
||||
} else if result != nil && result.AnalyzeState != nil {
|
||||
var projectionErr error
|
||||
analyzeProjection, projectionErr = validateFailedAnalyzeProjection(s.Name(), result)
|
||||
if projectionErr != nil {
|
||||
err = errors.Join(err, projectionErr)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if analyzeProjection != nil {
|
||||
applyAnalyzeProjection(m, runManifest, analyzeProjection)
|
||||
}
|
||||
failedAt := nowUTC()
|
||||
m.MarkStageFailed(s.Name(), failedAt, err.Error())
|
||||
if _, invalidationErr := invalidateDependentSucceededStagesWithReason(m, s.Name(), failedAt, staleReasonFailure); invalidationErr != nil {
|
||||
@@ -389,9 +404,15 @@ func executeStages(ctx context.Context, cfg *config.Config, stages []stage.Stage
|
||||
continue
|
||||
}
|
||||
|
||||
outputs := mapResultOutputs(s.Name(), result, runID)
|
||||
sessionOutputs := mapResultOutputs(s.Name(), result, runID)
|
||||
runOutputs := sessionOutputs
|
||||
if analyzeProjection != nil {
|
||||
sessionOutputs = analyzeProjectionOutputs(analyzeProjection.session, "")
|
||||
runOutputs = analyzeProjectionOutputs(analyzeProjection.invocation, runID)
|
||||
}
|
||||
succeededAt := nowUTC()
|
||||
m.MarkStageSucceeded(s.Name(), succeededAt, outputs)
|
||||
m.MarkStageSucceeded(s.Name(), succeededAt, sessionOutputs)
|
||||
applyAnalyzeProjection(m, runManifest, analyzeProjection)
|
||||
applyStageResultToManifest(m, s.Name(), result)
|
||||
if !priorOutcome.exists || priorOutcome.status != manifest.StatusSucceeded {
|
||||
if _, err := invalidateDependentSucceededStagesWithReason(m, s.Name(), succeededAt, staleReasonChangedResult); err != nil {
|
||||
@@ -403,12 +424,22 @@ func executeStages(ctx context.Context, cfg *config.Config, stages []stage.Stage
|
||||
}
|
||||
|
||||
if err := env.ManifestStore.Save(ctx, manifestPath, m); err != nil {
|
||||
operationErr := fmt.Errorf("save manifest after stage %q: %w", s.Name(), err)
|
||||
if analyzeProjection != nil {
|
||||
restoreAnalyzeState(m, priorAnalyzeState)
|
||||
failedAt := nowUTC()
|
||||
m.MarkStageFailed(s.Name(), failedAt, operationErr.Error())
|
||||
if _, invalidationErr := invalidateDependentSucceededStagesWithReason(m, s.Name(), failedAt, staleReasonFailure); invalidationErr != nil {
|
||||
operationErr = errors.Join(operationErr, fmt.Errorf("invalidate dependents after analyze projection persistence failure: %w", invalidationErr))
|
||||
}
|
||||
runManifest.MarkStageFailed(s.Name(), failedAt, operationErr.Error())
|
||||
}
|
||||
return nil, persistTerminalFailure(
|
||||
ctx, env.ManifestStore, manifestPath, m, runManifestStore, runManifestPath, runManifest,
|
||||
fmt.Errorf("save manifest after stage %q: %w", s.Name(), err),
|
||||
operationErr,
|
||||
)
|
||||
}
|
||||
runManifest.MarkStageSucceeded(s.Name(), succeededAt, outputs)
|
||||
runManifest.MarkStageSucceeded(s.Name(), succeededAt, runOutputs)
|
||||
applyStageResultToRunManifest(runManifest, s.Name(), result)
|
||||
identity.applyToRunManifest(runManifest, manifestPath)
|
||||
if err := runManifestStore.SaveRun(ctx, runManifestPath, runManifest); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user