Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix an actions schedule bug (#28942) #28999

Merged
merged 2 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions modules/actions/workflows.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,41 @@ func DetectWorkflows(
return workflows, schedules, nil
}

func DetectScheduledWorkflows(gitRepo *git.Repository, commit *git.Commit) ([]*DetectedWorkflow, error) {
entries, err := ListWorkflows(commit)
if err != nil {
return nil, err
}

wfs := make([]*DetectedWorkflow, 0, len(entries))
for _, entry := range entries {
content, err := GetContentFromEntry(entry)
if err != nil {
return 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)
continue
}
for _, evt := range events {
if evt.IsSchedule() {
log.Trace("detect scheduled workflow: %q", entry.Name())
dwf := &DetectedWorkflow{
EntryName: entry.Name(),
TriggerEvent: evt,
Content: content,
}
wfs = append(wfs, dwf)
}
}
}

return wfs, nil
}

func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) bool {
if !canGithubEventMatch(evt.Name, triggedEvent) {
return false
Expand Down
4 changes: 2 additions & 2 deletions routers/api/v1/repo/wiki.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ func getWikiPage(ctx *context.APIContext, wikiName wiki_service.WebPath) *api.Wi
}

return &api.WikiPage{
WikiPageMetaData: convert.ToWikiPageMetaData(wikiName, lastCommit, ctx.Repo.Repository),
WikiPageMetaData: wiki_service.ToWikiPageMetaData(wikiName, lastCommit, ctx.Repo.Repository),
ContentBase64: content,
CommitCount: commitsCount,
Sidebar: sidebarContent,
Expand Down Expand Up @@ -326,7 +326,7 @@ func ListWikiPages(ctx *context.APIContext) {
ctx.Error(http.StatusInternalServerError, "WikiFilenameToName", err)
return
}
pages = append(pages, convert.ToWikiPageMetaData(wikiName, c, ctx.Repo.Repository))
pages = append(pages, wiki_service.ToWikiPageMetaData(wikiName, c, ctx.Repo.Repository))
}

ctx.SetTotalCountHeader(int64(len(entries)))
Expand Down
32 changes: 32 additions & 0 deletions services/actions/notifier_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -447,3 +447,35 @@

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)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / backend

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / checks-backend

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-e2e

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-backend

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-backend

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-backend

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-backend

undefined: gitrepo (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-backend

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

undefined: gitrepo (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

undefined: gitrepo (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

undefined: gitrepo) (typecheck)

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-mssql

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-mysql5

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-sqlite

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-pgsql

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-mysql8

undefined: gitrepo

Check failure on line 453 in services/actions/notifier_helper.go

View workflow job for this annotation

GitHub Actions / test-unit

undefined: gitrepo
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)
}
12 changes: 10 additions & 2 deletions services/actions/schedule_tasks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
}

Expand Down
15 changes: 0 additions & 15 deletions services/convert/wiki.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ package convert
import (
"time"

repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/git"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
wiki_service "code.gitea.io/gitea/services/wiki"
)

// ToWikiCommit convert a git commit into a WikiCommit
Expand Down Expand Up @@ -46,15 +43,3 @@ func ToWikiCommitList(commits []*git.Commit, total int64) *api.WikiCommitList {
Count: total,
}
}

// ToWikiPageMetaData converts meta information to a WikiPageMetaData
func ToWikiPageMetaData(wikiName wiki_service.WebPath, lastCommit *git.Commit, repo *repo_model.Repository) *api.WikiPageMetaData {
subURL := string(wikiName)
_, title := wiki_service.WebPathToUserTitle(wikiName)
return &api.WikiPageMetaData{
Title: title,
HTMLURL: util.URLJoin(repo.HTMLURL(), "wiki", subURL),
SubURL: subURL,
LastCommit: ToWikiCommit(lastCommit),
}
}
10 changes: 10 additions & 0 deletions services/repository/setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/modules/log"
actions_service "code.gitea.io/gitea/services/actions"

Check failure on line 15 in services/repository/setting.go

View workflow job for this annotation

GitHub Actions / lint-backend

could not import code.gitea.io/gitea/services/actions (-: # code.gitea.io/gitea/services/actions

Check failure on line 15 in services/repository/setting.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

could not import code.gitea.io/gitea/services/actions (-: # code.gitea.io/gitea/services/actions

Check failure on line 15 in services/repository/setting.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

could not import code.gitea.io/gitea/services/actions (-: # code.gitea.io/gitea/services/actions
)

// UpdateRepositoryUnits updates a repository's units
Expand All @@ -33,6 +34,15 @@
}
}

for _, u := range units {
if u.Type == unit.TypeActions {
if err := actions_service.DetectAndHandleSchedules(ctx, repo); err != nil {
log.Error("DetectAndHandleSchedules: %v", err)
}
break
}
}

if _, err = db.GetEngine(ctx).Where("repo_id = ?", repo.ID).In("type", deleteUnitTypes).Delete(new(repo_model.RepoUnit)); err != nil {
return err
}
Expand Down
15 changes: 15 additions & 0 deletions services/wiki/wiki_path.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import (
"strings"

repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/git"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/services/convert"
)

// To define the wiki related concepts:
Expand Down Expand Up @@ -155,3 +158,15 @@ func UserTitleToWebPath(base, title string) WebPath {
}
return WebPath(title)
}

// ToWikiPageMetaData converts meta information to a WikiPageMetaData
func ToWikiPageMetaData(wikiName WebPath, lastCommit *git.Commit, repo *repo_model.Repository) *api.WikiPageMetaData {
subURL := string(wikiName)
_, title := WebPathToUserTitle(wikiName)
return &api.WikiPageMetaData{
Title: title,
HTMLURL: util.URLJoin(repo.HTMLURL(), "wiki", subURL),
SubURL: subURL,
LastCommit: convert.ToWikiCommit(lastCommit),
}
}
Loading