fix(atlas): treat skipped jobs as OK in run aggregate
CD / Detect unsubstituted template (push) Successful in 1s
CD / Lint / Test / Vet (push) Successful in 4s
CD / Build & Import (push) Successful in 13s
CD / Deploy via GitOps (push) Has been skipped

Tag-push runs skip the deploy job (deploy is main-only), so runs with a skipped
job were mislabelled "running" in the timeline. Skipped now counts as completed-
OK; only genuinely in-progress states aggregate to running. Test-first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-20 07:48:30 +02:00
co-authored by Claude Opus 4.8
parent 995e428eba
commit 3e28dcf69f
2 changed files with 16 additions and 6 deletions
+6 -6
View File
@@ -73,20 +73,20 @@ func RecentRuns(tasksJSON []byte, n int) ([]RunDot, error) {
// aggregateState folds per-job outcomes into a run outcome.
func aggregateState(jobs []Job) string {
allSucceeded := true
pending := false
for _, j := range jobs {
switch j.State() {
case "failure", "cancelled", "error":
return "failure"
case "success":
case "success", "skipped": // completed OK — skipped (e.g. deploy on a tag push) doesn't block
default:
allSucceeded = false
pending = true // running / in_progress / waiting / queued / unknown
}
}
if allSucceeded {
return "success"
if pending {
return "running"
}
return "running"
return "success"
}
// LatestRunJobs parses a Gitea `/actions/tasks` response (per-job entries,
+10
View File
@@ -89,6 +89,16 @@ func TestRecentRuns_GroupsRunsNewestFirstWithAggregateState(t *testing.T) {
}
}
func TestRunState_SkippedJobsCountAsOK(t *testing.T) {
// A tag-push run skips the deploy job; the run still succeeded.
s := atlas.RunSummary{Jobs: []atlas.Job{
{Status: "skipped"}, {Status: "success"}, {Status: "success"},
}}
if s.State() != "success" {
t.Fatalf("skipped+success run state = %q, want success", s.State())
}
}
func TestLatestRunJobs_ErrorsWhenEmpty(t *testing.T) {
if _, err := atlas.LatestRunJobs([]byte(`{"workflow_runs":[]}`)); err == nil {
t.Fatal("expected error on empty, got nil")