feat: record job needs

This commit is contained in:
Jason Song 2022-11-04 11:40:39 +08:00
parent 234cdc67e1
commit cf40dca0c4
7 changed files with 17 additions and 14 deletions

View File

@ -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 {

View File

@ -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"`

View File

@ -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})

View File

@ -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

View File

@ -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
}

View File

@ -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"`

View File

@ -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 {