From c1fce2cf7d32f99a4cb74812d4c829a1813c8a00 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Tue, 29 Nov 2022 16:25:58 +0800 Subject: [PATCH] feat: remove bots resources after deleting repo --- models/bots/task.go | 1 + models/bots/task_step.go | 1 + models/migrations/v-dev.go | 1 + modules/bots/log.go | 16 +++++++++++ services/bots/bots.go | 48 +++++++++++++++++++++++++++++++ services/repository/repository.go | 6 ++++ 6 files changed, 73 insertions(+) diff --git a/models/bots/task.go b/models/bots/task.go index 3ea3aa93b5..dc1d8a5b20 100644 --- a/models/bots/task.go +++ b/models/bots/task.go @@ -365,6 +365,7 @@ func CreateTaskForRunner(ctx context.Context, runner *BotRunner) (*BotTask, bool Name: v.String(), TaskID: task.ID, Number: int64(i), + RepoID: task.RepoID, Status: StatusWaiting, } } diff --git a/models/bots/task_step.go b/models/bots/task_step.go index 9bb0d3fc37..95108fb62e 100644 --- a/models/bots/task_step.go +++ b/models/bots/task_step.go @@ -18,6 +18,7 @@ type BotTaskStep struct { Name string TaskID int64 `xorm:"index unique(task_number)"` Number int64 `xorm:"index unique(task_number)"` + RepoID int64 `xorm:"index"` Status Status `xorm:"index"` LogIndex int64 LogLength int64 diff --git a/models/migrations/v-dev.go b/models/migrations/v-dev.go index 970370971a..a44d6683d7 100644 --- a/models/migrations/v-dev.go +++ b/models/migrations/v-dev.go @@ -134,6 +134,7 @@ func addBotTables(x *xorm.Engine) error { Name string TaskID int64 `xorm:"index unique(task_number)"` Number int64 `xorm:"index unique(task_number)"` + RepoID int64 `xorm:"index"` Status int `xorm:"index"` LogIndex int64 LogLength int64 diff --git a/modules/bots/log.go b/modules/bots/log.go index fd08637b98..ef0e20a9ce 100644 --- a/modules/bots/log.go +++ b/modules/bots/log.go @@ -110,6 +110,22 @@ func TransferLogs(ctx context.Context, filename string) (func(), error) { return remove, nil } +func RemoveLogs(ctx context.Context, inStorage bool, filename string) error { + if !inStorage { + name := DBFSPrefix + filename + err := dbfs.Remove(ctx, name) + if err != nil { + return fmt.Errorf("dbfs remove %q: %w", name, err) + } + return nil + } + err := storage.Bots.Delete(filename) + if err != nil { + return fmt.Errorf("storage delete %q: %w", filename, err) + } + return nil +} + func openLogs(ctx context.Context, inStorage bool, filename string) (io.ReadSeekCloser, error) { if !inStorage { name := DBFSPrefix + filename diff --git a/services/bots/bots.go b/services/bots/bots.go index db7a2d1522..86102f5650 100644 --- a/services/bots/bots.go +++ b/services/bots/bots.go @@ -5,7 +5,15 @@ package bots import ( + "context" + "fmt" + + bots_model "code.gitea.io/gitea/models/bots" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + 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" ) @@ -13,3 +21,43 @@ func Init() { jobEmitterQueue = queue.CreateUniqueQueue("bots_ready_job", jobEmitterQueueHandle, new(jobUpdate)) go graceful.GetManager().RunWithShutdownFns(jobEmitterQueue.Run) } + +func DeleteResourceOfRepository(ctx context.Context, repo *repo_model.Repository) error { + tasks, _, err := bots_model.FindTasks(ctx, bots_model.FindTaskOptions{RepoID: repo.ID}) + if err != nil { + return fmt.Errorf("find task of repo %v: %w", repo.ID, err) + } + + if err := db.WithTx(ctx, func(ctx context.Context) error { + e := db.GetEngine(ctx) + if _, err := e.Delete(&bots_model.BotTaskStep{RepoID: repo.ID}); err != nil { + return fmt.Errorf("delete bots task steps of repo %d: %w", repo.ID, err) + } + if _, err := e.Delete(&bots_model.BotTask{RepoID: repo.ID}); err != nil { + return fmt.Errorf("delete bots tasks of repo %d: %w", repo.ID, err) + } + if _, err := e.Delete(&bots_model.BotRunJob{RepoID: repo.ID}); err != nil { + return fmt.Errorf("delete bots run jobs of repo %d: %w", repo.ID, err) + } + if _, err := e.Delete(&bots_model.BotRun{RepoID: repo.ID}); err != nil { + return fmt.Errorf("delete bots runs of repo %d: %w", repo.ID, err) + } + if _, err := e.Delete(&bots_model.BotRunner{RepoID: repo.ID}); err != nil { + return fmt.Errorf("delete bots runner of repo %d: %w", repo.ID, err) + } + return nil + }); err != nil { + return err + } + + // remove logs file after tasks have been deleted, to avoid new log files + for _, task := range tasks { + err := bots_module.RemoveLogs(ctx, task.LogInStorage, task.LogFilename) + if err != nil { + log.Error("remove log file %q: %v", task.LogFilename, err) + // go on + } + } + + return nil +} diff --git a/services/repository/repository.go b/services/repository/repository.go index 859c32cf8f..e1832aff07 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -20,6 +20,7 @@ import ( "code.gitea.io/gitea/modules/notification" repo_module "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/setting" + bots_service "code.gitea.io/gitea/services/bots" pull_service "code.gitea.io/gitea/services/pull" ) @@ -51,6 +52,11 @@ func DeleteRepository(ctx context.Context, doer *user_model.User, repo *repo_mod return err } + // deletes bots resource after the repo has been deleted, to avoid new bots tasks + if err := bots_service.DeleteResourceOfRepository(ctx, repo); err != nil { + log.Error("delete bots resource failed: %v", err) + } + return packages_model.UnlinkRepositoryFromAllPackages(ctx, repo.ID) }