feat: link CI job to its defining workflow file (#11216)

Fixes #11036.

This adds a link from a CI run to the file that its workflow was taken from.

| Before | After |
|---------|---------|
| ![screenshot](/attachments/49741492-c98b-4a9a-b8bf-f6628698e008) | ![image](/attachments/8ec7dd76-d4ba-4f58-a63a-dd7886e16aae) |

Before:
* the `test.yml` link points to the list of other runs (`/org123/repo2/actions?workflow=test.yml`)

After:
* the `test.yml` link points to the workflow definition (`/org123/repo2/src/commit/55b048363c8cfa7d9e8b5cade5c75681bd0c7328/.forgejo/workflows/test.yml`)
* the `all runs` link points to the list of other runs (`/org123/repo2/actions?workflow=test.yml`)

I have tried to retain the existing link to the list of workflow runs (moving it to a separate link), but I am not sure if this link should be retained at all and if so how.

## Checklist

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server.
- I added test coverage for JavaScript changes...
  - [ ] in `web_src/js/*.test.js` if it can be unit tested.
  - [x] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)).

### Documentation

- [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change.
- [x] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [x] This change will be noticed by a Forgejo user or admin (feature, bug fix, performance, etc.). I suggest to include a release note for this change.
- [ ] This change is not visible to a Forgejo user or admin (refactor, dependency upgrade, etc.). I think there is no need to add a release note for this change.

<!--start release-notes-assistant-->

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Features
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/11216): <!--number 11216 --><!--line 0 --><!--description bGluayBDSSBqb2IgdG8gaXRzIGRlZmluaW5nIHdvcmtmbG93IGZpbGU=-->link CI job to its defining workflow file<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/11216
Reviewed-by: Andreas Ahlenstorf <aahlenst@noreply.codeberg.org>
Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org>
Co-authored-by: Antonin Delpeuch <antonin@delpeuch.eu>
Co-committed-by: Antonin Delpeuch <antonin@delpeuch.eu>
This commit is contained in:
Antonin Delpeuch 2026-02-20 03:11:29 +01:00 committed by Mathieu Fenniak
parent 515b27707e
commit 45db3c98a3
11 changed files with 40 additions and 3 deletions

View file

@ -65,6 +65,7 @@ const defaultTestProps = {
locale: testLocale,
workflowName: 'workflow name',
workflowURL: 'https://example.com/example-org/example-repo/actions?workflow=test.yml',
workflowSourceURL: 'https://example.com/example-org/example-repo/src/commit/023babec384/.forgejo/workflows/test.yml',
};
test('load multiple steps on a finished action', async () => {

View file

@ -49,6 +49,10 @@ export default {
type: String,
required: true,
},
workflowSourceURL: {
type: String,
required: true,
},
locale: {
type: Object,
required: true,
@ -96,6 +100,7 @@ export default {
localeCommit: '',
localePushedBy: '',
localeWorkflow: '',
localeAllRuns: '',
shortSHA: '',
link: '',
pusher: {
@ -488,7 +493,7 @@ export default {
</div>
<div class="action-summary">
{{ run.commit.localeWorkflow }}
<a class="muted" :href="workflowURL">{{ workflowName }}</a>
<a class="muted" :href="workflowSourceURL">{{ workflowName }}</a> <span>(<a class="muted" :href="workflowURL">{{ run.commit.localeAllRuns }}</a>)</span>
</div>
<div class="ui error message pre-execution-error" v-if="run.preExecutionError">
<div class="header">

View file

@ -24,6 +24,7 @@ export async function initRepositoryActionView() {
actionsURL: el.getAttribute('data-actions-url'),
workflowName: el.getAttribute('data-workflow-name'),
workflowURL: el.getAttribute('data-workflow-url'),
workflowSourceURL: el.getAttribute('data-workflow-source-url'),
locale: {
approve: el.getAttribute('data-locale-approve'),
cancel: el.getAttribute('data-locale-cancel'),