From f70f2c76cb31e5770522b8442db765da0569be96 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 2 Apr 2026 23:41:27 -0600 Subject: [PATCH] Improve actions notifier for `workflow_run` (#37088) Changes: - Make `GetActionWorkflow` only convert the target workflow - In `getActionWorkflowEntry`, use `branchName` instead of resolving the default branch name from `commit.GetBranchName()` - Add `ref` to `workflow_run` notify input to avoid the empty `ref` warning --------- Co-authored-by: Lunny Xiao --- modules/actions/github.go | 4 ++++ modules/git/commit.go | 21 --------------------- services/actions/notifier.go | 18 ++++++++++-------- services/convert/convert.go | 19 +++++++++++-------- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/modules/actions/github.go b/modules/actions/github.go index 68116ec83a..b7f475aa91 100644 --- a/modules/actions/github.go +++ b/modules/actions/github.go @@ -59,6 +59,10 @@ func IsDefaultBranchWorkflow(triggedEvent webhook_module.HookEventType) bool { // Github "issues" event // https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#issues return true + case webhook_module.HookEventWorkflowRun: + // GitHub "workflow_run" event + // https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run + return true } return false diff --git a/modules/git/commit.go b/modules/git/commit.go index dfecfe6057..c3d23d6878 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -247,27 +247,6 @@ func (c *Commit) GetFileContent(filename string, limit int) (string, error) { return string(bytes), nil } -// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only') -func (c *Commit) GetBranchName() (string, error) { - cmd := gitcmd.NewCommand("name-rev") - if DefaultFeatures().CheckVersionAtLeast("2.13.0") { - cmd.AddArguments("--exclude", "refs/tags/*") - } - cmd.AddArguments("--name-only", "--no-undefined").AddDynamicArguments(c.ID.String()) - data, _, err := cmd.WithDir(c.repo.Path).RunStdString(c.repo.Ctx) - if err != nil { - // handle special case where git can not describe commit - if strings.Contains(err.Error(), "cannot describe") { - return "", nil - } - - return "", err - } - - // name-rev commitID output will be "master" or "master~12" - return strings.SplitN(strings.TrimSpace(data), "~", 2)[0], nil -} - // GetFullCommitID returns full length (40) of commit ID by given short SHA in a repository. func GetFullCommitID(ctx context.Context, repoPath, shortID string) (string, error) { commitID, _, err := gitcmd.NewCommand("rev-parse"). diff --git a/services/actions/notifier.go b/services/actions/notifier.go index abcaff09a3..19d6be9420 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -816,12 +816,14 @@ func (n *actionsNotifier) WorkflowRunStatusUpdate(ctx context.Context, repo *rep return } - newNotifyInput(repo, sender, webhook_module.HookEventWorkflowRun).WithPayload(&api.WorkflowRunPayload{ - Action: status, - Workflow: convertedWorkflow, - WorkflowRun: convertedRun, - Organization: org, - Repo: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm_model.AccessModeOwner}), - Sender: convert.ToUser(ctx, sender, nil), - }).Notify(ctx) + newNotifyInput(repo, sender, webhook_module.HookEventWorkflowRun). + WithRef(git.RefNameFromBranch(repo.DefaultBranch).String()). + WithPayload(&api.WorkflowRunPayload{ + Action: status, + Workflow: convertedWorkflow, + WorkflowRun: convertedRun, + Organization: org, + Repo: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm_model.AccessModeOwner}), + Sender: convert.ToUser(ctx, sender, nil), + }).Notify(ctx) } diff --git a/services/convert/convert.go b/services/convert/convert.go index e79cb343e4..71d2ecb333 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -387,14 +387,12 @@ func ToActionWorkflowJob(ctx context.Context, repo *repo_model.Repository, task }, nil } -func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, commit *git.Commit, folder string, entry *git.TreeEntry) *api.ActionWorkflow { +func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, commit *git.Commit, branchName, folder string, entry *git.TreeEntry) *api.ActionWorkflow { cfgUnit := repo.MustGetUnit(ctx, unit.TypeActions) cfg := cfgUnit.ActionsConfig() - defaultBranch, _ := commit.GetBranchName() - workflowURL := fmt.Sprintf("%s/actions/workflows/%s", repo.APIURL(), util.PathEscapeSegments(entry.Name())) - workflowRepoURL := fmt.Sprintf("%s/src/branch/%s/%s/%s", repo.HTMLURL(ctx), util.PathEscapeSegments(defaultBranch), util.PathEscapeSegments(folder), util.PathEscapeSegments(entry.Name())) + workflowRepoURL := fmt.Sprintf("%s/src/branch/%s/%s/%s", repo.HTMLURL(ctx), util.PathEscapeSegments(branchName), util.PathEscapeSegments(folder), util.PathEscapeSegments(entry.Name())) badgeURL := fmt.Sprintf("%s/actions/workflows/%s/badge.svg?branch=%s", repo.HTMLURL(ctx), util.PathEscapeSegments(entry.Name()), url.QueryEscape(repo.DefaultBranch)) // See https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#get-a-workflow @@ -459,21 +457,26 @@ func ListActionWorkflows(ctx context.Context, gitrepo *git.Repository, repo *rep workflows := make([]*api.ActionWorkflow, len(entries)) for i, entry := range entries { - workflows[i] = getActionWorkflowEntry(ctx, repo, defaultBranchCommit, folder, entry) + workflows[i] = getActionWorkflowEntry(ctx, repo, defaultBranchCommit, repo.DefaultBranch, folder, entry) } return workflows, nil } func GetActionWorkflow(ctx context.Context, gitrepo *git.Repository, repo *repo_model.Repository, workflowID string) (*api.ActionWorkflow, error) { - entries, err := ListActionWorkflows(ctx, gitrepo, repo) + defaultBranchCommit, err := gitrepo.GetBranchCommit(repo.DefaultBranch) + if err != nil { + return nil, err + } + + folder, entries, err := actions.ListWorkflows(defaultBranchCommit) if err != nil { return nil, err } for _, entry := range entries { - if entry.ID == workflowID { - return entry, nil + if entry.Name() == workflowID { + return getActionWorkflowEntry(ctx, repo, defaultBranchCommit, repo.DefaultBranch, folder, entry), nil } }