Skip to content

Commit 22c4599

Browse files
authoredDec 16, 2024
Improve Actions status aggregations (#32860)
Make the result the same as GitHub: * all skipped, then result is skipped * any cancelled, then result cancelled
1 parent d28a484 commit 22c4599

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed
 

‎models/actions/run_job.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -153,20 +153,25 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col
153153
}
154154

155155
func AggregateJobStatus(jobs []*ActionRunJob) Status {
156-
allSuccessOrSkipped := true
157-
var hasFailure, hasCancelled, hasSkipped, hasWaiting, hasRunning, hasBlocked bool
156+
allSuccessOrSkipped := len(jobs) != 0
157+
allSkipped := len(jobs) != 0
158+
var hasFailure, hasCancelled, hasWaiting, hasRunning, hasBlocked bool
158159
for _, job := range jobs {
159160
allSuccessOrSkipped = allSuccessOrSkipped && (job.Status == StatusSuccess || job.Status == StatusSkipped)
161+
allSkipped = allSkipped && job.Status == StatusSkipped
160162
hasFailure = hasFailure || job.Status == StatusFailure
161163
hasCancelled = hasCancelled || job.Status == StatusCancelled
162-
hasSkipped = hasSkipped || job.Status == StatusSkipped
163164
hasWaiting = hasWaiting || job.Status == StatusWaiting
164165
hasRunning = hasRunning || job.Status == StatusRunning
165166
hasBlocked = hasBlocked || job.Status == StatusBlocked
166167
}
167168
switch {
169+
case allSkipped:
170+
return StatusSkipped
168171
case allSuccessOrSkipped:
169172
return StatusSuccess
173+
case hasCancelled:
174+
return StatusCancelled
170175
case hasFailure:
171176
return StatusFailure
172177
case hasRunning:
@@ -175,10 +180,6 @@ func AggregateJobStatus(jobs []*ActionRunJob) Status {
175180
return StatusWaiting
176181
case hasBlocked:
177182
return StatusBlocked
178-
case hasCancelled:
179-
return StatusCancelled
180-
case hasSkipped:
181-
return StatusSkipped
182183
default:
183184
return StatusUnknown // it shouldn't happen
184185
}

‎models/actions/run_job_status_test.go

+23-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
func TestAggregateJobStatus(t *testing.T) {
1313
testStatuses := func(expected Status, statuses []Status) {
14+
t.Helper()
1415
var jobs []*ActionRunJob
1516
for _, v := range statuses {
1617
jobs = append(jobs, &ActionRunJob{Status: v})
@@ -29,6 +30,16 @@ func TestAggregateJobStatus(t *testing.T) {
2930
statuses []Status
3031
expected Status
3132
}{
33+
// unknown cases, maybe it shouldn't happen in real world
34+
{[]Status{}, StatusUnknown},
35+
{[]Status{StatusUnknown, StatusSuccess}, StatusUnknown},
36+
{[]Status{StatusUnknown, StatusSkipped}, StatusUnknown},
37+
{[]Status{StatusUnknown, StatusFailure}, StatusFailure},
38+
{[]Status{StatusUnknown, StatusCancelled}, StatusCancelled},
39+
{[]Status{StatusUnknown, StatusWaiting}, StatusWaiting},
40+
{[]Status{StatusUnknown, StatusRunning}, StatusRunning},
41+
{[]Status{StatusUnknown, StatusBlocked}, StatusBlocked},
42+
3243
// success with other status
3344
{[]Status{StatusSuccess}, StatusSuccess},
3445
{[]Status{StatusSuccess, StatusSkipped}, StatusSuccess}, // skipped doesn't affect success
@@ -38,18 +49,28 @@ func TestAggregateJobStatus(t *testing.T) {
3849
{[]Status{StatusSuccess, StatusRunning}, StatusRunning},
3950
{[]Status{StatusSuccess, StatusBlocked}, StatusBlocked},
4051

52+
// any cancelled, then cancelled
53+
{[]Status{StatusCancelled}, StatusCancelled},
54+
{[]Status{StatusCancelled, StatusSuccess}, StatusCancelled},
55+
{[]Status{StatusCancelled, StatusSkipped}, StatusCancelled},
56+
{[]Status{StatusCancelled, StatusFailure}, StatusCancelled},
57+
{[]Status{StatusCancelled, StatusWaiting}, StatusCancelled},
58+
{[]Status{StatusCancelled, StatusRunning}, StatusCancelled},
59+
{[]Status{StatusCancelled, StatusBlocked}, StatusCancelled},
60+
4161
// failure with other status, fail fast
4262
// Should "running" win? Maybe no: old code does make "running" win, but GitHub does fail fast.
4363
{[]Status{StatusFailure}, StatusFailure},
4464
{[]Status{StatusFailure, StatusSuccess}, StatusFailure},
4565
{[]Status{StatusFailure, StatusSkipped}, StatusFailure},
46-
{[]Status{StatusFailure, StatusCancelled}, StatusFailure},
66+
{[]Status{StatusFailure, StatusCancelled}, StatusCancelled},
4767
{[]Status{StatusFailure, StatusWaiting}, StatusFailure},
4868
{[]Status{StatusFailure, StatusRunning}, StatusFailure},
4969
{[]Status{StatusFailure, StatusBlocked}, StatusFailure},
5070

5171
// skipped with other status
52-
{[]Status{StatusSkipped}, StatusSuccess},
72+
// TODO: need to clarify whether a PR with "skipped" job status is considered as "mergeable" or not.
73+
{[]Status{StatusSkipped}, StatusSkipped},
5374
{[]Status{StatusSkipped, StatusSuccess}, StatusSuccess},
5475
{[]Status{StatusSkipped, StatusFailure}, StatusFailure},
5576
{[]Status{StatusSkipped, StatusCancelled}, StatusCancelled},

0 commit comments

Comments
 (0)