diff --git a/models/actions/run_job.go b/models/actions/run_job.go index bad895036d16f..93ea43d7006d2 100644 --- a/models/actions/run_job.go +++ b/models/actions/run_job.go @@ -186,6 +186,9 @@ func AggregateJobStatus(jobs []*ActionRunJob) Status { case hasCancelled: return StatusCancelled case hasRunning: + if hasFailure { + return StatusRunningWithFailure + } return StatusRunning case hasFailure: return StatusFailure diff --git a/models/actions/run_job_status_test.go b/models/actions/run_job_status_test.go index 2a5eb00a6f808..282d1b63aeab7 100644 --- a/models/actions/run_job_status_test.go +++ b/models/actions/run_job_status_test.go @@ -65,7 +65,7 @@ func TestAggregateJobStatus(t *testing.T) { {[]Status{StatusFailure, StatusSkipped}, StatusFailure}, {[]Status{StatusFailure, StatusCancelled}, StatusCancelled}, {[]Status{StatusFailure, StatusWaiting}, StatusFailure}, - {[]Status{StatusFailure, StatusRunning}, StatusRunning}, + {[]Status{StatusFailure, StatusRunning}, StatusRunningWithFailure}, {[]Status{StatusFailure, StatusBlocked}, StatusFailure}, // skipped with other status diff --git a/models/actions/status.go b/models/actions/status.go index 2b1d70613c71b..f4bd21cb5f1e5 100644 --- a/models/actions/status.go +++ b/models/actions/status.go @@ -15,25 +15,27 @@ import ( type Status int const ( - StatusUnknown Status = iota // 0, consistent with runnerv1.Result_RESULT_UNSPECIFIED - StatusSuccess // 1, consistent with runnerv1.Result_RESULT_SUCCESS - StatusFailure // 2, consistent with runnerv1.Result_RESULT_FAILURE - StatusCancelled // 3, consistent with runnerv1.Result_RESULT_CANCELLED - StatusSkipped // 4, consistent with runnerv1.Result_RESULT_SKIPPED - StatusWaiting // 5, isn't a runnerv1.Result - StatusRunning // 6, isn't a runnerv1.Result - StatusBlocked // 7, isn't a runnerv1.Result + StatusUnknown Status = iota // 0, consistent with runnerv1.Result_RESULT_UNSPECIFIED + StatusSuccess // 1, consistent with runnerv1.Result_RESULT_SUCCESS + StatusFailure // 2, consistent with runnerv1.Result_RESULT_FAILURE + StatusCancelled // 3, consistent with runnerv1.Result_RESULT_CANCELLED + StatusSkipped // 4, consistent with runnerv1.Result_RESULT_SKIPPED + StatusWaiting // 5, isn't a runnerv1.Result + StatusRunning // 6, isn't a runnerv1.Result + StatusBlocked // 7, isn't a runnerv1.Result + StatusRunningWithFailure // 8, isn't a runnerv1.Result, used for aggregated status ) var statusNames = map[Status]string{ - StatusUnknown: "unknown", - StatusWaiting: "waiting", - StatusRunning: "running", - StatusSuccess: "success", - StatusFailure: "failure", - StatusCancelled: "cancelled", - StatusSkipped: "skipped", - StatusBlocked: "blocked", + StatusUnknown: "unknown", + StatusWaiting: "waiting", + StatusRunning: "running", + StatusSuccess: "success", + StatusFailure: "failure", + StatusCancelled: "cancelled", + StatusSkipped: "skipped", + StatusBlocked: "blocked", + StatusRunningWithFailure: "running_with_failure", } // String returns the string name of the Status @@ -88,6 +90,10 @@ func (s Status) IsBlocked() bool { return s == StatusBlocked } +func (s Status) IsRunningWithFailure() bool { + return s == StatusRunningWithFailure +} + // In returns whether s is one of the given statuses func (s Status) In(statuses ...Status) bool { return slices.Contains(statuses, s) diff --git a/modules/commitstatus/commit_status.go b/modules/commitstatus/commit_status.go index a0ab4e71862db..8031417b449b8 100644 --- a/modules/commitstatus/commit_status.go +++ b/modules/commitstatus/commit_status.go @@ -20,6 +20,8 @@ const ( CommitStatusWarning CommitStatusState = "warning" // CommitStatusSkipped is for when CommitStatus is Skipped CommitStatusSkipped CommitStatusState = "skipped" + // CommitStatusRunningWithFailure is for only aggregated commit status + CommitStatusRunningWithFailure CommitStatusState = "running_with_failure" ) func (css CommitStatusState) String() string { @@ -56,20 +58,28 @@ func (css CommitStatusState) IsSkipped() bool { return css == CommitStatusSkipped } +// IsRunningWithFailure represents if commit status state is running with failure +func (css CommitStatusState) IsRunningWithFailure() bool { + return css == CommitStatusRunningWithFailure +} + type CommitStatusStates []CommitStatusState //nolint:revive // export stutter // According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference // > Additionally, a combined state is returned. The state is one of: -// > failure if any of the contexts report as error or failure -// > pending if there are no statuses or a context is pending +// > failure if any of the contexts report as error or failure and no contexts are pending +// > pending if there are no statuses or a context is pending with no failure +// > running_with_failure if there are contexts that are pending and at least one context is failure // > success if the latest status for all contexts is success func (css CommitStatusStates) Combine() CommitStatusState { successCnt := 0 + hasRunning, hasFailure := false, false for _, state := range css { switch { case state.IsError() || state.IsFailure(): - return CommitStatusFailure + hasFailure = true case state.IsPending(): + hasRunning = true case state.IsSuccess() || state.IsWarning() || state.IsSkipped(): successCnt++ } @@ -77,5 +87,11 @@ func (css CommitStatusStates) Combine() CommitStatusState { if successCnt > 0 && successCnt == len(css) { return CommitStatusSuccess } + if hasFailure { + if hasRunning { + return CommitStatusRunningWithFailure + } + return CommitStatusFailure + } return CommitStatusPending } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 9a2591e9eedee..d93444d005750 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3787,6 +3787,7 @@ status.failure = "Failure" status.cancelled = "Canceled" status.skipped = "Skipped" status.blocked = "Blocked" +status.running_with_failure = "Running with failure" runners = Runners runners.runner_manage_panel = Runners Management diff --git a/public/assets/img/svg/gitea-running-with-failure.svg b/public/assets/img/svg/gitea-running-with-failure.svg new file mode 100644 index 0000000000000..01c1dfe39fd2b --- /dev/null +++ b/public/assets/img/svg/gitea-running-with-failure.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/templates/repo/actions/status.tmpl b/templates/repo/actions/status.tmpl index f2020bc160f69..e09a479d36c5d 100644 --- a/templates/repo/actions/status.tmpl +++ b/templates/repo/actions/status.tmpl @@ -17,6 +17,8 @@ {{svg "octicon-blocked" $size (printf "text yellow %s" $className)}} {{else if eq .status "running"}} {{svg "octicon-meter" $size (printf "text yellow circular-spin %s" $className)}} +{{else if eq .status "running_with_failure"}} + {{svg "gitea-running-with-failure" $size (printf "text yellow circular-spin %s" $className)}} {{else}}{{/*failure, unknown*/}} {{svg "octicon-x-circle-fill" $size (printf "text red %s" $className)}} {{end}} diff --git a/templates/repo/actions/view_component.tmpl b/templates/repo/actions/view_component.tmpl index 4e338ffcfc584..c8573c2fe512a 100644 --- a/templates/repo/actions/view_component.tmpl +++ b/templates/repo/actions/view_component.tmpl @@ -18,6 +18,7 @@ data-locale-status-cancelled="{{ctx.Locale.Tr "actions.status.cancelled"}}" data-locale-status-skipped="{{ctx.Locale.Tr "actions.status.skipped"}}" data-locale-status-blocked="{{ctx.Locale.Tr "actions.status.blocked"}}" + data-locale-status-running-with-failure="{{ctx.Locale.Tr "actions.status.running_with_failure"}}" data-locale-artifacts-title="{{ctx.Locale.Tr "artifacts"}}" data-locale-artifact-expired="{{ctx.Locale.Tr "expired"}}" data-locale-confirm-delete-artifact="{{ctx.Locale.Tr "confirm_delete_artifact"}}" diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl index 7184f5f8eb6de..929dd5a11519f 100644 --- a/templates/repo/commit_status.tmpl +++ b/templates/repo/commit_status.tmpl @@ -17,3 +17,6 @@ {{if eq .State "skipped"}} {{svg "octicon-skip" 18 "commit-status icon text grey"}} {{end}} +{{if eq .State "running_with_failure"}} + {{svg "gitea-running-with-failure" 18 "commit-status icon text red"}} +{{end}} diff --git a/web_src/js/components/ActionRunStatus.vue b/web_src/js/components/ActionRunStatus.vue index bc3b99ab893e3..54a6d47e6ba4c 100644 --- a/web_src/js/components/ActionRunStatus.vue +++ b/web_src/js/components/ActionRunStatus.vue @@ -1,12 +1,12 @@