mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-11-25 19:31:05 +00:00
Fix pipeline status calculation/reporting (#1898)
Closes #1895 Regression of #1784
This commit is contained in:
parent
e1c31df6c6
commit
cd982fcbd1
6 changed files with 32 additions and 9 deletions
|
@ -244,7 +244,7 @@ var flags = []cli.Flag{
|
||||||
EnvVars: []string{"WOODPECKER_STATUS_CONTEXT_FORMAT"},
|
EnvVars: []string{"WOODPECKER_STATUS_CONTEXT_FORMAT"},
|
||||||
Name: "status-context-format",
|
Name: "status-context-format",
|
||||||
Usage: "status context format",
|
Usage: "status context format",
|
||||||
Value: "{{ .context }}/{{ .event }}/{{ .pipeline }}",
|
Value: "{{ .context }}/{{ .event }}/{{ .workflow }}",
|
||||||
},
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
EnvVars: []string{"WOODPECKER_MIGRATIONS_ALLOW_LONG"},
|
EnvVars: []string{"WOODPECKER_MIGRATIONS_ALLOW_LONG"},
|
||||||
|
|
|
@ -302,6 +302,7 @@ func SetPipelineStepsOnPipeline(pipeline *model.Pipeline, pipelineItems []*Item)
|
||||||
PID: pidSequence,
|
PID: pidSequence,
|
||||||
PPID: item.Workflow.PID,
|
PPID: item.Workflow.PID,
|
||||||
State: model.StatusPending,
|
State: model.StatusPending,
|
||||||
|
Failure: step.Failure,
|
||||||
}
|
}
|
||||||
if item.Workflow.State == model.StatusSkipped {
|
if item.Workflow.State == model.StatusSkipped {
|
||||||
step.State = model.StatusSkipped
|
step.State = model.StatusSkipped
|
||||||
|
|
|
@ -26,6 +26,13 @@ type StepStore interface {
|
||||||
StepClear(*Pipeline) error
|
StepClear(*Pipeline) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Different ways to handle failure states
|
||||||
|
const (
|
||||||
|
FailureIgnore = "ignore"
|
||||||
|
FailureFail = "fail"
|
||||||
|
// FailureCancel = "cancel" // Not implemented yet
|
||||||
|
)
|
||||||
|
|
||||||
// Step represents a process in the pipeline.
|
// Step represents a process in the pipeline.
|
||||||
type Step struct {
|
type Step struct {
|
||||||
ID int64 `json:"id" xorm:"pk autoincr 'step_id'"`
|
ID int64 `json:"id" xorm:"pk autoincr 'step_id'"`
|
||||||
|
@ -36,6 +43,7 @@ type Step struct {
|
||||||
Name string `json:"name" xorm:"step_name"`
|
Name string `json:"name" xorm:"step_name"`
|
||||||
State StatusValue `json:"state" xorm:"step_state"`
|
State StatusValue `json:"state" xorm:"step_state"`
|
||||||
Error string `json:"error,omitempty" xorm:"VARCHAR(500) step_error"`
|
Error string `json:"error,omitempty" xorm:"VARCHAR(500) step_error"`
|
||||||
|
Failure string `json:"-" xorm:"step_failure"`
|
||||||
ExitCode int `json:"exit_code" xorm:"step_exit_code"`
|
ExitCode int `json:"exit_code" xorm:"step_exit_code"`
|
||||||
Started int64 `json:"start_time,omitempty" xorm:"step_started"`
|
Started int64 `json:"start_time,omitempty" xorm:"step_started"`
|
||||||
Stopped int64 `json:"end_time,omitempty" xorm:"step_stopped"`
|
Stopped int64 `json:"end_time,omitempty" xorm:"step_stopped"`
|
||||||
|
@ -57,5 +65,5 @@ func (p *Step) Running() bool {
|
||||||
|
|
||||||
// Failing returns true if the process state is failed, killed or error.
|
// Failing returns true if the process state is failed, killed or error.
|
||||||
func (p *Step) Failing() bool {
|
func (p *Step) Failing() bool {
|
||||||
return p.State == StatusError || p.State == StatusKilled || p.State == StatusFailure
|
return p.Failure == FailureFail && (p.State == StatusError || p.State == StatusKilled || p.State == StatusFailure)
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ func IsThereRunningStage(workflows []*Workflow) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// PipelineStatus determine pipeline status based on corresponding step list
|
// PipelineStatus determine pipeline status based on corresponding workflow list
|
||||||
func PipelineStatus(workflows []*Workflow) StatusValue {
|
func PipelineStatus(workflows []*Workflow) StatusValue {
|
||||||
status := StatusSuccess
|
status := StatusSuccess
|
||||||
|
|
||||||
|
@ -73,3 +73,17 @@ func PipelineStatus(workflows []*Workflow) StatusValue {
|
||||||
|
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WorkflowStatus determine workflow status based on corresponding step list
|
||||||
|
func WorkflowStatus(steps []*Step) StatusValue {
|
||||||
|
status := StatusSuccess
|
||||||
|
|
||||||
|
for _, p := range steps {
|
||||||
|
if p.Failing() {
|
||||||
|
status = p.State
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ func UpdateWorkflowStatusToDone(store model.UpdateWorkflowStore, workflow model.
|
||||||
if state.Started == 0 {
|
if state.Started == 0 {
|
||||||
workflow.State = model.StatusSkipped
|
workflow.State = model.StatusSkipped
|
||||||
} else {
|
} else {
|
||||||
workflow.State = model.StatusSuccess
|
workflow.State = model.WorkflowStatus(workflow.Children)
|
||||||
}
|
}
|
||||||
if workflow.Error != "" {
|
if workflow.Error != "" {
|
||||||
workflow.State = model.StatusFailure
|
workflow.State = model.StatusFailure
|
||||||
|
|
|
@ -20,7 +20,7 @@ import (
|
||||||
"github.com/woodpecker-ci/woodpecker/server/model"
|
"github.com/woodpecker-ci/woodpecker/server/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
type oldStep018 struct {
|
type oldStep020 struct {
|
||||||
ID int64 `xorm:"pk autoincr 'step_id'"`
|
ID int64 `xorm:"pk autoincr 'step_id'"`
|
||||||
PipelineID int64 `xorm:"UNIQUE(s) INDEX 'step_pipeline_id'"`
|
PipelineID int64 `xorm:"UNIQUE(s) INDEX 'step_pipeline_id'"`
|
||||||
PID int `xorm:"UNIQUE(s) 'step_pid'"`
|
PID int `xorm:"UNIQUE(s) 'step_pid'"`
|
||||||
|
@ -35,7 +35,7 @@ type oldStep018 struct {
|
||||||
Environ map[string]string `xorm:"json 'step_environ'"`
|
Environ map[string]string `xorm:"json 'step_environ'"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (oldStep018) TableName() string {
|
func (oldStep020) TableName() string {
|
||||||
return "steps"
|
return "steps"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,11 +47,11 @@ var parentStepsToWorkflows = task{
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// make sure the columns exist before removing them
|
// make sure the columns exist before removing them
|
||||||
if err := sess.Sync(new(oldStep018)); err != nil {
|
if err := sess.Sync(new(oldStep020)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentSteps []*oldStep018
|
var parentSteps []*oldStep020
|
||||||
err := sess.Where("step_ppid = ?", 0).Find(&parentSteps)
|
err := sess.Where("step_ppid = ?", 0).Find(&parentSteps)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -76,7 +76,7 @@ var parentStepsToWorkflows = task{
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = sess.Delete(&oldStep018{ID: p.ID})
|
_, err = sess.Delete(&oldStep020{ID: p.ID})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue