summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-01-12 22:50:38 +0100
committerEarl Warren <contact@earl-warren.org>2024-03-25 16:25:02 +0100
commit3b3747ffe8ebd2b15001161b017e393b8121f50a (patch)
treed6360b01ef189966e5e4abd7bee80161c54a25c5 /modules
parentRevert "[ACTIONS] on.schedule: the event is always "schedule"" (diff)
downloadforgejo-3b3747ffe8ebd2b15001161b017e393b8121f50a.tar.xz
forgejo-3b3747ffe8ebd2b15001161b017e393b8121f50a.zip
Fix schedule tasks bugs (#28691)
Fix #28157 This PR fix the possible bugs about actions schedule. - Move `UpdateRepositoryUnit` and `SetRepoDefaultBranch` from models to service layer - Remove schedules plan from database and cancel waiting & running schedules tasks in this repository when actions unit has been disabled or global disabled. - Remove schedules plan from database and cancel waiting & running schedules tasks in this repository when default branch changed. (cherry picked from commit 97292da96048b036cbe36b3ea66503ac568a73e7) Conflicts: modules/actions/github.go routers/web/repo/setting/default_branch.go routers/web/repo/setting/setting.go services/repository/branch.go services/repository/setting.go tests/integration/actions_trigger_test.go
Diffstat (limited to 'modules')
-rw-r--r--modules/actions/github.go4
-rw-r--r--modules/actions/workflows.go24
-rw-r--r--modules/actions/workflows_test.go7
-rw-r--r--modules/webhook/type.go1
4 files changed, 26 insertions, 10 deletions
diff --git a/modules/actions/github.go b/modules/actions/github.go
index 278b7cb74c..749bcd7c89 100644
--- a/modules/actions/github.go
+++ b/modules/actions/github.go
@@ -22,6 +22,7 @@ const (
GithubEventRelease = "release"
GithubEventPullRequestComment = "pull_request_comment"
GithubEventGollum = "gollum"
+ GithubEventSchedule = "schedule"
)
// IsDefaultBranchWorkflow returns true if the event only triggers workflows on the default branch
@@ -115,6 +116,9 @@ func canGithubEventMatch(eventName string, triggedEvent webhook_module.HookEvent
return triggedEvent == webhook_module.HookEventIssueComment ||
triggedEvent == webhook_module.HookEventPullRequestComment
+ case GithubEventSchedule:
+ return triggedEvent == webhook_module.HookEventSchedule
+
default:
return eventName == string(triggedEvent)
}
diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go
index 60dd05f0bb..b0d53b83c7 100644
--- a/modules/actions/workflows.go
+++ b/modules/actions/workflows.go
@@ -22,7 +22,7 @@ import (
type DetectedWorkflow struct {
EntryName string
- TriggerEvent string
+ TriggerEvent *jobparser.Event
Content []byte
}
@@ -103,6 +103,7 @@ func DetectWorkflows(
commit *git.Commit,
triggedEvent webhook_module.HookEventType,
payload api.Payloader,
+ detectSchedule bool,
) ([]*DetectedWorkflow, []*DetectedWorkflow, error) {
entries, err := ListWorkflows(commit)
if err != nil {
@@ -117,6 +118,7 @@ func DetectWorkflows(
return nil, nil, err
}
+ // one workflow may have multiple events
events, err := GetEventsFromContent(content)
if err != nil {
log.Warn("ignore invalid workflow %q: %v", entry.Name(), err)
@@ -125,17 +127,18 @@ func DetectWorkflows(
for _, evt := range events {
log.Trace("detect workflow %q for event %#v matching %q", entry.Name(), evt, triggedEvent)
if evt.IsSchedule() {
- dwf := &DetectedWorkflow{
- EntryName: entry.Name(),
- TriggerEvent: evt.Name,
- Content: content,
+ if detectSchedule {
+ dwf := &DetectedWorkflow{
+ EntryName: entry.Name(),
+ TriggerEvent: evt,
+ Content: content,
+ }
+ schedules = append(schedules, dwf)
}
- schedules = append(schedules, dwf)
- }
- if detectMatched(gitRepo, commit, triggedEvent, payload, evt) {
+ } else if detectMatched(gitRepo, commit, triggedEvent, payload, evt) {
dwf := &DetectedWorkflow{
EntryName: entry.Name(),
- TriggerEvent: evt.Name,
+ TriggerEvent: evt,
Content: content,
}
workflows = append(workflows, dwf)
@@ -156,7 +159,8 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web
webhook_module.HookEventCreate,
webhook_module.HookEventDelete,
webhook_module.HookEventFork,
- webhook_module.HookEventWiki:
+ webhook_module.HookEventWiki,
+ webhook_module.HookEventSchedule:
if len(evt.Acts()) != 0 {
log.Warn("Ignore unsupported %s event arguments %v", triggedEvent, evt.Acts())
}
diff --git a/modules/actions/workflows_test.go b/modules/actions/workflows_test.go
index 2d57f19488..c8e1e553fe 100644
--- a/modules/actions/workflows_test.go
+++ b/modules/actions/workflows_test.go
@@ -118,6 +118,13 @@ func TestDetectMatched(t *testing.T) {
yamlOn: "on: gollum",
expected: true,
},
+ {
+ desc: "HookEventSchedue(schedule) matches GithubEventSchedule(schedule)",
+ triggedEvent: webhook_module.HookEventSchedule,
+ payload: nil,
+ yamlOn: "on: schedule",
+ expected: true,
+ },
}
for _, tc := range testCases {
diff --git a/modules/webhook/type.go b/modules/webhook/type.go
index 7f427f2ea8..0d2aef5e15 100644
--- a/modules/webhook/type.go
+++ b/modules/webhook/type.go
@@ -31,6 +31,7 @@ const (
HookEventRepository HookEventType = "repository"
HookEventRelease HookEventType = "release"
HookEventPackage HookEventType = "package"
+ HookEventSchedule HookEventType = "schedule"
)
// Event returns the HookEventType as an event string