From 564937a657e6f0561a46379578c11e468f9abb01 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Tue, 29 Nov 2022 18:21:27 +0800 Subject: [PATCH] feat: bots_service.CreateCommitStatus --- routers/api/bots/runner/runner.go | 32 ++----------- services/bots/bots.go | 78 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 28 deletions(-) diff --git a/routers/api/bots/runner/runner.go b/routers/api/bots/runner/runner.go index 7b22caba2a..3ffcbfd092 100644 --- a/routers/api/bots/runner/runner.go +++ b/routers/api/bots/runner/runner.go @@ -11,8 +11,6 @@ import ( "time" bots_model "code.gitea.io/gitea/models/bots" - git_model "code.gitea.io/gitea/models/git" - user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/bots" "code.gitea.io/gitea/modules/json" @@ -20,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" bot_service "code.gitea.io/gitea/services/bots" + bots_service "code.gitea.io/gitea/services/bots" secret_service "code.gitea.io/gitea/services/secrets" runnerv1 "code.gitea.io/bots-proto-go/runner/v1" @@ -177,32 +176,9 @@ func (s *Service) UpdateTask( return nil, status.Errorf(codes.Internal, "load run: %v", err) } - if task.Job.Run.Event == webhook.HookEventPush { - payload, err := task.Job.Run.GetPushEventPayload() - if err != nil { - return nil, status.Errorf(codes.Internal, "GetPushEventPayload: %v", err) - } - - creator, err := user_model.GetUserByID(payload.Pusher.ID) - if err != nil { - return nil, status.Errorf(codes.Internal, "GetUserByID: %v", err) - } - - if err := git_model.NewCommitStatus(git_model.NewCommitStatusOptions{ - Repo: task.Job.Run.Repo, - SHA: payload.HeadCommit.ID, - Creator: creator, - CommitStatus: &git_model.CommitStatus{ - SHA: payload.HeadCommit.ID, - TargetURL: task.Job.Run.HTMLURL(), - Description: "", - Context: task.Job.Name, - CreatorID: payload.Pusher.ID, - State: toCommitStatus(task.Job.Status), - }, - }); err != nil { - log.Error("Update commit status failed: %v", err) - } + if err := bots_service.CreateCommitStatus(ctx, task); err != nil { + log.Error("Update commit status failed: %v", err) + // go on } if req.Msg.State.Result != runnerv1.Result_RESULT_UNSPECIFIED { diff --git a/services/bots/bots.go b/services/bots/bots.go index 86102f5650..ede2f1c9c3 100644 --- a/services/bots/bots.go +++ b/services/bots/bots.go @@ -10,11 +10,15 @@ import ( bots_model "code.gitea.io/gitea/models/bots" "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/models/webhook" bots_module "code.gitea.io/gitea/modules/bots" "code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/queue" + api "code.gitea.io/gitea/modules/structs" ) func Init() { @@ -61,3 +65,77 @@ func DeleteResourceOfRepository(ctx context.Context, repo *repo_model.Repository return nil } + +func CreateCommitStatus(ctx context.Context, task *bots_model.BotTask) error { + if err := task.LoadJob(ctx); err != nil { + return fmt.Errorf("load job: %w", err) + } + if err := task.Job.LoadAttributes(ctx); err != nil { + return fmt.Errorf("load run: %w", err) + } + + if task.Job.Run.Event != webhook.HookEventPush { + return nil + } + + payload, err := task.Job.Run.GetPushEventPayload() + if err != nil { + return fmt.Errorf("GetPushEventPayload: %w", err) + } + + creator, err := user_model.GetUserByID(payload.Pusher.ID) + if err != nil { + return fmt.Errorf("GetUserByID: %w", err) + } + + repo := task.Job.Run.Repo + sha := payload.HeadCommit.ID + ctxname := task.Job.Name + state := toCommitStatus(task.Job.Status) + + if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptions{}); err != nil { + return fmt.Errorf("GetLatestCommitStatus: %w", err) + } else { + for _, status := range statuses { + if status.Context == ctxname { + if status.State == state { + return nil + } + break + } + } + } + + if err := git_model.NewCommitStatus(git_model.NewCommitStatusOptions{ + Repo: repo, + SHA: payload.HeadCommit.ID, + Creator: creator, + CommitStatus: &git_model.CommitStatus{ + SHA: sha, + TargetURL: task.Job.Run.HTMLURL(), + Description: "", + Context: ctxname, + CreatorID: payload.Pusher.ID, + State: state, + }, + }); err != nil { + return fmt.Errorf("NewCommitStatus: %w", err) + } + + return nil +} + +func toCommitStatus(status bots_model.Status) api.CommitStatusState { + switch status { + case bots_model.StatusSuccess: + return api.CommitStatusSuccess + case bots_model.StatusFailure, bots_model.StatusCancelled, bots_model.StatusSkipped: + return api.CommitStatusFailure + case bots_model.StatusWaiting, bots_model.StatusBlocked: + return api.CommitStatusPending + case bots_model.StatusRunning: + return api.CommitStatusRunning + default: + return api.CommitStatusError + } +}