Fix incorrect action duration time when rerun the job before executed once (#28364)
Fix #28323 Reason was mentioned here: https://github.com/go-gitea/gitea/issues/28323#issuecomment-1841867298 ### Changes: (maybe breaking) We can rerun jobs in Gitea, so there will be some problems in calculating duration time. In this PR, I use the exist `Started` and `Stopped` column to record the last run time instead of the total time, and add a new `PreviousDuration` column to record the previous duration time. You can also check the cost time of last run: ![image](https://github.com/go-gitea/gitea/assets/18380374/2ca39145-2c92-401a-b78b-43164f7ae061)
This commit is contained in:
parent
461d8b53c2
commit
07ba4d9f87
4 changed files with 39 additions and 5 deletions
|
@ -46,10 +46,13 @@ type ActionRun struct {
|
||||||
TriggerEvent string // the trigger event defined in the `on` configuration of the triggered workflow
|
TriggerEvent string // the trigger event defined in the `on` configuration of the triggered workflow
|
||||||
Status Status `xorm:"index"`
|
Status Status `xorm:"index"`
|
||||||
Version int `xorm:"version default 0"` // Status could be updated concomitantly, so an optimistic lock is needed
|
Version int `xorm:"version default 0"` // Status could be updated concomitantly, so an optimistic lock is needed
|
||||||
Started timeutil.TimeStamp
|
// Started and Stopped is used for recording last run time, if rerun happened, they will be reset to 0
|
||||||
Stopped timeutil.TimeStamp
|
Started timeutil.TimeStamp
|
||||||
Created timeutil.TimeStamp `xorm:"created"`
|
Stopped timeutil.TimeStamp
|
||||||
Updated timeutil.TimeStamp `xorm:"updated"`
|
// PreviousDuration is used for recording previous duration
|
||||||
|
PreviousDuration time.Duration
|
||||||
|
Created timeutil.TimeStamp `xorm:"created"`
|
||||||
|
Updated timeutil.TimeStamp `xorm:"updated"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -118,7 +121,7 @@ func (run *ActionRun) LoadAttributes(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (run *ActionRun) Duration() time.Duration {
|
func (run *ActionRun) Duration() time.Duration {
|
||||||
return calculateDuration(run.Started, run.Stopped, run.Status)
|
return calculateDuration(run.Started, run.Stopped, run.Status) + run.PreviousDuration
|
||||||
}
|
}
|
||||||
|
|
||||||
func (run *ActionRun) GetPushEventPayload() (*api.PushPayload, error) {
|
func (run *ActionRun) GetPushEventPayload() (*api.PushPayload, error) {
|
||||||
|
|
|
@ -554,6 +554,8 @@ var migrations = []Migration{
|
||||||
NewMigration("Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser),
|
NewMigration("Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser),
|
||||||
// v284 -> v285
|
// v284 -> v285
|
||||||
NewMigration("Add ignore stale approval column on branch table", v1_22.AddIgnoreStaleApprovalsColumnToProtectedBranchTable),
|
NewMigration("Add ignore stale approval column on branch table", v1_22.AddIgnoreStaleApprovalsColumnToProtectedBranchTable),
|
||||||
|
// v285 -> v286
|
||||||
|
NewMigration("Add PreviousDuration to ActionRun", v1_22.AddPreviousDurationToActionRun),
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCurrentDBVersion returns the current db version
|
// GetCurrentDBVersion returns the current db version
|
||||||
|
|
18
models/migrations/v1_22/v285.go
Normal file
18
models/migrations/v1_22/v285.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package v1_22 //nolint
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"xorm.io/xorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AddPreviousDurationToActionRun(x *xorm.Engine) error {
|
||||||
|
type ActionRun struct {
|
||||||
|
PreviousDuration time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
return x.Sync(&ActionRun{})
|
||||||
|
}
|
|
@ -279,6 +279,17 @@ func Rerun(ctx *context_module.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset run's start and stop time when it is done
|
||||||
|
if run.Status.IsDone() {
|
||||||
|
run.PreviousDuration = run.Duration()
|
||||||
|
run.Started = 0
|
||||||
|
run.Stopped = 0
|
||||||
|
if err := actions_model.UpdateRun(ctx, run, "started", "stopped", "previous_duration"); err != nil {
|
||||||
|
ctx.Error(http.StatusInternalServerError, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
job, jobs := getRunJobs(ctx, runIndex, jobIndex)
|
job, jobs := getRunJobs(ctx, runIndex, jobIndex)
|
||||||
if ctx.Written() {
|
if ctx.Written() {
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in a new issue