From 7497155d14c50564bcbd82df7daa2aaa4768aa24 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Wed, 12 Oct 2022 15:39:27 +0800 Subject: [PATCH] feat: update step state --- models/bots/task.go | 74 ++++++++++++++++++++++++------- models/bots/task_step.go | 7 +++ routers/api/bots/runner/runner.go | 5 ++- 3 files changed, 69 insertions(+), 17 deletions(-) diff --git a/models/bots/task.go b/models/bots/task.go index 6a31214330..3420c8a811 100644 --- a/models/bots/task.go +++ b/models/bots/task.go @@ -20,7 +20,8 @@ import ( type Task struct { ID int64 JobID int64 - Job *RunJob `xorm:"-"` + Job *RunJob `xorm:"-"` + Steps []*TaskStep `xorm:"-"` Attempt int64 RunnerID int64 `xorm:"index"` LogToFile bool // read log from database or from storage @@ -40,7 +41,7 @@ func (Task) TableName() string { return "bots_task" } -// LoadAttributes load Job if not loaded +// LoadAttributes load Job Steps if not loaded func (task *Task) LoadAttributes(ctx context.Context) error { if task == nil { return nil @@ -53,8 +54,19 @@ func (task *Task) LoadAttributes(ctx context.Context) error { } task.Job = job } + if err := task.Job.LoadAttributes(ctx); err != nil { + return err + } - return task.Job.LoadAttributes(ctx) + if task.Steps == nil { // be careful, an empty slice (not nil) also means loaded + steps, err := GetTaskStepsByTaskID(ctx, task.ID) + if err != nil { + return err + } + task.Steps = steps + } + + return nil } func CreateTaskForRunner(runner *Runner) (*Task, bool, error) { @@ -71,7 +83,7 @@ func CreateTaskForRunner(runner *Runner) (*Task, bool, error) { // TODO: a more efficient way to filter labels var job *RunJob - labels := append([]string{}, append(runner.AgentLabels, runner.CustomLabels...)...) + labels := append(runner.AgentLabels, runner.CustomLabels...) for _, v := range jobs { if isSubset(labels, v.RunsOn) { job = v @@ -118,6 +130,7 @@ func CreateTaskForRunner(runner *Runner) (*Task, bool, error) { if err := db.Insert(ctx, steps); err != nil { return nil, false, err } + task.Steps = steps job.TaskID = task.ID if _, err := db.GetEngine(ctx).ID(job.ID).Update(job); err != nil { @@ -137,17 +150,48 @@ func CreateTaskForRunner(runner *Runner) (*Task, bool, error) { } func UpdateTask(state *runnerv1.TaskState) error { - //ctx, commiter, err := db.TxContext() - //if err != nil { - // return err - //} - //defer commiter.Close() - // - //task := &Task{ - // ID: state.Id, - // Result: state.Result, - // Stopped: timeutil.TimeStamp(state.StoppedAt.AsTime().Unix()), - //} + stepStates := map[int64]*runnerv1.StepState{} + for _, v := range state.Steps { + stepStates[v.Id] = v + } + + ctx, commiter, err := db.TxContext() + if err != nil { + return err + } + defer commiter.Close() + + task := &Task{} + if _, err := db.GetEngine(ctx).ID(state.Id).Get(task); err != nil { + return err + } + + task.Result = state.Result + task.Stopped = timeutil.TimeStamp(state.StoppedAt.AsTime().Unix()) + + if _, err := db.GetEngine(ctx).ID(task.ID).Update(task); err != nil { + return err + } + + if err := task.LoadAttributes(ctx); err != nil { + return err + } + + for _, step := range task.Steps { + if v, ok := stepStates[step.Number]; ok { + step.Result = v.Result + step.LogIndex = v.LogIndex + step.LogLength = v.LogLength + if _, err := db.GetEngine(ctx).ID(step.ID).Update(step); err != nil { + return err + } + } + } + + if err := commiter.Commit(); err != nil { + return err + } + return nil } diff --git a/models/bots/task_step.go b/models/bots/task_step.go index 8bd2f9f304..3cd7d1973f 100644 --- a/models/bots/task_step.go +++ b/models/bots/task_step.go @@ -5,6 +5,8 @@ package bots import ( + "context" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/timeutil" runnerv1 "gitea.com/gitea/proto-go/runner/v1" @@ -32,3 +34,8 @@ func (TaskStep) TableName() string { func init() { db.RegisterModel(new(TaskStep)) } + +func GetTaskStepsByTaskID(ctx context.Context, taskID int64) ([]*TaskStep, error) { + var steps []*TaskStep + return steps, db.GetEngine(ctx).Where("task_id=?", taskID).OrderBy("number").Find(&steps) +} diff --git a/routers/api/bots/runner/runner.go b/routers/api/bots/runner/runner.go index 96c42106d7..3d35c94304 100644 --- a/routers/api/bots/runner/runner.go +++ b/routers/api/bots/runner/runner.go @@ -166,8 +166,9 @@ func (s *Service) UpdateTask( ) (*connect.Response[runnerv1.UpdateTaskResponse], error) { res := connect.NewResponse(&runnerv1.UpdateTaskResponse{}) - // to debug - log.Info("task state: %+v", req.Msg.State) + if err := bots_model.UpdateTask(req.Msg.State); err != nil { + return nil, status.Errorf(codes.Internal, "update task: %v", err) + } return res, nil }