From f55fe989a47d492cfe5631a4eb1e7b362821f5e8 Mon Sep 17 00:00:00 2001
From: Jason Song <i@wolfogre.com>
Date: Mon, 10 Apr 2023 21:46:36 +0800
Subject: [PATCH] Use actions job link as commit status URL instead of run link
 (#24023) (#24032)

Backport #24023.

A commit status is bound to a job, not a run.
---
 services/actions/commit_status.go | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go
index 6604a149a5..7d674f7906 100644
--- a/services/actions/commit_status.go
+++ b/services/actions/commit_status.go
@@ -88,13 +88,18 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er
 		return fmt.Errorf("GetLatestCommitStatus: %w", err)
 	}
 
+	index, err := getIndexOfJob(ctx, job)
+	if err != nil {
+		return fmt.Errorf("getIndexOfJob: %w", err)
+	}
+
 	if err := git_model.NewCommitStatus(ctx, git_model.NewCommitStatusOptions{
 		Repo:    repo,
 		SHA:     sha,
 		Creator: creator,
 		CommitStatus: &git_model.CommitStatus{
 			SHA:         sha,
-			TargetURL:   run.Link(),
+			TargetURL:   fmt.Sprintf("%s/jobs/%d", run.Link(), index),
 			Description: "",
 			Context:     ctxname,
 			CreatorID:   creatorID,
@@ -121,3 +126,17 @@ func toCommitStatus(status actions_model.Status) api.CommitStatusState {
 		return api.CommitStatusError
 	}
 }
+
+func getIndexOfJob(ctx context.Context, job *actions_model.ActionRunJob) (int, error) {
+	// TODO: store job index as a field in ActionRunJob to avoid this
+	jobs, err := actions_model.GetRunJobsByRunID(ctx, job.RunID)
+	if err != nil {
+		return 0, err
+	}
+	for i, v := range jobs {
+		if v.ID == job.ID {
+			return i, nil
+		}
+	}
+	return 0, nil
+}