feat: bots_service.CreateCommitStatus

This commit is contained in:
Jason Song 2022-11-29 18:21:27 +08:00
parent 8f2efdaf60
commit 564937a657
No known key found for this signature in database
GPG Key ID: 8402EEEE4511A8B5
2 changed files with 82 additions and 28 deletions

View File

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

View File

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