jojo/services/actions
Mathieu Fenniak 5f757d9e83 [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797)
Partial backport of #9434.

Fixes a bug: it was intended that pushes to a branch and pushes to a pull request would cancel any previous running job from the same workflow, however this functionality only worked on a `on: push` workflow.  This PR fixes it for an `on: pull_request` workflow.

Adds a feature: `concurrency.cancel-in-progress` can be used to override the automatic cancellation behaviour and disable it.

It can be disabled unconditionally in a workflow:
```yaml
concurrency:
    cancel-in-progress: false
```

Or it can be disabled with some logic; for example, keeping the cancel behaviour on PRs but disabling it otherwise:
```yaml
concurrency:
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}
```

Only a small subset of automated tests were applicable for backport, so I supplemented with manual testing in these cases:

|                                                                    | Expected      | Actual        |
| ------------------------------------------------------------------ | ------------- | ------------- |
| Default behaviour:                                                 |               |               |
| on: pull_request -- push to a PR when it's already running         | Cancelled     | Cancelled     |
| on: push -- push to a branch (eg. main) when it's already running  | Cancelled     | Cancelled     |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |
|                                                                    |               |               |
| Set cancel-in-progress: true                                       |               |               |
| on: pull_request -- push to a PR when it's already running         | Cancelled     | Cancelled     |
| on: push -- push to a branch (eg. main) when it's already running  | Cancelled     | Cancelled     |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |
|                                                                    |               |               |
| Set cancel-in-progress: false                                      |               |               |
| on: pull_request -- push to a PR when it's already running         | Multiple Runs | Multiple Runs |
| on: push -- push to a branch (eg. main) when it's already running  | Multiple Runs | Multiple Runs |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |
|                                                                    |               |               |
| Set cancel-in-progress: ${{ github.event_name == 'pull_request' }} |               |               |
| on: pull_request -- push to a PR when it's already running         | Cancelled     | Cancelled     |
| on: push -- push to a branch (eg. main) when it's already running  | Multiple Runs | Multiple Runs |
| on: workflow_dispatch -- run again when it is already running      | Multiple Runs | Multiple Runs |

## Checklist

The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org).

### Tests

- I added test coverage for Go changes...
  - [x] in their respective `*_test.go` for unit tests.
  - [ ] 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.
  - [ ] 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.
  - **TODO:**  Will backport the relevant documentation.
- [ ] I did not document these changes and I do not expect someone else to do it.

### Release notes

- [ ] I do not want this change to show in the release notes.
- [x] I want the title to show in the release notes with a link to this pull request.
- [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title.

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

## Release notes
<!--URL:https://codeberg.org/forgejo/forgejo-->
- Features
  - [PR](https://codeberg.org/forgejo/forgejo/pulls/9797): <!--number 9797 --><!--line 0 --><!--description ZmVhdDogYWxsb3cgd29ya2Zsb3dzIHRvIGNvbnRyb2wgY2FuY2VsbGF0aW9uIG9mIGV4aXN0aW5nIGpvYnM=-->feat: allow workflows to control cancellation of existing jobs<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9797
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2025-11-23 23:01:09 +01:00
..
TestServiceActions_startTask fix: a corrupted Forgejo Actions scheduled workflow is disabled (#8942) 2025-08-18 22:45:10 +02:00
auth.go chore(cleanup): replaces unnecessary calls to formatting functions by non-formatting equivalents (#7994) 2025-05-29 17:34:29 +02:00
auth_test.go Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v2 (forgejo) (#7367) 2025-03-28 22:22:21 +00:00
cleanup.go feat: auto cleanup of offline runners (#7803) 2025-06-08 00:13:37 +02:00
cleanup_test.go Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v2 (forgejo) (#7367) 2025-03-28 22:22:21 +00:00
clear_tasks.go Actions Done Notification (#7491) 2025-04-24 15:15:24 +00:00
commit_status.go Update module code.forgejo.org/forgejo/runner/v9 to v11 (forgejo) (#9218) 2025-09-10 22:02:55 +02:00
context.go [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797) 2025-11-23 23:01:09 +01:00
context_test.go [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797) 2025-11-23 23:01:09 +01:00
init.go chore: branding import path (#7337) 2025-03-27 19:40:14 +00:00
interface.go chore: branding import path (#7337) 2025-03-27 19:40:14 +00:00
job_emitter.go Update module code.forgejo.org/forgejo/runner/v9 to v11 (forgejo) (#9218) 2025-09-10 22:02:55 +02:00
job_emitter_test.go chore: branding import path (#7337) 2025-03-27 19:40:14 +00:00
job_parser.go Update module code.forgejo.org/forgejo/runner/v9 to v11 (forgejo) (#9218) 2025-09-10 22:02:55 +02:00
job_parser_test.go fix: de-duplicate Forgejo Actions job names when needed (#8864) 2025-08-13 06:52:44 +02:00
main_test.go chore: branding import path (#7337) 2025-03-27 19:40:14 +00:00
notifier.go feat: github compatability for removing label from issue API (#8831) 2025-08-30 03:29:23 +02:00
notifier_helper.go [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797) 2025-11-23 23:01:09 +01:00
notifier_helper_test.go [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797) 2025-11-23 23:01:09 +01:00
rerun.go chore: branding import path (#7337) 2025-03-27 19:40:14 +00:00
rerun_test.go chore: branding import path (#7337) 2025-03-27 19:40:14 +00:00
schedule_tasks.go Update module code.forgejo.org/forgejo/runner/v9 to v11 (forgejo) (#9218) 2025-09-10 22:02:55 +02:00
schedule_tasks_test.go fix: a corrupted Forgejo Actions scheduled workflow is disabled (#8942) 2025-08-18 22:45:10 +02:00
task.go chore(cleanup): replaces unnecessary calls to formatting functions by non-formatting equivalents (#7994) 2025-05-29 17:34:29 +02:00
variables.go fix: allow Forgejo Actions environment variables starting with CI (#8850) 2025-08-10 22:56:16 +02:00
variables_test.go fix: allow Forgejo Actions environment variables starting with CI (#8850) 2025-08-10 22:56:16 +02:00
workflows.go [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797) 2025-11-23 23:01:09 +01:00
workflows_test.go [v13.0/forgejo] feat: allow workflows to control cancellation of existing jobs (#9797) 2025-11-23 23:01:09 +01:00