Skip to content

Add running with falure status #35025

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions models/actions/run_job.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion models/actions/run_job_status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
38 changes: 22 additions & 16 deletions models/actions/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
22 changes: 19 additions & 3 deletions modules/commitstatus/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -56,26 +58,40 @@ 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++
}
}
if successCnt > 0 && successCnt == len(css) {
return CommitStatusSuccess
}
if hasFailure {
if hasRunning {
return CommitStatusRunningWithFailure
}
return CommitStatusFailure
}
return CommitStatusPending
}
1 change: 1 addition & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions public/assets/img/svg/gitea-running-with-failure.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions templates/repo/actions/status.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -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}}
Expand Down
1 change: 1 addition & 0 deletions templates/repo/actions/view_component.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -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"}}"
Expand Down
3 changes: 3 additions & 0 deletions templates/repo/commit_status.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -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}}
5 changes: 3 additions & 2 deletions web_src/js/components/ActionRunStatus.vue
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<!-- This vue should be kept the same as templates/repo/actions/status.tmpl
Please also update the template file above if this vue is modified.
action status accepted: success, skipped, waiting, blocked, running, failure, cancelled, unknown
action status accepted: success, skipped, waiting, blocked, running, running_with_failure, failure, cancelled, unknown
-->
<script lang="ts" setup>
import {SvgIcon} from '../svg.ts';

withDefaults(defineProps<{
status: 'success' | 'skipped' | 'waiting' | 'blocked' | 'running' | 'failure' | 'cancelled' | 'unknown',
status: 'success' | 'skipped' | 'waiting' | 'blocked' | 'running' | 'running_with_failure' | 'failure' | 'cancelled' | 'unknown',
size?: number,
className?: string,
localeStatus?: string,
Expand All @@ -25,6 +25,7 @@ withDefaults(defineProps<{
<SvgIcon name="octicon-clock" class="text yellow" :size="size" :class="className" v-else-if="status === 'waiting'"/>
<SvgIcon name="octicon-blocked" class="text yellow" :size="size" :class="className" v-else-if="status === 'blocked'"/>
<SvgIcon name="octicon-meter" class="text yellow" :size="size" :class="'circular-spin ' + className" v-else-if="status === 'running'"/>
<SvgIcon name="gitea-running-with-failure" class="text yellow" :size="size" :class="'circular-spin ' + className" v-else-if="status === 'running_with_failure'"/>
<SvgIcon name="octicon-x-circle-fill" class="text red" :size="size" v-else/><!-- failure, unknown -->
</span>
</template>
1 change: 1 addition & 0 deletions web_src/js/features/repo-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export function initRepositoryActionView() {
cancelled: el.getAttribute('data-locale-status-cancelled'),
skipped: el.getAttribute('data-locale-status-skipped'),
blocked: el.getAttribute('data-locale-status-blocked'),
running_with_failure: el.getAttribute('data-locale-status-running-with-failure'),
},
logsAlwaysAutoScroll: el.getAttribute('data-locale-logs-always-auto-scroll'),
logsAlwaysExpandRunning: el.getAttribute('data-locale-logs-always-expand-running'),
Expand Down
2 changes: 2 additions & 0 deletions web_src/js/svg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,14 @@ import octiconTrash from '../../public/assets/img/svg/octicon-trash.svg';
import octiconTriangleDown from '../../public/assets/img/svg/octicon-triangle-down.svg';
import octiconX from '../../public/assets/img/svg/octicon-x.svg';
import octiconXCircleFill from '../../public/assets/img/svg/octicon-x-circle-fill.svg';
import giteaRunningWithFailure from '../../public/assets/img/svg/gitea-running-with-failure.svg';

const svgs = {
'gitea-double-chevron-left': giteaDoubleChevronLeft,
'gitea-double-chevron-right': giteaDoubleChevronRight,
'gitea-empty-checkbox': giteaEmptyCheckbox,
'gitea-exclamation': giteaExclamation,
'gitea-running-with-failure': giteaRunningWithFailure,
'octicon-archive': octiconArchive,
'octicon-arrow-switch': octiconArrowSwitch,
'octicon-blocked': octiconBlocked,
Expand Down
Loading