Skip to content

Commit 5424793

Browse files
committed
feat: refactor schedule tasks management in actions service
- Remove `robfig/cron/v3 v3.0.1` from `go.mod` - Remove `newSchedule()` and `resetSchedule()` functions from `services/actions/init.go` - Change return type of `CreateScheduleTask()` from `(int, error)` to `error` in `services/actions/notifier_helper.go` - Add `services/actions/schedule_tasks.go` file - Add `StartScheduleTasks()` and `startTasks()` functions to `services/actions/schedule_tasks.go` - Register `start_schedule_tasks` task in `services/cron/tasks_actions.go` Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
1 parent 054873b commit 5424793

File tree

7 files changed

+91
-109
lines changed

7 files changed

+91
-109
lines changed

go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ require (
8989
github.com/pquerna/otp v1.4.0
9090
github.com/prometheus/client_golang v1.14.0
9191
github.com/quasoft/websspi v1.1.2
92-
github.com/robfig/cron/v3 v3.0.1
9392
github.com/santhosh-tekuri/jsonschema/v5 v5.2.0
9493
github.com/sergi/go-diff v1.3.1
9594
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546

go.sum

-2
Original file line numberDiff line numberDiff line change
@@ -1055,8 +1055,6 @@ github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
10551055
github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s=
10561056
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
10571057
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
1058-
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
1059-
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
10601058
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
10611059
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
10621060
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=

services/actions/init.go

-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,4 @@ func Init() {
1919
go graceful.GetManager().RunWithShutdownFns(jobEmitterQueue.Run)
2020

2121
notification.RegisterNotifier(NewNotifier())
22-
23-
// initial all schedule task
24-
newSchedule()
25-
resetSchedule()
2622
}

services/actions/notifier_helper.go

+29-39
Original file line numberDiff line numberDiff line change
@@ -105,39 +105,36 @@ func (input *notifyInput) Notify(ctx context.Context) {
105105
}
106106
}
107107

