diff --git a/models/bots/run.go b/models/bots/run.go index bd7fab0ad7..c7755e83e3 100644 --- a/models/bots/run.go +++ b/models/bots/run.go @@ -14,10 +14,10 @@ import ( repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/webhook" - "code.gitea.io/gitea/modules/timeutil" api "code.gitea.io/gitea/modules/structs" - + "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" + "github.com/nektos/act/pkg/jobparser" "golang.org/x/exp/slices" ) @@ -167,15 +167,19 @@ func InsertRun(run *Run, jobs []*jobparser.SingleWorkflow) error { for _, v := range jobs { id, job := v.Job() payload, _ := v.Marshal() + needs := job.Needs() + status := StatusWaiting + if len(needs) > 0 { + status = StatusBlocked + } runJobs = append(runJobs, &RunJob{ RunID: run.ID, Name: job.Name, - Ready: true, // TODO: should be false if there are needs to satisfy WorkflowPayload: payload, JobID: id, - Needs: nil, // TODO: analyse needs + Needs: needs, RunsOn: job.RunsOn(), - Status: StatusWaiting, + Status: status, }) } if err := db.Insert(ctx, runJobs); err != nil { diff --git a/models/bots/run_job.go b/models/bots/run_job.go index af5271d219..f421ed6cfa 100644 --- a/models/bots/run_job.go +++ b/models/bots/run_job.go @@ -22,11 +22,10 @@ type RunJob struct { RunID int64 `xorm:"index"` Run *Run `xorm:"-"` Name string - Ready bool // ready to be executed Attempt int64 WorkflowPayload []byte JobID string // job id in workflow, not job's id - Needs []int64 `xorm:"JSON TEXT"` + Needs []string `xorm:"JSON TEXT"` RunsOn []string `xorm:"JSON TEXT"` TaskID int64 // the latest task of the job Status Status `xorm:"index"` diff --git a/models/bots/run_job_list.go b/models/bots/run_job_list.go index 2412666f9c..3685248982 100644 --- a/models/bots/run_job_list.go +++ b/models/bots/run_job_list.go @@ -16,14 +16,14 @@ type RunJobList []*RunJob type FindRunJobOptions struct { db.ListOptions - Status Status + Statuses []Status StartedBefore timeutil.TimeStamp } func (opts FindRunJobOptions) toConds() builder.Cond { cond := builder.NewCond() - if opts.Status > StatusUnknown { - cond = cond.And(builder.Eq{"status": opts.Status}) + if len(opts.Statuses) > 0 { + cond = cond.And(builder.In("status", opts.Statuses)) } if opts.StartedBefore > 0 { cond = cond.And(builder.Lt{"started": opts.StartedBefore}) diff --git a/models/bots/status.go b/models/bots/status.go index b80df074ee..bddbc17449 100644 --- a/models/bots/status.go +++ b/models/bots/status.go @@ -15,6 +15,7 @@ const ( StatusSkipped // 4, consistent with runnerv1.Result_RESULT_SKIPPED StatusWaiting // 5 StatusRunning // 6 + StatusBlocked // 7 ) // String returns the string name of the Status diff --git a/models/bots/task.go b/models/bots/task.go index cd4ba3ca92..edb4fa9d9c 100644 --- a/models/bots/task.go +++ b/models/bots/task.go @@ -242,7 +242,7 @@ func CreateTaskForRunner(ctx context.Context, runner *Runner) (*Task, bool, erro } var jobs []*RunJob - if err := e.Where("task_id=? AND ready=?", 0, true).And(jobCond).OrderBy("id").Find(&jobs); err != nil { + if err := e.Where("task_id=? AND status=?", 0, StatusWaiting).And(jobCond).Asc("id").Find(&jobs); err != nil { return nil, false, err } diff --git a/models/migrations/v-dev.go b/models/migrations/v-dev.go index 3485f29b83..64616ec258 100644 --- a/models/migrations/v-dev.go +++ b/models/migrations/v-dev.go @@ -71,11 +71,10 @@ func addBotTables(x *xorm.Engine) error { ID int64 RunID int64 `xorm:"index"` Name string - Ready bool // ready to be executed Attempt int64 WorkflowPayload []byte JobID string // job id in workflow, not job's id - Needs []int64 `xorm:"JSON TEXT"` + Needs []string `xorm:"JSON TEXT"` RunsOn []string `xorm:"JSON TEXT"` TaskID int64 // the latest task of the job Status int `xorm:"index"` diff --git a/services/bots/clear_tasks.go b/services/bots/clear_tasks.go index 04d6efe1ae..d6c59986ce 100644 --- a/services/bots/clear_tasks.go +++ b/services/bots/clear_tasks.go @@ -64,7 +64,7 @@ func StopEndlessTasks(ctx context.Context) error { // CancelAbandonedJobs cancels the jobs which have waiting status, but haven't been picked by a runner for a long time func CancelAbandonedJobs(ctx context.Context) error { jobs, _, err := bots_model.FindRunJobs(ctx, bots_model.FindRunJobOptions{ - Status: bots_model.StatusWaiting, + Statuses: []bots_model.Status{bots_model.StatusWaiting, bots_model.StatusBlocked}, StartedBefore: timeutil.TimeStamp(time.Now().Add(-abandonedJobTimeout).Unix()), }) if err != nil {