diff --git a/models/actions/run.go b/models/actions/run.go index 37064520a213a..f5e5d9afb0936 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -374,10 +374,10 @@ func GetLatestRun(ctx context.Context, repoID int64) (*ActionRun, error) { return run, nil } -func GetWorkflowLatestRun(ctx context.Context, repoID int64, workflowFile, branch, event string) (*ActionRun, error) { +func GetWorkflowLatestRun(ctx context.Context, repoID int64, workflowFile, ref, event string) (*ActionRun, error) { var run ActionRun - q := db.GetEngine(ctx).Where("repo_id=?", repoID). - And("ref = ?", branch). + q := db.GetEngine(ctx).Where("repo_id = ?", repoID). + And("ref = ?", ref). And("workflow_id = ?", workflowFile) if event != "" { q.And("event = ?", event) @@ -386,7 +386,7 @@ func GetWorkflowLatestRun(ctx context.Context, repoID int64, workflowFile, branc if err != nil { return nil, err } else if !has { - return nil, util.NewNotExistErrorf("run with repo_id %d, ref %s, workflow_id %s", repoID, branch, workflowFile) + return nil, util.NewNotExistErrorf("run with repo_id %d, ref %s, workflow_id %s", repoID, ref, workflowFile) } return &run, nil } diff --git a/routers/web/repo/actions/badge.go b/routers/web/repo/actions/badge.go index e920ecaf58063..2a95ed66eb2f7 100644 --- a/routers/web/repo/actions/badge.go +++ b/routers/web/repo/actions/badge.go @@ -19,13 +19,33 @@ import ( func GetWorkflowBadge(ctx *context.Context) { workflowFile := ctx.PathParam("workflow_name") branch := ctx.Req.URL.Query().Get("branch") - if branch == "" { + tag := ctx.Req.URL.Query().Get("tag") + useLatestTag := ctx.Req.URL.Query().Has("latest_tag") + var ref string + switch { + case useLatestTag: + tags, _, err := ctx.Repo.GitRepo.GetTagInfos(0, 1) + if err != nil { + ctx.ServerError("GetTagInfos", err) + return + } + if len(tags) != 0 { + tag = tags[0].Name + } else { + tag = "" // return empty result on no tag + } + ref = fmt.Sprintf("refs/tags/%s", tag) + case tag != "": + ref = fmt.Sprintf("refs/tags/%s", tag) + case branch != "": + ref = fmt.Sprintf("refs/heads/%s", branch) + default: branch = ctx.Repo.Repository.DefaultBranch + ref = fmt.Sprintf("refs/heads/%s", branch) } - branchRef := fmt.Sprintf("refs/heads/%s", branch) event := ctx.Req.URL.Query().Get("event") - badge, err := getWorkflowBadge(ctx, workflowFile, branchRef, event) + badge, err := getWorkflowBadge(ctx, workflowFile, ref, event) if err != nil { ctx.ServerError("GetWorkflowBadge", err) return @@ -36,11 +56,11 @@ func GetWorkflowBadge(ctx *context.Context) { ctx.HTML(http.StatusOK, "shared/actions/runner_badge") } -func getWorkflowBadge(ctx *context.Context, workflowFile, branchName, event string) (badge.Badge, error) { +func getWorkflowBadge(ctx *context.Context, workflowFile, ref, event string) (badge.Badge, error) { extension := filepath.Ext(workflowFile) workflowName := strings.TrimSuffix(workflowFile, extension) - run, err := actions_model.GetWorkflowLatestRun(ctx, ctx.Repo.Repository.ID, workflowFile, branchName, event) + run, err := actions_model.GetWorkflowLatestRun(ctx, ctx.Repo.Repository.ID, workflowFile, ref, event) if err != nil { if errors.Is(err, util.ErrNotExist) { return badge.GenerateBadge(workflowName, "no status", badge.DefaultColor), nil