diff --git a/.forgejo/workflows/compliance.yml b/.forgejo/workflows/compliance.yml
deleted file mode 100644
index 62abd1c3be..0000000000
--- a/.forgejo/workflows/compliance.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: compliance
-
-on:
-  pull_request:
-  push:
-    branches:
-      - 'forgejo*'
-      - 'v*/forgejo*'
-
-jobs:
-  lint-backend:
-    runs-on: docker
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/setup-go@v4
-        with:
-          go-version: ">=1.20"
-          check-latest: true
-      - run: make deps-backend deps-tools
-      - run: make lint-backend
-        env:
-          TAGS: bindata sqlite sqlite_unlock_notify
-  checks-backend:
-    runs-on: docker
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/setup-go@v4
-        with:
-          go-version: ">=1.20"
-          check-latest: true
-      - run: make deps-backend deps-tools
-      - run: make --always-make checks-backend # ensure the "go-licenses" make target runs
diff --git a/.forgejo/workflows/testing-mysql.yml b/.forgejo/workflows/testing-mysql.yml
deleted file mode 100644
index 2d69bb2baf..0000000000
--- a/.forgejo/workflows/testing-mysql.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: testing MySQL
-
-on:
-  pull_request:
-  push:
-    branches:
-      - 'forgejo*'
-      - 'v*/forgejo*'
-
-jobs:
-  test-mysql:
-    runs-on: docker
-    container:
-      image: codeberg.org/forgejo/test_env:main
-    services:
-      mysql8:
-        image: mysql:8
-        env:
-          MYSQL_ALLOW_EMPTY_PASSWORD: yes
-          MYSQL_DATABASE: testgitea
-        ports:
-          - "3306:3306"
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/setup-go@v4
-        with:
-          go-version: ">=1.20.0"
-      - run: |
-          git config --add safe.directory '*'
-          chown -R gitea:gitea . /go
-      - run: |
-          su gitea -c 'make deps-backend'
-      - run: |
-          su gitea -c 'make backend'
-        env:
-          TAGS: bindata
-      - run: |
-          su gitea -c 'make test-mysql8-migration test-mysql8'
-        timeout-minutes: 50
-        env:
-          TAGS: bindata
-          USE_REPO_TEST_DIR: 1
diff --git a/.forgejo/workflows/testing-psql.yml b/.forgejo/workflows/testing-psql.yml
deleted file mode 100644
index a6caf3eb74..0000000000
--- a/.forgejo/workflows/testing-psql.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: testing PostgreSQL
-
-on:
-  pull_request:
-  push:
-    branches:
-      - 'forgejo*'
-      - 'v*/forgejo*'
-
-jobs:
-  test-pgsql:
-    runs-on: docker
-    container:
-      image: codeberg.org/forgejo/test_env:main
-    services:
-      pgsql:
-        image: postgres:15
-        env:
-          POSTGRES_DB: test
-          POSTGRES_PASSWORD: postgres
-        ports:
-          - "5432:5432"
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/setup-go@v4
-        with:
-          go-version: ">=1.20.0"
-      - run: |
-          git config --add safe.directory '*'
-          chown -R gitea:gitea . /go
-      - run: |
-          su gitea -c 'make deps-backend'
-      - run: |
-          su gitea -c 'make backend'
-        env:
-          TAGS: bindata
-      - run: |
-          su gitea -c 'make test-pgsql-migration test-pgsql'
-        timeout-minutes: 50
-        env:
-          TAGS: bindata gogit
-          RACE_ENABLED: true
-          TEST_TAGS: gogit
-          USE_REPO_TEST_DIR: 1
diff --git a/.forgejo/workflows/testing-sqlite.yml b/.forgejo/workflows/testing-sqlite.yml
deleted file mode 100644
index 69e3dc994d..0000000000
--- a/.forgejo/workflows/testing-sqlite.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: testing SQLite
-
-on:
-  pull_request:
-  push:
-    branches:
-      - 'forgejo*'
-      - 'v*/forgejo*'
-
-jobs:
-  test-sqlite:
-    runs-on: docker
-    container:
-      image: codeberg.org/forgejo/test_env:main
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/setup-go@v4
-        with:
-          go-version: ">=1.20.0"
-      - run: |
-          git config --add safe.directory '*'
-          chown -R gitea:gitea . /go
-      - run: |
-          su gitea -c 'make deps-backend'
-      - run: |
-          su gitea -c 'make backend'
-        env:
-          TAGS: bindata gogit sqlite sqlite_unlock_notify
-      - run: |
-          su gitea -c 'make test-sqlite-migration test-sqlite'
-        timeout-minutes: 50
-        env:
-          TAGS: bindata gogit sqlite sqlite_unlock_notify
-          RACE_ENABLED: true
-          TEST_TAGS: gogit sqlite sqlite_unlock_notify
-          USE_REPO_TEST_DIR: 1
diff --git a/.forgejo/workflows/testing-unit.yml b/.forgejo/workflows/testing-unit.yml
deleted file mode 100644
index ab6be735b9..0000000000
--- a/.forgejo/workflows/testing-unit.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: testing unit
-
-on:
-  pull_request:
-  push:
-    branches:
-      - 'forgejo*'
-      - 'v*/forgejo*'
-
-jobs:
-  test-unit:
-    runs-on: docker
-    container:
-      image: codeberg.org/forgejo/test_env:main
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/setup-go@v4
-        with:
-          go-version: ">=1.20.0"
-      - run: |
-          git config --add safe.directory '*'
-          chown -R gitea:gitea . /go
-      - run: |
-          su gitea -c 'make deps-backend'
-      - run: |
-          su gitea -c 'make backend'
-        env:
-          TAGS: bindata
-      - run: |
-          su gitea -c 'make unit-test-coverage test-check'
-        timeout-minutes: 50
-        env:
-          RACE_ENABLED: 'true'
-          TAGS: bindata
diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml
new file mode 100644
index 0000000000..22e73f5378
--- /dev/null
+++ b/.forgejo/workflows/testing.yml
@@ -0,0 +1,152 @@
+name: testing
+
+on:
+  pull_request:
+  push:
+    branches:
+      - 'forgejo*'
+      - 'v*/forgejo*'
+
+jobs:
+  lint-backend:
+    runs-on: docker
+    steps:
+      - uses: https://code.forgejo.org/actions/checkout@v3
+      - uses: https://code.forgejo.org/actions/setup-go@v4
+        with:
+          go-version: ">=1.20"
+          check-latest: true
+      - run: make deps-backend deps-tools
+      - run: make lint-backend
+        env:
+          TAGS: bindata sqlite sqlite_unlock_notify
+  checks-backend:
+    runs-on: docker
+    steps:
+      - uses: https://code.forgejo.org/actions/checkout@v3
+      - uses: https://code.forgejo.org/actions/setup-go@v4
+        with:
+          go-version: ">=1.20"
+          check-latest: true
+      - run: make deps-backend deps-tools
+      - run: make --always-make checks-backend # ensure the "go-licenses" make target runs
+  test-unit:
+    runs-on: docker
+    needs: [lint-backend, checks-backend]
+    container:
+      image: codeberg.org/forgejo/test_env:main
+    steps:
+      - uses: https://code.forgejo.org/actions/checkout@v3
+      - uses: https://code.forgejo.org/actions/setup-go@v4
+        with:
+          go-version: ">=1.20.0"
+      - run: |
+          git config --add safe.directory '*'
+          chown -R gitea:gitea . /go
+      - run: |
+          su gitea -c 'make deps-backend'
+      - run: |
+          su gitea -c 'make backend'
+        env:
+          TAGS: bindata
+      - run: |
+          su gitea -c 'make unit-test-coverage test-check'
+        timeout-minutes: 50
+        env:
+          RACE_ENABLED: 'true'
+          TAGS: bindata
+  test-mysql:
+    runs-on: docker
+    needs: [lint-backend, checks-backend]
+    container:
+      image: codeberg.org/forgejo/test_env:main
+    services:
+      mysql8:
+        image: mysql:8
+        env:
+          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_DATABASE: testgitea
+        ports:
+          - "3306:3306"
+    steps:
+      - uses: https://code.forgejo.org/actions/checkout@v3
+      - uses: https://code.forgejo.org/actions/setup-go@v4
+        with:
+          go-version: ">=1.20.0"
+      - run: |
+          git config --add safe.directory '*'
+          chown -R gitea:gitea . /go
+      - run: |
+          su gitea -c 'make deps-backend'
+      - run: |
+          su gitea -c 'make backend'
+        env:
+          TAGS: bindata
+      - run: |
+          su gitea -c 'make test-mysql8-migration test-mysql8'
+        timeout-minutes: 50
+        env:
+          TAGS: bindata
+          USE_REPO_TEST_DIR: 1
+  test-pgsql:
+    runs-on: docker
+    needs: [lint-backend, checks-backend]
+    container:
+      image: codeberg.org/forgejo/test_env:main
+    services:
+      pgsql:
+        image: postgres:15
+        env:
+          POSTGRES_DB: test
+          POSTGRES_PASSWORD: postgres
+        ports:
+          - "5432:5432"
+    steps:
+      - uses: https://code.forgejo.org/actions/checkout@v3
+      - uses: https://code.forgejo.org/actions/setup-go@v4
+        with:
+          go-version: ">=1.20.0"
+      - run: |
+          git config --add safe.directory '*'
+          chown -R gitea:gitea . /go
+      - run: |
+          su gitea -c 'make deps-backend'
+      - run: |
+          su gitea -c 'make backend'
+        env:
+          TAGS: bindata
+      - run: |
+          su gitea -c 'make test-pgsql-migration test-pgsql'
+        timeout-minutes: 50
+        env:
+          TAGS: bindata gogit
+          RACE_ENABLED: true
+          TEST_TAGS: gogit
+          USE_REPO_TEST_DIR: 1
+  test-sqlite:
+    runs-on: docker
+    needs: [lint-backend, checks-backend]
+    container:
+      image: codeberg.org/forgejo/test_env:main
+    steps:
+      - uses: https://code.forgejo.org/actions/checkout@v3
+      - uses: https://code.forgejo.org/actions/setup-go@v4
+        with:
+          go-version: ">=1.20.0"
+      - run: |
+          git config --add safe.directory '*'
+          chown -R gitea:gitea . /go
+      - run: |
+          su gitea -c 'make deps-backend'
+      - run: |
+          su gitea -c 'make backend'
+        env:
+          TAGS: bindata gogit sqlite sqlite_unlock_notify
+      - run: |
+          su gitea -c 'make test-sqlite-migration test-sqlite'
+        timeout-minutes: 50
+        env:
+          TAGS: bindata gogit sqlite sqlite_unlock_notify
+          RACE_ENABLED: true
+          TEST_TAGS: gogit sqlite sqlite_unlock_notify
+          USE_REPO_TEST_DIR: 1