mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Backport #28286 by @yp05327 Mentioned: [#28277](https://github.com/go-gitea/gitea/issues/28277#issuecomment-1831325276) We should only check online runner when detecting matching runners in workflows, as if runner is not online, the workflow will not run.  Co-authored-by: yp05327 <576951401@qq.com>
This commit is contained in:
		@@ -51,6 +51,11 @@ type ActionRunner struct {
 | 
				
			|||||||
	Deleted timeutil.TimeStamp `xorm:"deleted"`
 | 
						Deleted timeutil.TimeStamp `xorm:"deleted"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						RunnerOfflineTime = time.Minute
 | 
				
			||||||
 | 
						RunnerIdleTime    = 10 * time.Second
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BelongsToOwnerName before calling, should guarantee that all attributes are loaded
 | 
					// BelongsToOwnerName before calling, should guarantee that all attributes are loaded
 | 
				
			||||||
func (r *ActionRunner) BelongsToOwnerName() string {
 | 
					func (r *ActionRunner) BelongsToOwnerName() string {
 | 
				
			||||||
	if r.RepoID != 0 {
 | 
						if r.RepoID != 0 {
 | 
				
			||||||
@@ -76,11 +81,12 @@ func (r *ActionRunner) BelongsToOwnerType() types.OwnerType {
 | 
				
			|||||||
	return types.OwnerTypeSystemGlobal
 | 
						return types.OwnerTypeSystemGlobal
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// if the logic here changed, you should also modify FindRunnerOptions.ToCond
 | 
				
			||||||
func (r *ActionRunner) Status() runnerv1.RunnerStatus {
 | 
					func (r *ActionRunner) Status() runnerv1.RunnerStatus {
 | 
				
			||||||
	if time.Since(r.LastOnline.AsTime()) > time.Minute {
 | 
						if time.Since(r.LastOnline.AsTime()) > RunnerOfflineTime {
 | 
				
			||||||
		return runnerv1.RunnerStatus_RUNNER_STATUS_OFFLINE
 | 
							return runnerv1.RunnerStatus_RUNNER_STATUS_OFFLINE
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if time.Since(r.LastActive.AsTime()) > 10*time.Second {
 | 
						if time.Since(r.LastActive.AsTime()) > RunnerIdleTime {
 | 
				
			||||||
		return runnerv1.RunnerStatus_RUNNER_STATUS_IDLE
 | 
							return runnerv1.RunnerStatus_RUNNER_STATUS_IDLE
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return runnerv1.RunnerStatus_RUNNER_STATUS_ACTIVE
 | 
						return runnerv1.RunnerStatus_RUNNER_STATUS_ACTIVE
 | 
				
			||||||
@@ -153,6 +159,7 @@ type FindRunnerOptions struct {
 | 
				
			|||||||
	OwnerID       int64
 | 
						OwnerID       int64
 | 
				
			||||||
	Sort          string
 | 
						Sort          string
 | 
				
			||||||
	Filter        string
 | 
						Filter        string
 | 
				
			||||||
 | 
						IsOnline      util.OptionalBool
 | 
				
			||||||
	WithAvailable bool // not only runners belong to, but also runners can be used
 | 
						WithAvailable bool // not only runners belong to, but also runners can be used
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -178,6 +185,12 @@ func (opts FindRunnerOptions) toCond() builder.Cond {
 | 
				
			|||||||
	if opts.Filter != "" {
 | 
						if opts.Filter != "" {
 | 
				
			||||||
		cond = cond.And(builder.Like{"name", opts.Filter})
 | 
							cond = cond.And(builder.Like{"name", opts.Filter})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if opts.IsOnline.IsTrue() {
 | 
				
			||||||
 | 
							cond = cond.And(builder.Gt{"last_online": time.Now().Add(-RunnerOfflineTime).Unix()})
 | 
				
			||||||
 | 
						} else if opts.IsOnline.IsFalse() {
 | 
				
			||||||
 | 
							cond = cond.And(builder.Lte{"last_online": time.Now().Add(-RunnerOfflineTime).Unix()})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return cond
 | 
						return cond
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3520,7 +3520,7 @@ runs.commit = Commit
 | 
				
			|||||||
runs.scheduled = Scheduled
 | 
					runs.scheduled = Scheduled
 | 
				
			||||||
runs.pushed_by = pushed by
 | 
					runs.pushed_by = pushed by
 | 
				
			||||||
runs.invalid_workflow_helper = Workflow config file is invalid. Please check your config file: %s
 | 
					runs.invalid_workflow_helper = Workflow config file is invalid. Please check your config file: %s
 | 
				
			||||||
runs.no_matching_runner_helper = No matching runner: %s
 | 
					runs.no_matching_online_runner_helper = No matching online runner with label: %s
 | 
				
			||||||
runs.actor = Actor
 | 
					runs.actor = Actor
 | 
				
			||||||
runs.status = Status
 | 
					runs.status = Status
 | 
				
			||||||
runs.actors_no_select = All actors
 | 
					runs.actors_no_select = All actors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ import (
 | 
				
			|||||||
	"code.gitea.io/gitea/modules/context"
 | 
						"code.gitea.io/gitea/modules/context"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/git"
 | 
						"code.gitea.io/gitea/modules/git"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/setting"
 | 
						"code.gitea.io/gitea/modules/setting"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/modules/util"
 | 
				
			||||||
	"code.gitea.io/gitea/routers/web/repo"
 | 
						"code.gitea.io/gitea/routers/web/repo"
 | 
				
			||||||
	"code.gitea.io/gitea/services/convert"
 | 
						"code.gitea.io/gitea/services/convert"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -77,6 +78,7 @@ func List(ctx *context.Context) {
 | 
				
			|||||||
		// Get all runner labels
 | 
							// Get all runner labels
 | 
				
			||||||
		opts := actions_model.FindRunnerOptions{
 | 
							opts := actions_model.FindRunnerOptions{
 | 
				
			||||||
			RepoID:        ctx.Repo.Repository.ID,
 | 
								RepoID:        ctx.Repo.Repository.ID,
 | 
				
			||||||
 | 
								IsOnline:      util.OptionalBoolTrue,
 | 
				
			||||||
			WithAvailable: true,
 | 
								WithAvailable: true,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		runners, err := actions_model.FindRunners(ctx, opts)
 | 
							runners, err := actions_model.FindRunners(ctx, opts)
 | 
				
			||||||
@@ -114,7 +116,7 @@ func List(ctx *context.Context) {
 | 
				
			|||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					if !allRunnerLabels.Contains(ro) {
 | 
										if !allRunnerLabels.Contains(ro) {
 | 
				
			||||||
						workflow.ErrMsg = ctx.Locale.Tr("actions.runs.no_matching_runner_helper", ro)
 | 
											workflow.ErrMsg = ctx.Locale.Tr("actions.runs.no_matching_online_runner_helper", ro)
 | 
				
			||||||
						break
 | 
											break
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user