]> source.dussan.org Git - gitea.git/commitdiff
Fix incorrect action duration time when rerun the job before executed once (#28364)
authoryp05327 <576951401@qq.com>
Fri, 19 Jan 2024 14:05:49 +0000 (23:05 +0900)
committerGitHub <noreply@github.com>
Fri, 19 Jan 2024 14:05:49 +0000 (14:05 +0000)
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)

models/actions/run.go
models/migrations/migrations.go
models/migrations/v1_22/v285.go [new file with mode: 0644]
routers/web/repo/actions/view.go

index 1a3701b0b0aec3d6df29e59bf4ee8a70b461308c..fcac58d515c3b9882f19971aea673e0325ea43ca 100644 (file)
@@ -46,10 +46,13 @@ type ActionRun struct {
        TriggerEvent      string                       // the trigger event defined in the `on` configuration of the triggered workflow
        Status            Status                       `xorm:"index"`
        Version           int                          `xorm:"version default 0"` // Status could be updated concomitantly, so an optimistic lock is needed
-       Started           timeutil.TimeStamp
-       Stopped           timeutil.TimeStamp
-       Created           timeutil.TimeStamp `xorm:"created"`
-       Updated           timeutil.TimeStamp `xorm:"updated"`
+       // Started and Stopped is used for recording last run time, if rerun happened, they will be reset to 0
+       Started timeutil.TimeStamp
+       Stopped timeutil.TimeStamp
+       // PreviousDuration is used for recording previous duration
+       PreviousDuration time.Duration
+       Created          timeutil.TimeStamp `xorm:"created"`
+       Updated          timeutil.TimeStamp `xorm:"updated"`
 }
 
 func init() {
@@ -118,7 +121,7 @@ func (run *ActionRun) LoadAttributes(ctx context.Context) error {
 }
 
 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) {
index 3b4ac24a2c38794a1d4d38bdfbd26dc9df0cc632..21675cab8ae17aa662a782c025b9ff4c8ca79d4f 100644 (file)
@@ -554,6 +554,8 @@ var migrations = []Migration{
        NewMigration("Add combined Index to issue_user.uid and issue_id", v1_22.AddCombinedIndexToIssueUser),
        // v284 -> v285
        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
diff --git a/models/migrations/v1_22/v285.go b/models/migrations/v1_22/v285.go
new file mode 100644 (file)
index 0000000..c0dacd4
--- /dev/null
@@ -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{})
+}
index 1cdae32a32fefb2a2ae52bdffb850fcc530108f6..9cda30d23dc70e6be4c08f235f735ea2dfeee177 100644 (file)
@@ -279,6 +279,17 @@ func Rerun(ctx *context_module.Context) {
                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)
        if ctx.Written() {
                return