mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	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: 
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user