From e47bba046c7d76dbd3b61afcc4e3e33baa9ec817 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 11 Mar 2025 05:45:42 +0800 Subject: [PATCH 1/2] Fix test code (#33829) Do not use onGiteaRun if there is no git operation --- .../api_activitypub_person_test.go | 53 +++-------- tests/integration/api_admin_org_test.go | 53 +++++------ tests/integration/api_nodeinfo_test.go | 34 +++---- tests/integration/org_count_test.go | 7 +- tests/integration/pull_commit_test.go | 4 + tests/integration/user_avatar_test.go | 91 +++++++++---------- 6 files changed, 107 insertions(+), 135 deletions(-) diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go index 75578094f5..17d628a483 100644 --- a/tests/integration/api_activitypub_person_test.go +++ b/tests/integration/api_activitypub_person_test.go @@ -7,28 +7,28 @@ import ( "fmt" "net/http" "net/http/httptest" - "net/url" "testing" "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/activitypub" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" ap "github.com/go-ap/activitypub" "github.com/stretchr/testify/assert" ) func TestActivityPubPerson(t *testing.T) { - setting.Federation.Enabled = true - testWebRoutes = routers.NormalRoutes() - defer func() { - setting.Federation.Enabled = false - testWebRoutes = routers.NormalRoutes() - }() + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + t.Run("ExistingPerson", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - onGiteaRun(t, func(*testing.T, *url.URL) { userID := 2 username := "user2" req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/user-id/%v", userID)) @@ -56,41 +56,18 @@ func TestActivityPubPerson(t *testing.T) { assert.NotNil(t, pubKeyPem) assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) }) -} - -func TestActivityPubMissingPerson(t *testing.T) { - setting.Federation.Enabled = true - testWebRoutes = routers.NormalRoutes() - defer func() { - setting.Federation.Enabled = false - testWebRoutes = routers.NormalRoutes() - }() - - onGiteaRun(t, func(*testing.T, *url.URL) { + t.Run("MissingPerson", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") resp := MakeRequest(t, req, http.StatusNotFound) assert.Contains(t, resp.Body.String(), "user does not exist") }) -} + t.Run("MissingPersonInbox", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + srv := httptest.NewServer(testWebRoutes) + defer srv.Close() + defer test.MockVariableValue(&setting.AppURL, srv.URL+"/")() -func TestActivityPubPersonInbox(t *testing.T) { - setting.Federation.Enabled = true - testWebRoutes = routers.NormalRoutes() - defer func() { - setting.Federation.Enabled = false - testWebRoutes = routers.NormalRoutes() - }() - - srv := httptest.NewServer(testWebRoutes) - defer srv.Close() - - onGiteaRun(t, func(*testing.T, *url.URL) { - appURL := setting.AppURL - setting.AppURL = srv.URL + "/" - defer func() { - setting.Database.LogSQL = false - setting.AppURL = appURL - }() username1 := "user1" ctx := t.Context() user1, err := user_model.GetUserByName(ctx, username1) diff --git a/tests/integration/api_admin_org_test.go b/tests/integration/api_admin_org_test.go index b243856127..b2d77456c4 100644 --- a/tests/integration/api_admin_org_test.go +++ b/tests/integration/api_admin_org_test.go @@ -5,7 +5,6 @@ package integration import ( "net/http" - "net/url" "strings" "testing" @@ -19,10 +18,12 @@ import ( ) func TestAPIAdminOrgCreate(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user1") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) + t.Run("CreateOrg", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() org := api.CreateOrgOption{ UserName: "user2_org", FullName: "User2's organization", @@ -51,13 +52,8 @@ func TestAPIAdminOrgCreate(t *testing.T) { FullName: org.FullName, }) }) -} - -func TestAPIAdminOrgCreateBadVisibility(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) - + t.Run("CreateBadVisibility", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() org := api.CreateOrgOption{ UserName: "user2_org", FullName: "User2's organization", @@ -70,22 +66,21 @@ func TestAPIAdminOrgCreateBadVisibility(t *testing.T) { AddTokenAuth(token) MakeRequest(t, req, http.StatusUnprocessableEntity) }) -} - -func TestAPIAdminOrgCreateNotAdmin(t *testing.T) { - defer tests.PrepareTestEnv(t)() - nonAdminUsername := "user2" - session := loginUser(t, nonAdminUsername) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeAll) - org := api.CreateOrgOption{ - UserName: "user2_org", - FullName: "User2's organization", - Description: "This organization created by admin for user2", - Website: "https://try.gitea.io", - Location: "Shanghai", - Visibility: "public", - } - req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). - AddTokenAuth(token) - MakeRequest(t, req, http.StatusForbidden) + t.Run("CreateNotAdmin", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + nonAdminUsername := "user2" + session := loginUser(t, nonAdminUsername) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeAll) + org := api.CreateOrgOption{ + UserName: "user2_org", + FullName: "User2's organization", + Description: "This organization created by admin for user2", + Website: "https://try.gitea.io", + Location: "Shanghai", + Visibility: "public", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). + AddTokenAuth(token) + MakeRequest(t, req, http.StatusForbidden) + }) } diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index 75f8dbb4ba..916c2f1723 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -5,35 +5,31 @@ package integration import ( "net/http" - "net/url" "testing" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestNodeinfo(t *testing.T) { - setting.Federation.Enabled = true - testWebRoutes = routers.NormalRoutes() - defer func() { - setting.Federation.Enabled = false - testWebRoutes = routers.NormalRoutes() - }() + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - onGiteaRun(t, func(*testing.T, *url.URL) { - req := NewRequest(t, "GET", "/api/v1/nodeinfo") - resp := MakeRequest(t, req, http.StatusOK) - VerifyJSONSchema(t, resp, "nodeinfo_2.1.json") + req := NewRequest(t, "GET", "/api/v1/nodeinfo") + resp := MakeRequest(t, req, http.StatusOK) + VerifyJSONSchema(t, resp, "nodeinfo_2.1.json") - var nodeinfo api.NodeInfo - DecodeJSON(t, resp, &nodeinfo) - assert.True(t, nodeinfo.OpenRegistrations) - assert.Equal(t, "gitea", nodeinfo.Software.Name) - assert.Equal(t, 29, nodeinfo.Usage.Users.Total) - assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) - assert.Equal(t, 3, nodeinfo.Usage.LocalComments) - }) + var nodeinfo api.NodeInfo + DecodeJSON(t, resp, &nodeinfo) + assert.True(t, nodeinfo.OpenRegistrations) + assert.Equal(t, "gitea", nodeinfo.Software.Name) + assert.Equal(t, 29, nodeinfo.Usage.Users.Total) + assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) + assert.Equal(t, 3, nodeinfo.Usage.LocalComments) } diff --git a/tests/integration/org_count_test.go b/tests/integration/org_count_test.go index 8a33c218be..fb71e690c2 100644 --- a/tests/integration/org_count_test.go +++ b/tests/integration/org_count_test.go @@ -4,7 +4,6 @@ package integration import ( - "net/url" "strings" "testing" @@ -14,15 +13,17 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestOrgCounts(t *testing.T) { - onGiteaRun(t, testOrgCounts) + defer tests.PrepareTestEnv(t)() + testOrgCounts(t) } -func testOrgCounts(t *testing.T, u *url.URL) { +func testOrgCounts(t *testing.T) { orgOwner := "user2" orgName := "testOrg" orgCollaborator := "user4" diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index fc111f528f..9f3b1a9ef5 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -8,12 +8,15 @@ import ( "testing" pull_service "code.gitea.io/gitea/services/pull" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestListPullCommits(t *testing.T) { + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user5") req := NewRequest(t, "GET", "/user2/repo1/pulls/3/commits/list") resp := session.MakeRequest(t, req, http.StatusOK) @@ -30,6 +33,7 @@ func TestListPullCommits(t *testing.T) { assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.LastReviewCommitSha) t.Run("CommitBlobExcerpt", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() req = NewRequest(t, "GET", "/user2/repo1/blob_excerpt/985f0301dba5e7b34be866819cd15ad3d8f508ee?last_left=0&last_right=0&left=2&right=2&left_hunk_size=2&right_hunk_size=2&path=README.md&style=split&direction=up") resp = session.MakeRequest(t, req, http.StatusOK) assert.Contains(t, resp.Body.String(), `# repo1`) diff --git a/tests/integration/user_avatar_test.go b/tests/integration/user_avatar_test.go index caca9a3e56..7b157e6e61 100644 --- a/tests/integration/user_avatar_test.go +++ b/tests/integration/user_avatar_test.go @@ -10,78 +10,77 @@ import ( "io" "mime/multipart" "net/http" - "net/url" "testing" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/avatar" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestUserAvatar(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org + defer tests.PrepareTestEnv(t)() + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org - seed := user2.Email - if len(seed) == 0 { - seed = user2.Name - } + seed := user2.Email + if len(seed) == 0 { + seed = user2.Name + } - img, err := avatar.RandomImage([]byte(seed)) - if err != nil { - assert.NoError(t, err) - return - } + img, err := avatar.RandomImage([]byte(seed)) + if err != nil { + assert.NoError(t, err) + return + } - session := loginUser(t, "user2") - csrf := GetUserCSRFToken(t, session) + session := loginUser(t, "user2") + csrf := GetUserCSRFToken(t, session) - imgData := &bytes.Buffer{} + imgData := &bytes.Buffer{} - body := &bytes.Buffer{} + body := &bytes.Buffer{} - // Setup multi-part - writer := multipart.NewWriter(body) - writer.WriteField("source", "local") - part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png") - if err != nil { - assert.NoError(t, err) - return - } + // Setup multi-part + writer := multipart.NewWriter(body) + writer.WriteField("source", "local") + part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png") + if err != nil { + assert.NoError(t, err) + return + } - if err := png.Encode(imgData, img); err != nil { - assert.NoError(t, err) - return - } + if err := png.Encode(imgData, img); err != nil { + assert.NoError(t, err) + return + } - if _, err := io.Copy(part, imgData); err != nil { - assert.NoError(t, err) - return - } + if _, err := io.Copy(part, imgData); err != nil { + assert.NoError(t, err) + return + } - if err := writer.Close(); err != nil { - assert.NoError(t, err) - return - } + if err := writer.Close(); err != nil { + assert.NoError(t, err) + return + } - req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body) - req.Header.Add("X-Csrf-Token", csrf) - req.Header.Add("Content-Type", writer.FormDataContentType()) + req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body) + req.Header.Add("X-Csrf-Token", csrf) + req.Header.Add("Content-Type", writer.FormDataContentType()) - session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) - user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org + user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org - req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0)) - _ = session.MakeRequest(t, req, http.StatusOK) + req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0)) + _ = session.MakeRequest(t, req, http.StatusOK) - testGetAvatarRedirect(t, user2) + testGetAvatarRedirect(t, user2) - // Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough. - }) + // Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough. } func testGetAvatarRedirect(t *testing.T, user *user_model.User) { From a92d5f65ce14f1f8d5e9a45f3c356a760c167e45 Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Mon, 10 Mar 2025 23:58:48 +0100 Subject: [PATCH 2/2] Fix auto concurrency cancellation skips commit status updates (#33764) * add missing commit status * conflicts with concurrency support Closes #33763 Co-authored-by: Giteabot --- models/actions/run.go | 20 ++++++++++++-------- models/actions/schedule.go | 13 +++++++------ routers/api/v1/repo/repo.go | 3 +-- routers/web/repo/setting/setting.go | 3 +-- services/actions/clear_tasks.go | 22 +++++++++++++++++++++- services/actions/notifier_helper.go | 6 +++--- services/actions/schedule_tasks.go | 2 +- services/actions/workflow.go | 2 +- services/repository/branch.go | 5 +++-- services/repository/setting.go | 3 +-- 10 files changed, 51 insertions(+), 28 deletions(-) diff --git a/models/actions/run.go b/models/actions/run.go index 60fbbcd323..89f7f3e640 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -194,7 +194,7 @@ func updateRepoRunsNumbers(ctx context.Context, repo *repo_model.Repository) err // CancelPreviousJobs cancels all previous jobs of the same repository, reference, workflow, and event. // It's useful when a new run is triggered, and all previous runs needn't be continued anymore. -func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID string, event webhook_module.HookEventType) error { +func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID string, event webhook_module.HookEventType) ([]*ActionRunJob, error) { // Find all runs in the specified repository, reference, and workflow with non-final status runs, total, err := db.FindAndCount[ActionRun](ctx, FindRunOptions{ RepoID: repoID, @@ -204,14 +204,16 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin Status: []Status{StatusRunning, StatusWaiting, StatusBlocked}, }) if err != nil { - return err + return nil, err } // If there are no runs found, there's no need to proceed with cancellation, so return nil. if total == 0 { - return nil + return nil, nil } + cancelledJobs := make([]*ActionRunJob, 0, total) + // Iterate over each found run and cancel its associated jobs. for _, run := range runs { // Find all jobs associated with the current run. @@ -219,7 +221,7 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin RunID: run.ID, }) if err != nil { - return err + return cancelledJobs, err } // Iterate over each job and attempt to cancel it. @@ -238,27 +240,29 @@ func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID strin // Update the job's status and stopped time in the database. n, err := UpdateRunJob(ctx, job, builder.Eq{"task_id": 0}, "status", "stopped") if err != nil { - return err + return cancelledJobs, err } // If the update affected 0 rows, it means the job has changed in the meantime, so we need to try again. if n == 0 { - return fmt.Errorf("job has changed, try again") + return cancelledJobs, fmt.Errorf("job has changed, try again") } + cancelledJobs = append(cancelledJobs, job) // Continue with the next job. continue } // If the job has an associated task, try to stop the task, effectively cancelling the job. if err := StopTask(ctx, job.TaskID, StatusCancelled); err != nil { - return err + return cancelledJobs, err } + cancelledJobs = append(cancelledJobs, job) } } // Return nil to indicate successful cancellation of all running and waiting jobs. - return nil + return cancelledJobs, nil } // InsertRun inserts a run diff --git a/models/actions/schedule.go b/models/actions/schedule.go index fcdc7c2a4c..2edf483fe0 100644 --- a/models/actions/schedule.go +++ b/models/actions/schedule.go @@ -117,21 +117,22 @@ func DeleteScheduleTaskByRepo(ctx context.Context, id int64) error { return committer.Commit() } -func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository) error { +func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository) ([]*ActionRunJob, error) { // If actions disabled when there is schedule task, this will remove the outdated schedule tasks // There is no other place we can do this because the app.ini will be changed manually if err := DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil { - return fmt.Errorf("DeleteCronTaskByRepo: %v", err) + return nil, fmt.Errorf("DeleteCronTaskByRepo: %v", err) } // cancel running cron jobs of this repository and delete old schedules - if err := CancelPreviousJobs( + jobs, err := CancelPreviousJobs( ctx, repo.ID, repo.DefaultBranch, "", webhook_module.HookEventSchedule, - ); err != nil { - return fmt.Errorf("CancelPreviousJobs: %v", err) + ) + if err != nil { + return jobs, fmt.Errorf("CancelPreviousJobs: %v", err) } - return nil + return jobs, nil } diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index d418b8e4b5..5ef510fd84 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -12,7 +12,6 @@ import ( "strings" "time" - actions_model "code.gitea.io/gitea/models/actions" activities_model "code.gitea.io/gitea/models/activities" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/organization" @@ -1049,7 +1048,7 @@ func updateRepoArchivedState(ctx *context.APIContext, opts api.EditRepoOption) e ctx.APIErrorInternal(err) return err } - if err := actions_model.CleanRepoScheduleTasks(ctx, repo); err != nil { + if err := actions_service.CleanRepoScheduleTasks(ctx, repo); err != nil { log.Error("CleanRepoScheduleTasks for archived repo %s/%s: %v", ctx.Repo.Owner.Name, repo.Name, err) } log.Trace("Repository was archived: %s/%s", ctx.Repo.Owner.Name, repo.Name) diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 768484a21c..ac7eb768fa 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -11,7 +11,6 @@ import ( "strings" "time" - actions_model "code.gitea.io/gitea/models/actions" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/models/perm" @@ -906,7 +905,7 @@ func SettingsPost(ctx *context.Context) { return } - if err := actions_model.CleanRepoScheduleTasks(ctx, repo); err != nil { + if err := actions_service.CleanRepoScheduleTasks(ctx, repo); err != nil { log.Error("CleanRepoScheduleTasks for archived repo %s/%s: %v", ctx.Repo.Owner.Name, repo.Name, err) } diff --git a/services/actions/clear_tasks.go b/services/actions/clear_tasks.go index 67373782d5..9d613b68a5 100644 --- a/services/actions/clear_tasks.go +++ b/services/actions/clear_tasks.go @@ -10,10 +10,12 @@ 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/modules/actions" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" + webhook_module "code.gitea.io/gitea/modules/webhook" ) // StopZombieTasks stops the task which have running status, but haven't been updated for a long time @@ -32,6 +34,24 @@ func StopEndlessTasks(ctx context.Context) error { }) } +func notifyWorkflowJobStatusUpdate(ctx context.Context, jobs []*actions_model.ActionRunJob) { + if len(jobs) > 0 { + CreateCommitStatus(ctx, jobs...) + } +} + +func CancelPreviousJobs(ctx context.Context, repoID int64, ref, workflowID string, event webhook_module.HookEventType) error { + jobs, err := actions_model.CancelPreviousJobs(ctx, repoID, ref, workflowID, event) + notifyWorkflowJobStatusUpdate(ctx, jobs) + return err +} + +func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository) error { + jobs, err := actions_model.CleanRepoScheduleTasks(ctx, repo) + notifyWorkflowJobStatusUpdate(ctx, jobs) + return err +} + func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error { tasks, err := db.Find[actions_model.ActionTask](ctx, opts) if err != nil { @@ -67,7 +87,7 @@ func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error { remove() } - CreateCommitStatus(ctx, jobs...) + notifyWorkflowJobStatusUpdate(ctx, jobs) return nil } diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index 2d8885dc32..87ea1a37f5 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -136,7 +136,7 @@ func notify(ctx context.Context, input *notifyInput) error { return nil } if unit_model.TypeActions.UnitGlobalDisabled() { - if err := actions_model.CleanRepoScheduleTasks(ctx, input.Repo); err != nil { + if err := CleanRepoScheduleTasks(ctx, input.Repo); err != nil { log.Error("CleanRepoScheduleTasks: %v", err) } return nil @@ -341,7 +341,7 @@ func handleWorkflows( // cancel running jobs if the event is push or pull_request_sync if run.Event == webhook_module.HookEventPush || run.Event == webhook_module.HookEventPullRequestSync { - if err := actions_model.CancelPreviousJobs( + if err := CancelPreviousJobs( ctx, run.RepoID, run.Ref, @@ -472,7 +472,7 @@ func handleSchedules( log.Error("CountSchedules: %v", err) return err } else if count > 0 { - if err := actions_model.CleanRepoScheduleTasks(ctx, input.Repo); err != nil { + if err := CleanRepoScheduleTasks(ctx, input.Repo); err != nil { log.Error("CleanRepoScheduleTasks: %v", err) } } diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go index 18f3324fd2..ad1158313b 100644 --- a/services/actions/schedule_tasks.go +++ b/services/actions/schedule_tasks.go @@ -55,7 +55,7 @@ func startTasks(ctx context.Context) error { // cancel running jobs if the event is push if row.Schedule.Event == webhook_module.HookEventPush { // cancel running jobs of the same workflow - if err := actions_model.CancelPreviousJobs( + if err := CancelPreviousJobs( ctx, row.RepoID, row.Schedule.Ref, diff --git a/services/actions/workflow.go b/services/actions/workflow.go index ccdefa802d..5225f4dcad 100644 --- a/services/actions/workflow.go +++ b/services/actions/workflow.go @@ -256,7 +256,7 @@ func DispatchActionWorkflow(ctx reqctx.RequestContext, doer *user_model.User, re } // cancel running jobs of the same workflow - if err := actions_model.CancelPreviousJobs( + if err := CancelPreviousJobs( ctx, run.RepoID, run.Ref, diff --git a/services/repository/branch.go b/services/repository/branch.go index c80d367bbd..d0d8851423 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -30,6 +30,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" + actions_service "code.gitea.io/gitea/services/actions" notify_service "code.gitea.io/gitea/services/notify" release_service "code.gitea.io/gitea/services/release" files_service "code.gitea.io/gitea/services/repository/files" @@ -452,7 +453,7 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m log.Error("DeleteCronTaskByRepo: %v", err) } // cancel running cron jobs of this repository and delete old schedules - if err := actions_model.CancelPreviousJobs( + if err := actions_service.CancelPreviousJobs( ctx, repo.ID, from, @@ -639,7 +640,7 @@ func SetRepoDefaultBranch(ctx context.Context, repo *repo_model.Repository, gitR log.Error("DeleteCronTaskByRepo: %v", err) } // cancel running cron jobs of this repository and delete old schedules - if err := actions_model.CancelPreviousJobs( + if err := actions_service.CancelPreviousJobs( ctx, repo.ID, oldDefaultBranchName, diff --git a/services/repository/setting.go b/services/repository/setting.go index b82f24271e..e0c787dd2d 100644 --- a/services/repository/setting.go +++ b/services/repository/setting.go @@ -7,7 +7,6 @@ import ( "context" "slices" - 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" @@ -29,7 +28,7 @@ func UpdateRepositoryUnits(ctx context.Context, repo *repo_model.Repository, uni } if slices.Contains(deleteUnitTypes, unit.TypeActions) { - if err := actions_model.CleanRepoScheduleTasks(ctx, repo); err != nil { + if err := actions_service.CleanRepoScheduleTasks(ctx, repo); err != nil { log.Error("CleanRepoScheduleTasks: %v", err) } }