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 @@