forked from gitea/gitea
		
	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:
		
							parent
							
								
									461d8b53c2
								
							
						
					
					
						commit
						07ba4d9f87
					
				| @ -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) { | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										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 | ||||
| 	} | ||||
| 
 | ||||
| 	// 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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 yp05327
						yp05327