summaryrefslogtreecommitdiffstats
path: root/services/actions
diff options
context:
space:
mode:
authorZettat123 <zettat123@gmail.com>2024-01-31 22:55:12 +0800
committerGitHub <noreply@github.com>2024-01-31 14:55:12 +0000
commitadc3598a755b43e3911266d7fa575c121e16613d (patch)
treeba5982153851b0b1267daae8d1a152d85448cd22 /services/actions
parent0b1a42ce0f7f8e22d7905bde803d60444c9a9f0b (diff)
downloadgitea-adc3598a755b43e3911266d7fa575c121e16613d.tar.gz
gitea-adc3598a755b43e3911266d7fa575c121e16613d.zip
Fix an actions schedule bug (#28942)
In #28691, schedule plans will be deleted when a repo's actions unit is disabled. But when the unit is enabled, the schedule plans won't be created again. This PR fixes the bug. The schedule plans will be created again when the actions unit is re-enabled
Diffstat (limited to 'services/actions')
-rw-r--r--services/actions/notifier_helper.go32
-rw-r--r--services/actions/schedule_tasks.go12
2 files changed, 42 insertions, 2 deletions
diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go
index 9900de3d2e..77173e58a3 100644
--- a/services/actions/notifier_helper.go
+++ b/services/actions/notifier_helper.go
@@ -474,3 +474,35 @@ func handleSchedules(
return actions_model.CreateScheduleTask(ctx, crons)
}
+
+// DetectAndHandleSchedules detects the schedule workflows on the default branch and create schedule tasks
+func DetectAndHandleSchedules(ctx context.Context, repo *repo_model.Repository) error {
+ gitRepo, err := gitrepo.OpenRepository(context.Background(), repo)
+ if err != nil {
+ return fmt.Errorf("git.OpenRepository: %w", err)
+ }
+ defer gitRepo.Close()
+
+ // Only detect schedule workflows on the default branch
+ commit, err := gitRepo.GetCommit(repo.DefaultBranch)
+ if err != nil {
+ return fmt.Errorf("gitRepo.GetCommit: %w", err)
+ }
+ scheduleWorkflows, err := actions_module.DetectScheduledWorkflows(gitRepo, commit)
+ if err != nil {
+ return fmt.Errorf("detect schedule workflows: %w", err)
+ }
+ if len(scheduleWorkflows) == 0 {
+ return nil
+ }
+
+ // We need a notifyInput to call handleSchedules
+ // Here we use the commit author as the Doer of the notifyInput
+ commitUser, err := user_model.GetUserByEmail(ctx, commit.Author.Email)
+ if err != nil {
+ return fmt.Errorf("get user by email: %w", err)
+ }
+ notifyInput := newNotifyInput(repo, commitUser, webhook_module.HookEventSchedule)
+
+ return handleSchedules(ctx, scheduleWorkflows, commit, notifyInput, repo.DefaultBranch)
+}
diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go
index e7aa4a39ac..79dd84e0cc 100644
--- a/services/actions/schedule_tasks.go
+++ b/services/actions/schedule_tasks.go
@@ -10,6 +10,7 @@ import (
actions_model "code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/db"
+ repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/timeutil"
@@ -65,8 +66,15 @@ func startTasks(ctx context.Context) error {
}
}
- cfg := row.Repo.MustGetUnit(ctx, unit.TypeActions).ActionsConfig()
- if cfg.IsWorkflowDisabled(row.Schedule.WorkflowID) {
+ cfg, err := row.Repo.GetUnit(ctx, unit.TypeActions)
+ if err != nil {
+ if repo_model.IsErrUnitTypeNotExist(err) {
+ // Skip the actions unit of this repo is disabled.
+ continue
+ }
+ return fmt.Errorf("GetUnit: %w", err)
+ }
+ if cfg.ActionsConfig().IsWorkflowDisabled(row.Schedule.WorkflowID) {
continue
}