108-
func CreateScheduleTask(ctx context.Context, cron *actions_model.ActionSchedule, spec string) (int, error) {
109-
return schedule.AddFunc(spec, func() {
110-
run := &actions_model.ActionRun{
111-
Title: cron.Title,
112-
RepoID: cron.RepoID,
113-
OwnerID: cron.OwnerID,
114-
WorkflowID: cron.WorkflowID,
115-
TriggerUserID: cron.TriggerUserID,
116-
Ref: cron.Ref,
117-
CommitSHA: cron.CommitSHA,
118-
Event: cron.Event,
119-
EventPayload: cron.EventPayload,
120-
Status: actions_model.StatusWaiting,
121-
}
122-
jobs, err := jobparser.Parse(cron.Content)
123-
if err != nil {
124-
log.Error("jobparser.Parse: %v", err)
125-
return
126-
}
127-
if err := actions_model.InsertRun(ctx, run, jobs); err != nil {
128-
log.Error("InsertRun: %v", err)
129-
return
130-
}
131-
if jobs, _, err := actions_model.FindRunJobs(ctx, actions_model.FindRunJobOptions{RunID: run.ID}); err != nil {
132-
log.Error("FindRunJobs: %v", err)
133-
} else {
134-
for _, job := range jobs {
135-
if err := CreateCommitStatus(ctx, job); err != nil {
136-
log.Error("CreateCommitStatus: %v", err)
137-
}
108+
func CreateScheduleTask(ctx context.Context, cron *actions_model.ActionSchedule, spec string) error {
109+
run := &actions_model.ActionRun{
110+
Title: cron.Title,
111+
RepoID: cron.RepoID,
112+
OwnerID: cron.OwnerID,
113+
WorkflowID: cron.WorkflowID,
114+
TriggerUserID: cron.TriggerUserID,
115+
Ref: cron.Ref,
116+
CommitSHA: cron.CommitSHA,
117+
Event: cron.Event,
118+
EventPayload: cron.EventPayload,
119+
Status: actions_model.StatusWaiting,
120+
}
121+
jobs, err := jobparser.Parse(cron.Content)
122+
if err != nil {
123+
return err
124+
}
125+
if err := actions_model.InsertRun(ctx, run, jobs); err != nil {
126+
return err
127+
}
128+
if jobs, _, err := actions_model.FindRunJobs(ctx, actions_model.FindRunJobOptions{RunID: run.ID}); err != nil {
129+
return err
130+
} else {
131+
for _, job := range jobs {
132+
if err := CreateCommitStatus(ctx, job); err != nil {
133+
return err
138134
}
139135
}
140-
})
136+
}
137+
return nil
141138
}
142139

143140
func handleSchedules(
@@ -156,10 +153,6 @@ func handleSchedules(
156153
log.Error("FindCrons: %v", err)
157154
}
158155

159-
for _, row := range rows {
160-
schedule.Remove(row.EntryIDs)
161-
}
162-
163156
if len(rows) > 0 {
164157
if err := actions_model.DeleteScheduleTaskByRepo(ctx, input.Repo.ID); err != nil {
165158
log.Error("DeleteCronTaskByRepo: %v", err)
@@ -209,15 +202,12 @@ func handleSchedules(
209202

210203
if len(crons) > 0 {
211204
for _, cron := range crons {
212-
entryIDs := []int{}
213205
for _, spec := range cron.Specs {
214-
id, err := CreateScheduleTask(ctx, cron, spec)
206+
err := CreateScheduleTask(ctx, cron, spec)
215207
if err != nil {
216208
continue
217209
}
218-
entryIDs = append(entryIDs, id)
219210
}
220-
cron.EntryIDs = entryIDs
221211
}
222212

223213
if err := actions_model.CreateScheduleTask(ctx, crons); err != nil {

services/actions/schedule.go

-63
This file was deleted.

services/actions/schedule_tasks.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package actions
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"time"
10+
11+
actions_model "code.gitea.io/gitea/models/actions"
12+
"code.gitea.io/gitea/modules/log"
13+
14+
"github.com/gogs/cron"
15+
)
16+
17+
// StartScheduleTasks start the task
18+
func StartScheduleTasks(ctx context.Context) error {
19+
return startTasks(ctx, actions_model.FindSpecOptions{
20+
GetAll: true,
21+
})
22+
}
23+
24+
func startTasks(ctx context.Context, opts actions_model.FindSpecOptions) error {
25+
specs, count, err := actions_model.FindSpecs(ctx, opts)
26+
if err != nil {
27+
return fmt.Errorf("find specs: %w", err)
28+
}
29+
if count == 0 {
30+
return nil
31+
}
32+
33+
now := time.Now()
34+
for _, row := range specs {
35+
schedule, err := cron.Parse(row.Spec)
36+
if err != nil {
37+
log.Error("ParseSpec: %v", err)
38+
continue
39+
}
40+
41+
next := schedule.Next(now)
42+
if next.Sub(now) <= 60 {
43+
if err := CreateScheduleTask(ctx, row.Schedule, row.Spec); err != nil {
44+
log.Error("CreateScheduleTask: %v", err)
45+
}
46+
}
47+
48+
}
49+
50+
return nil
51+
}

services/cron/tasks_actions.go

+11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ func initActionsTasks() {
1818
registerStopZombieTasks()
1919
registerStopEndlessTasks()
2020
registerCancelAbandonedJobs()
21+
registerScheduleTasks()
22+
}
23+
24+
func registerScheduleTasks() {
25+
RegisterTaskFatal("start_schedule_tasks", &BaseConfig{
26+
Enabled: true,
27+
RunAtStart: true,
28+
Schedule: "@every 1m",
29+
}, func(ctx context.Context, _ *user_model.User, cfg Config) error {
30+
return actions_service.StartScheduleTasks(ctx)
31+
})
2132
}
2233

2334
func registerStopZombieTasks() {

0 commit comments

Comments
 (0)