diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go
index ea33ecbd88..598d1892c8 100644
--- a/routers/web/repo/actions/view.go
+++ b/routers/web/repo/actions/view.go
@@ -63,6 +63,15 @@ func View(ctx *app_context.Context) {
return
}
+ workflowDefinitionCommitSHA := job.Run.CommitSHA
+ // if the trigger event is `pull_request_target`, then the definition of the workflow is taken
+ // from the base branch instead of the commit the workflow is triggered on
+ if job.Run.TriggerEvent == actions.GithubEventPullRequestTarget {
+ if pullPayload, err := job.Run.GetPullRequestEventPayload(); err == nil && pullPayload.PullRequest != nil && pullPayload.PullRequest.Base != nil {
+ workflowDefinitionCommitSHA = pullPayload.PullRequest.Base.Sha
+ }
+ }
+
workflowName := job.Run.WorkflowID
ctx.Data["RunIndex"] = runIndex
@@ -72,7 +81,7 @@ func View(ctx *app_context.Context) {
ctx.Data["AttemptNumber"] = attemptNumber
ctx.Data["WorkflowName"] = workflowName
ctx.Data["WorkflowURL"] = ctx.Repo.RepoLink + "/actions?workflow=" + workflowName
- ctx.Data["WorkflowSourceURL"] = ctx.Repo.RepoLink + "/src/commit/" + job.Run.CommitSHA + "/" + job.Run.WorkflowPath()
+ ctx.Data["WorkflowSourceURL"] = ctx.Repo.RepoLink + "/src/commit/" + workflowDefinitionCommitSHA + "/" + job.Run.WorkflowPath()
viewResponse := getViewResponse(ctx, &ViewRequest{}, runIndex, jobIndex, attemptNumber)
if ctx.Written() {
diff --git a/tests/integration/actions_view_test.go b/tests/integration/actions_view_test.go
index a7efd69277..8820ed6aca 100644
--- a/tests/integration/actions_view_test.go
+++ b/tests/integration/actions_view_test.go
@@ -139,6 +139,7 @@ func TestActionViewsView(t *testing.T) {
runIndex int64
jobIndex int64
attempt int64
+ workflowSourceURL string
expectedJSON string
expectedArtifacts string
}{
@@ -148,6 +149,7 @@ func TestActionViewsView(t *testing.T) {
runIndex: 187,
jobIndex: 0,
attempt: 3,
+ workflowSourceURL: "/user5/repo4/src/commit/c2d72f548424103f01ee1dc02889c1e2bff816b0/.forgejo/workflows/artifact.yaml",
expectedJSON: "{\"state\":{\"run\":{\"preExecutionError\":\"\",\"link\":\"/user5/repo4/actions/runs/187\",\"title\":\"update actions\",\"titleHTML\":\"update actions\",\"status\":\"success\",\"canCancel\":false,\"canDelete\":false,\"canApprove\":false,\"canRerun\":false,\"canDeleteArtifact\":false,\"description\":\"Commit c2d72f5484 pushed by user1\",\"done\":true,\"jobs\":[{\"id\":192,\"name\":\"job_2\",\"status\":\"success\",\"canRerun\":false,\"duration\":\"_duration_\"}],\"commit\":{\"localeWorkflow\":\"Workflow\",\"localeAllRuns\":\"all runs\",\"shortSHA\":\"c2d72f5484\",\"link\":\"/user5/repo4/commit/c2d72f548424103f01ee1dc02889c1e2bff816b0\",\"pusher\":{\"displayName\":\"user1\",\"link\":\"/user1\"},\"branch\":{\"name\":\"master\",\"link\":\"/user5/repo4/src/branch/master\",\"isDeleted\":false}}},\"currentJob\":{\"title\":\"job_2\",\"details\":[\"Success\"],\"steps\":[{\"summary\":\"Set up job\",\"duration\":\"_duration_\",\"status\":\"running\"},{\"summary\":\"Complete job\",\"duration\":\"_duration_\",\"status\":\"waiting\"}],\"allAttempts\":[{\"number\":3,\"time_since_started_html\":\"_time_\",\"status\":\"running\",\"status_diagnostics\":[\"Running\"]},{\"number\":2,\"time_since_started_html\":\"_time_\",\"status\":\"success\",\"status_diagnostics\":[\"Success\"]},{\"number\":1,\"time_since_started_html\":\"_time_\",\"status\":\"success\",\"status_diagnostics\":[\"Success\"]}]}},\"logs\":{\"stepsLog\":[]}}\n",
expectedArtifacts: "{\"artifacts\":[{\"name\":\"multi-file-download\",\"size\":2048,\"status\":\"completed\"}]}\n",
},
@@ -157,6 +159,7 @@ func TestActionViewsView(t *testing.T) {
runIndex: 209,
jobIndex: 0,
attempt: 1,
+ workflowSourceURL: "/user5/repo4/src/commit/64357baca84bfff631e7dfae5a3433b26d005646/.forgejo/workflows/scheduled.yaml",
expectedJSON: "{\"state\":{\"run\":{\"link\":\"/user5/repo4/actions/runs/209\",\"title\":\"A scheduled workflow\",\"titleHTML\":\"A scheduled workflow\",\"status\":\"waiting\",\"description\":\"Scheduled run of commit \\u003ca href=\\\"/user5/repo4/commit/64357baca84bfff631e7dfae5a3433b26d005646\\\"\\u003e64357baca8\\u003c/a\\u003e\",\"canCancel\":false,\"canDelete\":false,\"canApprove\":false,\"canRerun\":false,\"canDeleteArtifact\":false,\"done\":false,\"jobs\":[{\"id\":2153,\"name\":\"job_2\",\"status\":\"waiting\",\"canRerun\":false,\"duration\":\"_duration_\"}],\"commit\":{\"localeWorkflow\":\"Workflow\",\"localeAllRuns\":\"all runs\",\"shortSHA\":\"64357baca8\",\"link\":\"/user5/repo4/commit/64357baca84bfff631e7dfae5a3433b26d005646\",\"pusher\":{\"displayName\":\"forgejo-actions\",\"link\":\"/forgejo-actions\"},\"branch\":{\"name\":\"master\",\"link\":\"/user5/repo4/src/branch/master\",\"isDeleted\":false}},\"preExecutionError\":\"\"},\"currentJob\":{\"title\":\"job_2\",\"details\":[\"Waiting for a runner with the following labels: debian, gpu\"],\"steps\":[{\"summary\":\"Set up job\",\"duration\":\"_duration_\",\"status\":\"success\"},{\"summary\":\"Complete job\",\"duration\":\"_duration_\",\"status\":\"success\"}],\"allAttempts\":[{\"number\":1,\"time_since_started_html\":\"-\",\"status\":\"success\",\"status_diagnostics\":[\"Success\"]}]}},\"logs\":{\"stepsLog\":[]}}\n",
expectedArtifacts: "{\"artifacts\":[]}\n",
},
@@ -166,9 +169,20 @@ func TestActionViewsView(t *testing.T) {
runIndex: 210,
jobIndex: 0,
attempt: 1,
+ workflowSourceURL: "/user5/repo4/src/commit/f4100ac14112a3740490afb22b07b69b0b5d4e8b/.forgejo/workflows/dispatch.yaml",
expectedJSON: "{\"state\":{\"run\":{\"link\":\"/user5/repo4/actions/runs/210\",\"title\":\"A triggered run\",\"titleHTML\":\"A triggered run\",\"status\":\"waiting\",\"description\":\"Run of commit \\u003ca href=\\\"/user5/repo4/commit/f4100ac14112a3740490afb22b07b69b0b5d4e8b\\\"\\u003ef4100ac141\\u003c/a\\u003e triggered by \\u003ca href=\\\"/user29\\\"\\u003euser29\\u003c/a\\u003e\",\"canCancel\":false,\"canDelete\":false,\"canApprove\":false,\"canRerun\":false,\"canDeleteArtifact\":false,\"done\":false,\"jobs\":[{\"id\":2154,\"name\":\"mirror\",\"status\":\"waiting\",\"canRerun\":false,\"duration\":\"_duration_\"}],\"commit\":{\"localeWorkflow\":\"Workflow\",\"localeAllRuns\":\"all runs\",\"shortSHA\":\"f4100ac141\",\"link\":\"/user5/repo4/commit/f4100ac14112a3740490afb22b07b69b0b5d4e8b\",\"pusher\":{\"displayName\":\"user29\",\"link\":\"/user29\"},\"branch\":{\"name\":\"master\",\"link\":\"/user5/repo4/src/branch/master\",\"isDeleted\":false}},\"preExecutionError\":\"\"},\"currentJob\":{\"title\":\"mirror\",\"details\":[\"Waiting for a runner with the following label: windows\"],\"steps\":[{\"summary\":\"Set up job\",\"duration\":\"_duration_\",\"status\":\"running\"},{\"summary\":\"Complete job\",\"duration\":\"_duration_\",\"status\":\"waiting\"}],\"allAttempts\":[{\"number\":1,\"time_since_started_html\":\"-\",\"status\":\"waiting\",\"status_diagnostics\":[\"Waiting for a runner with the following label: windows\"]}]}},\"logs\":{\"stepsLog\":[]}}\n",
expectedArtifacts: "{\"artifacts\":[]}\n",
},
+ {
+ name: "pull_request_target",
+ url: "/user5/repo4/actions/runs/211",
+ runIndex: 211,
+ jobIndex: 0,
+ attempt: 1,
+ workflowSourceURL: "/user5/repo4/src/commit/deadbeef/.forgejo/workflows/pull_request_target.yaml",
+ expectedJSON: "{\"state\":{\"run\":{\"link\":\"/user5/repo4/actions/runs/211\",\"title\":\"A pull_request_target run\",\"titleHTML\":\"A pull_request_target run\",\"status\":\"waiting\",\"description\":\"Commit \\u003ca href=\\\"/user5/repo4/commit/f4100ac14112a3740490afb22b07b69b0b5d4e8b\\\"\\u003ef4100ac141\\u003c/a\\u003e pushed by \\u003ca href=\\\"/user29\\\"\\u003euser29\\u003c/a\\u003e\",\"canCancel\":false,\"canApprove\":false,\"canRerun\":false,\"canDeleteArtifact\":false,\"canDelete\":false,\"done\":false,\"jobs\":[{\"id\":2155,\"name\":\"target_job\",\"status\":\"waiting\",\"canRerun\":false,\"duration\":\"_duration_\"}],\"commit\":{\"localeWorkflow\":\"Workflow\",\"localeAllRuns\":\"all runs\",\"shortSHA\":\"f4100ac141\",\"link\":\"/user5/repo4/commit/f4100ac14112a3740490afb22b07b69b0b5d4e8b\",\"pusher\":{\"displayName\":\"user29\",\"link\":\"/user29\"},\"branch\":{\"name\":\"master\",\"link\":\"/user5/repo4/src/branch/master\",\"isDeleted\":false}},\"preExecutionError\":\"\"},\"currentJob\":{\"title\":\"target_job\",\"details\":[\"Waiting for a runner with the following label: macos\"],\"steps\":[{\"summary\":\"Set up job\",\"duration\":\"_duration_\",\"status\":\"running\"},{\"summary\":\"Complete job\",\"duration\":\"_duration_\",\"status\":\"waiting\"}],\"allAttempts\":[{\"number\":1,\"time_since_started_html\":\"-\",\"status\":\"waiting\",\"status_diagnostics\":[\"Waiting for a runner with the following label: macos\"]}]}},\"logs\":{\"stepsLog\":[]}}\n",
+ expectedArtifacts: "{\"artifacts\":[]}\n",
+ },
}
for _, testCase := range testCases {
@@ -186,6 +200,7 @@ func TestActionViewsView(t *testing.T) {
htmlDoc.AssertAttrEqual(t, selector, "data-run-index", strconv.FormatInt(testCase.runIndex, 10))
htmlDoc.AssertAttrEqual(t, selector, "data-job-index", strconv.FormatInt(testCase.jobIndex, 10))
htmlDoc.AssertAttrEqual(t, selector, "data-attempt-number", strconv.FormatInt(testCase.attempt, 10))
+ htmlDoc.AssertAttrEqual(t, selector, "data-workflow-source-url", testCase.workflowSourceURL)
htmlDoc.AssertAttrPredicate(t, selector, "data-initial-post-response", func(actual string) {
// Remove dynamic "duration" fields for comparison.
pattern := `"duration":"[^"]*"`
diff --git a/tests/integration/fixtures/TestActionViewsView/action_run.yml b/tests/integration/fixtures/TestActionViewsView/action_run.yml
index 14cfa86468..34753120cf 100644
--- a/tests/integration/fixtures/TestActionViewsView/action_run.yml
+++ b/tests/integration/fixtures/TestActionViewsView/action_run.yml
@@ -32,3 +32,22 @@
updated: 0
need_approval: false
approved_by: 0
+- id: 1002
+ title: "A pull_request_target run"
+ repo_id: 4
+ owner_id: 5
+ workflow_id: "pull_request_target.yaml"
+ index: 211
+ trigger_user_id: 29
+ ref: "refs/heads/master"
+ commit_sha: "f4100ac14112a3740490afb22b07b69b0b5d4e8b"
+ event: "pull_request"
+ trigger_event: "pull_request_target"
+ event_payload: "{\"pull_request\":{\"id\":1,\"base\":{\"sha\":\"deadbeef\"}}}"
+ is_fork_pull_request: false
+ status: 5 # waiting
+ started: 0
+ created: 1683636108
+ updated: 0
+ need_approval: false
+ approved_by: 0
diff --git a/tests/integration/fixtures/TestActionViewsView/action_run_job.yml b/tests/integration/fixtures/TestActionViewsView/action_run_job.yml
index be79240519..4099e9bfa3 100644
--- a/tests/integration/fixtures/TestActionViewsView/action_run_job.yml
+++ b/tests/integration/fixtures/TestActionViewsView/action_run_job.yml
@@ -25,4 +25,18 @@
task_id: 8754
status: 5 # StatusWaiting
started: 0
- stopped: 0
\ No newline at end of file
+ stopped: 0
+- id: 2155
+ run_id: 1002
+ repo_id: 4
+ owner_id: 5
+ runs_on: ["macos"]
+ commit_sha: f4100ac14112a3740490afb22b07b69b0b5d4e8b
+ is_fork_pull_request: false
+ name: target_job
+ attempt: 1
+ job_id: target_job
+ task_id: 8755
+ status: 5 # StatusWaiting
+ started: 0
+ stopped: 0
diff --git a/tests/integration/fixtures/TestActionViewsView/action_task.yml b/tests/integration/fixtures/TestActionViewsView/action_task.yml
index b139270a2b..f7007bab11 100644
--- a/tests/integration/fixtures/TestActionViewsView/action_task.yml
+++ b/tests/integration/fixtures/TestActionViewsView/action_task.yml
@@ -26,3 +26,17 @@
token_hash: 9c104fe0db29aa6d737001707e1de2201fdfefb6d2316ec4fb38c44a1820a5948af2f9e1cb5e58ab95cc8fbe589fd4e82f95
token_salt: ffffffffff
token_last_eight: ffffffff
+- id: 8755
+ job_id: 2155
+ attempt: 1
+ runner_id: 0
+ status: 5 # Waiting
+ started: 0
+ stopped: 0
+ repo_id: 4
+ owner_id: 5
+ commit_sha: f4100ac14112a3740490afb22b07b69b0b5d4e8b
+ is_fork_pull_request: false
+ token_hash: e0db29aa6d737001707e1de2201fdfefb6d2316ec4fb38c44a1820a5948af2f9e1cb5e58ab95cc8fbe589fd4e82f959c104f
+ token_salt: ffffffffff
+ token_last_eight: ffffffff
diff --git a/tests/integration/fixtures/TestActionViewsView/issue.yml b/tests/integration/fixtures/TestActionViewsView/issue.yml
new file mode 100644
index 0000000000..466c39aeb8
--- /dev/null
+++ b/tests/integration/fixtures/TestActionViewsView/issue.yml
@@ -0,0 +1,15 @@
+- id: 26
+ repo_id: 4
+ index: 1
+ poster_id: 2
+ original_author_id: 0
+ name: PR
+ content: 'hello'
+ milestone_id: 0
+ priority: 0
+ is_closed: false
+ is_pull: true
+ num_comments: 0
+ created_unix: 1764879458
+ updated_unix: 1764879458
+ is_locked: false
diff --git a/tests/integration/fixtures/TestActionViewsView/pull_request.yml b/tests/integration/fixtures/TestActionViewsView/pull_request.yml
new file mode 100644
index 0000000000..08b82ebe86
--- /dev/null
+++ b/tests/integration/fixtures/TestActionViewsView/pull_request.yml
@@ -0,0 +1,12 @@
+- id: 13
+ type: 0
+ status: 2 # mergeable
+ issue_id: 26
+ index: 1
+ head_repo_id: 4
+ base_repo_id: 4
+ head_branch: branch2
+ base_branch: master
+ merge_base: deadbeef
+ has_merged: false
+