diff --git a/.drone.yml b/.drone.yml
index 459536621b..7810d3d104 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -1,749 +1,3 @@
----
-kind: pipeline
-type: docker
-name: compliance
-
-platform:
-  os: linux
-  arch: amd64
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-      - "*.md"
-
-volumes:
-  - name: deps
-    temp: {}
-
-steps:
-  - name: deps-frontend
-    image: node:18
-    pull: always
-    commands:
-      - make deps-frontend
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-amd64
-    pull: always
-    commands:
-      - make deps-backend
-      - make deps-tools
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: lint-frontend
-    image: node:18
-    commands:
-      - make lint-frontend
-    depends_on: [deps-frontend]
-
-  - name: lint-backend
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    pull: always
-    commands:
-      - make lint-backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata sqlite sqlite_unlock_notify
-    depends_on: [deps-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: lint-backend-windows
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    commands:
-      - make lint-go-windows lint-go-vet
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata sqlite sqlite_unlock_notify
-      GOOS: windows
-      GOARCH: amd64
-    depends_on: [deps-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: lint-backend-gogit
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    commands:
-      - make lint-backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata gogit sqlite sqlite_unlock_notify
-    depends_on: [deps-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: checks-frontend
-    image: node:18
-    commands:
-      - make checks-frontend
-    depends_on: [deps-frontend]
-
-  - name: checks-backend
-    image: gitea/test_env:linux-1.20-amd64
-    commands:
-      - make --always-make checks-backend # ensure the 'go-licenses' make target runs
-    depends_on: [deps-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: test-frontend
-    image: node:18
-    commands:
-      - make test-frontend
-    depends_on: [lint-frontend]
-
-  - name: build-frontend
-    image: node:18
-    commands:
-      - make frontend
-    depends_on: [deps-frontend]
-
-  - name: build-backend-no-gcc
-    image: gitea/test_env:linux-1.19-amd64 # this step is kept as the lowest version of golang that we support
-    pull: always
-    environment:
-      GOPROXY: https://goproxy.io
-    commands:
-      - go build -o gitea_no_gcc # test if build succeeds without the sqlite tag
-    depends_on: [deps-backend, checks-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: build-backend-arm64
-    image: gitea/test_env:linux-1.20-amd64
-    environment:
-      GOPROXY: https://goproxy.io
-      GOOS: linux
-      GOARCH: arm64
-      TAGS: bindata gogit
-    commands:
-      - make backend # test cross compile
-      - rm ./gitea # clean
-    depends_on: [deps-backend, checks-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: build-backend-windows
-    image: gitea/test_env:linux-1.20-amd64
-    environment:
-      GOPROXY: https://goproxy.io
-      GOOS: windows
-      GOARCH: amd64
-      TAGS: bindata gogit
-    commands:
-      - go build -o gitea_windows
-    depends_on: [deps-backend, checks-backend]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: build-backend-386
-    image: gitea/test_env:linux-1.20-amd64
-    environment:
-      GOPROXY: https://goproxy.io
-      GOOS: linux
-      GOARCH: 386
-    commands:
-      - go build -o gitea_linux_386 # test if compatible with 32 bit
-    depends_on: [deps-backend, checks-backend]
-    volumes:
-      - name: deps
-        path: /go
-
----
-kind: pipeline
-type: docker
-name: testing-pgsql
-
-platform:
-  os: linux
-  arch: amd64
-
-depends_on:
-  - compliance
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-
-volumes:
-  - name: deps
-    temp: {}
-
-services:
-  - name: pgsql
-    pull: default
-    image: postgres:15
-    environment:
-      POSTGRES_DB: test
-      POSTGRES_PASSWORD: postgres
-
-  - name: ldap
-    image: gitea/test-openldap:latest
-    pull: always
-
-  - name: minio
-    image: minio/minio:RELEASE.2021-03-12T00-00-47Z
-    pull: always
-    commands:
-      - minio server /data
-    environment:
-      MINIO_ACCESS_KEY: 123456
-      MINIO_SECRET_KEY: 12345678
-
-steps:
-  - name: fetch-tags
-    image: docker:git
-    pull: always
-    commands:
-      - git fetch --tags --force
-    when:
-      event:
-        exclude:
-          - pull_request
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-amd64
-    pull: always
-    commands:
-      - make deps-backend
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: prepare-test-env
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    pull: always
-    commands:
-      - ./build/test-env-prepare.sh
-
-  - name: build
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - ./build/test-env-check.sh
-      - make backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: test-pgsql
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - timeout -s ABRT 50m make test-pgsql-migration test-pgsql
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata gogit
-      RACE_ENABLED: true
-      TEST_TAGS: gogit
-      TEST_LDAP: 1
-      USE_REPO_TEST_DIR: 1
-    depends_on: [build]
-    volumes:
-      - name: deps
-        path: /go
-
----
-kind: pipeline
-type: docker
-name: testing-mysql
-
-platform:
-  os: linux
-  arch: amd64
-
-depends_on:
-  - compliance
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-
-volumes:
-  - name: deps
-    temp: {}
-
-services:
-  - name: mysql
-    image: mysql:5.7
-    pull: always
-    environment:
-      MYSQL_ALLOW_EMPTY_PASSWORD: yes
-      MYSQL_DATABASE: test
-
-  - name: elasticsearch
-    image: elasticsearch:7.5.0
-    pull: always
-    environment:
-      discovery.type: single-node
-
-  - name: smtpimap
-    image: tabascoterrier/docker-imap-devel:latest
-    pull: always
-
-steps:
-  - name: fetch-tags
-    image: docker:git
-    pull: always
-    commands:
-      - git fetch --tags --force
-    when:
-      event:
-        exclude:
-          - pull_request
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-amd64
-    pull: always
-    commands:
-      - make deps-backend
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: prepare-test-env
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    pull: always
-    commands:
-      - ./build/test-env-prepare.sh
-
-  - name: build
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - ./build/test-env-check.sh
-      - make backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: unit-test
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - make unit-test-coverage test-check
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata
-      RACE_ENABLED: true
-      GITHUB_READ_TOKEN:
-        from_secret: github_read_token
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: unit-test-gogit
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - make unit-test-coverage test-check
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata gogit
-      RACE_ENABLED: true
-      GITHUB_READ_TOKEN:
-        from_secret: github_read_token
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: test-mysql
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - make test-mysql-migration integration-test-coverage
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata
-      RACE_ENABLED: true
-      USE_REPO_TEST_DIR: 1
-      TEST_INDEXER_CODE_ES_URL: "http://elastic:changeme@elasticsearch:9200"
-    depends_on: [build]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: generate-coverage
-    image: gitea/test_env:linux-1.20-amd64
-    commands:
-      - make coverage
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata
-    depends_on: [unit-test, test-mysql]
-    when:
-      branch:
-        - main
-      event:
-        - push
-        - pull_request
-
-  - name: coverage-codecov
-    image: woodpeckerci/plugin-codecov:next-alpine
-    pull: always
-    settings:
-      files:
-        - coverage.all
-      token:
-        from_secret: codecov_token
-    depends_on: [generate-coverage]
-    when:
-      branch:
-        - main
-      event:
-        - push
-        - pull_request
-
----
-kind: pipeline
-type: docker
-name: testing-mysql8
-
-platform:
-  os: linux
-  arch: amd64
-
-depends_on:
-  - compliance
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-
-volumes:
-  - name: deps
-    temp: {}
-
-services:
-  - name: mysql8
-    image: mysql:8
-    pull: always
-    environment:
-      MYSQL_ALLOW_EMPTY_PASSWORD: yes
-      MYSQL_DATABASE: testgitea
-
-steps:
-  - name: fetch-tags
-    image: docker:git
-    pull: always
-    commands:
-      - git fetch --tags --force
-    when:
-      event:
-        exclude:
-          - pull_request
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-amd64
-    pull: always
-    commands:
-      - make deps-backend
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: prepare-test-env
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    pull: always
-    commands:
-      - ./build/test-env-prepare.sh
-
-  - name: build
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - ./build/test-env-check.sh
-      - make backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: test-mysql8
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - timeout -s ABRT 50m make test-mysql8-migration test-mysql8
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata
-      USE_REPO_TEST_DIR: 1
-    depends_on: [build]
-    volumes:
-      - name: deps
-        path: /go
-
----
-kind: pipeline
-type: docker
-name: testing-mssql
-
-platform:
-  os: linux
-  arch: amd64
-
-depends_on:
-  - compliance
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-
-volumes:
-  - name: deps
-    temp: {}
-
-services:
-  - name: mssql
-    image: mcr.microsoft.com/mssql/server:latest
-    pull: always
-    environment:
-      ACCEPT_EULA: Y
-      MSSQL_PID: Standard
-      SA_PASSWORD: MwantsaSecurePassword1
-
-steps:
-  - name: fetch-tags
-    image: docker:git
-    pull: always
-    commands:
-      - git fetch --tags --force
-    when:
-      event:
-        exclude:
-          - pull_request
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-amd64
-    pull: always
-    commands:
-      - make deps-backend
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: prepare-test-env
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    pull: always
-    commands:
-      - ./build/test-env-prepare.sh
-
-  - name: build
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - ./build/test-env-check.sh
-      - make backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: test-mssql
-    image: gitea/test_env:linux-1.20-amd64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - make test-mssql-migration test-mssql
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata
-      USE_REPO_TEST_DIR: 1
-    depends_on: [build]
-    volumes:
-      - name: deps
-        path: /go
-
----
-kind: pipeline
-name: testing-sqlite
-
-platform:
-  os: linux
-  arch: arm64
-
-depends_on:
-  - compliance
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-
-volumes:
-  - name: deps
-    temp: {}
-
-steps:
-  - name: fetch-tags
-    image: docker:git
-    pull: always
-    commands:
-      - git fetch --tags --force
-    when:
-      event:
-        exclude:
-          - pull_request
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-arm64
-    pull: always
-    commands:
-      - make deps-backend
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: prepare-test-env
-    image: gitea/test_env:linux-1.20-arm64  # https://gitea.com/gitea/test-env
-    pull: always
-    commands:
-      - ./build/test-env-prepare.sh
-
-  - name: build
-    image: gitea/test_env:linux-1.20-arm64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - ./build/test-env-check.sh
-      - make backend
-    environment:
-      GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
-      GOSUMDB: sum.golang.org
-      TAGS: bindata gogit sqlite sqlite_unlock_notify
-    depends_on: [deps-backend, prepare-test-env]
-    volumes:
-      - name: deps
-        path: /go
-
-  - name: test-sqlite
-    image: gitea/test_env:linux-1.20-arm64  # https://gitea.com/gitea/test-env
-    user: gitea
-    commands:
-      - timeout -s ABRT 50m make test-sqlite-migration test-sqlite
-    environment:
-      GOPROXY: https://goproxy.io
-      TAGS: bindata gogit sqlite sqlite_unlock_notify
-      RACE_ENABLED: true
-      TEST_TAGS: gogit sqlite sqlite_unlock_notify
-      USE_REPO_TEST_DIR: 1
-    depends_on: [build]
-    volumes:
-      - name: deps
-        path: /go
-
----
-kind: pipeline
-type: docker
-name: testing-e2e
-
-platform:
-  os: linux
-  arch: amd64
-
-depends_on:
-  - compliance
-
-trigger:
-  event:
-    - pull_request
-  paths:
-    exclude:
-      - "docs/**"
-
-volumes:
-  - name: deps
-    temp: {}
-
-steps:
-  - name: deps-frontend
-    image: node:18
-    pull: always
-    commands:
-      - make deps-frontend
-
-  - name: build-frontend
-    image: node:18
-    commands:
-      - make frontend
-    depends_on: [deps-frontend]
-
-  - name: deps-backend
-    image: gitea/test_env:linux-1.20-amd64
-    pull: always
-    commands:
-      - make deps-backend
-    volumes:
-      - name: deps
-        path: /go
-
-  # TODO: We should probably build all dependencies into a test image
-  - name: test-e2e
-    image: mcr.microsoft.com/playwright:v1.32.3-focal
-    commands:
-      - apt-get -qq update && apt-get -qqy install jq build-essential
-      - curl -fsSL "https://go.dev/dl/$(curl -s 'https://go.dev/dl/?mode=json' | jq -r '.[].version' | sort -Vr | head -1).linux-amd64.tar.gz" | tar -xz -C /usr/local
-      - groupadd --gid 1001 gitea && useradd -m --gid 1001 --uid 1001 gitea
-      - ./build/test-env-prepare.sh
-      - su gitea bash -c "export PATH=$PATH:/usr/local/go/bin && timeout -s ABRT 40m make test-e2e-sqlite"
-    environment:
-      GOPROXY: https://goproxy.io
-      GOSUMDB: sum.golang.org
-      USE_REPO_TEST_DIR: 1
-      DEBIAN_FRONTEND: noninteractive
-    depends_on: [build-frontend, deps-backend]
-    volumes:
-      - name: deps
-        path: /go
-
 ---
 kind: pipeline
 type: docker
@@ -767,13 +21,6 @@ trigger:
     exclude:
       - "docs/**"
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 volumes:
   - name: deps
     temp: {}
@@ -902,13 +149,6 @@ trigger:
   event:
     - tag
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 volumes:
   - name: deps
     temp: {}
@@ -1013,22 +253,12 @@ platform:
   os: linux
   arch: amd64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
     include:
       - "refs/tags/**"
     exclude:
       - "refs/tags/**-rc*"
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
@@ -1093,19 +323,9 @@ platform:
   os: linux
   arch: amd64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
     - "refs/tags/**-rc*"
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
@@ -1168,19 +388,9 @@ platform:
   os: linux
   arch: amd64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
   - refs/heads/main
-  event:
-    exclude:
-    - cron
 
 steps:
   - name: fetch-tags
@@ -1241,19 +451,9 @@ platform:
   os: linux
   arch: amd64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
   - "refs/heads/release/v*"
-  event:
-    exclude:
-    - cron
 
 steps:
   - name: fetch-tags
@@ -1315,22 +515,12 @@ platform:
   os: linux
   arch: arm64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
     include:
       - "refs/tags/**"
     exclude:
       - "refs/tags/**-rc*"
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
@@ -1395,19 +585,9 @@ platform:
   os: linux
   arch: arm64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
     - "refs/tags/**-rc*"
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
@@ -1470,19 +650,9 @@ platform:
   os: linux
   arch: arm64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
   - refs/heads/main
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
@@ -1546,19 +716,9 @@ platform:
   os: linux
   arch: arm64
 
-depends_on:
-  - testing-mysql
-  - testing-mysql8
-  - testing-mssql
-  - testing-pgsql
-  - testing-sqlite
-
 trigger:
   ref:
   - "refs/heads/release/v*"
-  event:
-    exclude:
-    - cron
 
 steps:
   - name: fetch-tags
@@ -1647,9 +807,6 @@ steps:
 trigger:
   ref:
   - "refs/tags/**"
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
@@ -1697,9 +854,6 @@ trigger:
   ref:
   - refs/heads/main
   - "refs/heads/release/v*"
-  event:
-    exclude:
-    - cron
   paths:
     exclude:
       - "docs/**"
diff --git a/.github/workflows/cron-licenses.yml b/.github/workflows/cron-licenses.yml
index 116b8dd095..7239078710 100644
--- a/.github/workflows/cron-licenses.yml
+++ b/.github/workflows/cron-licenses.yml
@@ -1,10 +1,10 @@
+name: "Cron: Update licenses and gitignores"
+
 on:
   schedule:
     # weekly on Monday at 0:07 UTC
     - cron: "7 0 * * 1"
 
-name: Update licenses and gitignores
-
 jobs:
   cron:
     runs-on: ubuntu-latest
diff --git a/.github/workflows/cron-translations.yml b/.github/workflows/cron-translations.yml
index 31262fd3dd..c83450d2e6 100644
--- a/.github/workflows/cron-translations.yml
+++ b/.github/workflows/cron-translations.yml
@@ -1,9 +1,9 @@
+name: "Cron: Pull translations from Crowdin"
+
 on:
   schedule:
     - cron: "7 0 * * *" # every day at 0:07 UTC
 
-name: Pull translations from Crowdin
-
 jobs:
   crowdin_pull:
     runs-on: ubuntu-latest
diff --git a/.github/workflows/pull-compliance.yml b/.github/workflows/pull-compliance.yml
new file mode 100644
index 0000000000..1239b9caa7
--- /dev/null
+++ b/.github/workflows/pull-compliance.yml
@@ -0,0 +1,133 @@
+name: "Pull: Compliance Tests"
+
+on: [pull_request]
+
+jobs:
+  lint_basic:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20'
+      - name: deps-backend
+        run: make deps-backend deps-tools
+      - name: lint backend
+        run: make lint-backend
+        env:
+          GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
+          GOSUMDB: sum.golang.org
+          TAGS: bindata sqlite sqlite_unlock_notify
+  lint_windows:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20'
+      - name: deps-backend
+        run: make deps-backend deps-tools
+      - name: lint-backend-windows
+        run: make lint-go-windows lint-go-vet
+        env:
+          GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
+          GOSUMDB: sum.golang.org
+          TAGS: bindata sqlite sqlite_unlock_notify
+          GOOS: windows
+          GOARCH: amd64
+  lint_gogit:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20'
+      - name: deps-backend
+        run: make deps-backend deps-tools
+      - name: lint-backend-gogit
+        run: make lint-backend
+        env:
+          GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
+          GOSUMDB: sum.golang.org
+          TAGS: bindata gogit sqlite sqlite_unlock_notify
+      - name: checks backend
+        run: make --always-make checks-backend # ensure the 'go-licenses' make target runs
+  check_backend:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20'
+      - name: deps-backend
+        run: make deps-backend deps-tools
+      - name: checks backend
+        run: make --always-make checks-backend # ensure the 'go-licenses' make target runs
+  frontend:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup node
+        uses: actions/setup-node@v3
+        with:
+          node-version: 18
+      - name: deps-frontend
+        run: make deps-frontend
+      - name: lint frontend
+        run: make lint-frontend
+      - name: checks frontend
+        run: make checks-frontend
+      - name: test frontend
+        run: make test-frontend
+  backend:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20'
+      - name: setup node
+        uses: actions/setup-node@v3
+        with:
+          node-version: 18
+      - name: deps-backend
+        run: make deps-backend deps-tools
+      - name: deps-frontend
+        run: make deps-frontend
+      - name: build frontend
+        run: make frontend
+      - name: build-backend-no-gcc
+        run: go build -o gitea_no_gcc # test if build succeeds without the sqlite tag
+        env:
+          GOPROXY: https://goproxy.io
+      - name: build-backend-arm64
+        run: make backend # test cross compile
+        env:
+          GOPROXY: https://goproxy.io
+          GOOS: linux
+          GOARCH: arm64
+          TAGS: bindata gogit
+      - name: build-backend-windows
+        run: go build -o gitea_windows
+        env:
+          GOPROXY: https://goproxy.io
+          GOOS: windows
+          GOARCH: amd64
+          TAGS: bindata gogit
+      - name: build-backend-386
+        run: go build -o gitea_linux_386 # test if compatible with 32 bit
+        env:
+          GOPROXY: https://goproxy.io
+          GOOS: linux
+          GOARCH: 386
diff --git a/.github/workflows/pull-compliance_docs.yml b/.github/workflows/pull-compliance_docs.yml
index e3c3a42541..679e925515 100644
--- a/.github/workflows/pull-compliance_docs.yml
+++ b/.github/workflows/pull-compliance_docs.yml
@@ -1,4 +1,4 @@
-name: Compliance testing for documentation
+name: "Pull: Compliance testing for documentation"
 
 on:
   pull_request:
diff --git a/.github/workflows/pull-db_test.yml b/.github/workflows/pull-db_test.yml
new file mode 100644
index 0000000000..3cae4df039
--- /dev/null
+++ b/.github/workflows/pull-db_test.yml
@@ -0,0 +1,260 @@
+name: "Pull: Database Tests"
+
+on: [pull_request]
+
+jobs:
+  # PostgreSQL Tests
+  db_pgsql_test:
+    runs-on: ubuntu-latest
+    services:
+      pgsql:
+        image: postgres:15
+        env:
+          POSTGRES_DB: test
+          POSTGRES_PASSWORD: postgres
+        ports:
+          - "5432:5432"
+      ldap:
+        image: gitea/test-openldap:latest
+        ports:
+          - "389:389"
+          - "636:636"
+      minio:
+        # as github actions doesn't support "entrypoint", we need to use a non-official image
+        # that has a custom entrypoint set to "minio server /data"
+        image: bitnami/minio:2021.3.17
+        env:
+          MINIO_ACCESS_KEY: 123456
+          MINIO_SECRET_KEY: 12345678
+        ports:
+          - "9000:9000"
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20.0'
+      - name: Add hosts to /etc/hosts
+        run: echo "127.0.0.1 pgsql ldap minio" | sudo tee -a /etc/hosts
+      - name: install dependencies
+        run: make deps-backend
+      - name: build
+        run: make backend
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          TAGS: bindata
+      - name: run tests
+        run: timeout -s ABRT 50m make test-pgsql-migration test-pgsql
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata gogit
+          RACE_ENABLED: true
+          TEST_TAGS: gogit
+          TEST_LDAP: 1
+          USE_REPO_TEST_DIR: 1
+
+  # SQLite Tests
+  db_sqlite_test:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20.0'
+      - name: install dependencies
+        run: make deps-backend
+      - name: build
+        run: make backend
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          TAGS: bindata gogit sqlite sqlite_unlock_notify
+      - name: run tests
+        run: timeout -s ABRT 50m make test-sqlite-migration test-sqlite
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata gogit sqlite sqlite_unlock_notify
+          RACE_ENABLED: true
+          TEST_TAGS: gogit sqlite sqlite_unlock_notify
+          USE_REPO_TEST_DIR: 1
+
+  # Unit Tests
+  db_unit_tests:
+    runs-on: ubuntu-latest
+    services:
+      mysql:
+        image: mysql:5.7
+        env:
+          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_DATABASE: test
+        ports:
+          - "3306:3306"
+      elasticsearch:
+        image: elasticsearch:7.5.0
+        env:
+          discovery.type: single-node
+        ports:
+          - "9200:9200"
+      smtpimap:
+        image: tabascoterrier/docker-imap-devel:latest
+        ports:
+          - "25:25"
+          - "143:143"
+          - "587:587"
+          - "993:993"
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20.0'
+      - name: Add hosts to /etc/hosts
+        run: echo "127.0.0.1 mysql elasticsearch smtpimap" | sudo tee -a /etc/hosts
+      - name: install dependencies
+        run: make deps-backend
+      - name: build
+        run: make backend
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          TAGS: bindata
+      - name: unit tests
+        run: make unit-test-coverage test-check
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata
+          RACE_ENABLED: true
+          GITHUB_READ_TOKEN: ${{ secrets.GITHUB_READ_TOKEN }}
+      - name: unit tests (gogit)
+        run: make unit-test-coverage test-check
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata gogit
+          RACE_ENABLED: true
+          GITHUB_READ_TOKEN: ${{ secrets.GITHUB_READ_TOKEN }}
+
+  # MySQL Tests
+  db_mysql_test:
+    runs-on: ubuntu-latest
+    services:
+      mysql:
+        image: mysql:5.7
+        env:
+          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_DATABASE: test
+        ports:
+          - "3306:3306"
+      elasticsearch:
+        image: elasticsearch:7.5.0
+        env:
+          discovery.type: single-node
+        ports:
+          - "9200:9200"
+      smtpimap:
+        image: tabascoterrier/docker-imap-devel:latest
+        ports:
+          - "25:25"
+          - "143:143"
+          - "587:587"
+          - "993:993"
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20.0'
+      - name: Add hosts to /etc/hosts
+        run: echo "127.0.0.1 mysql elasticsearch smtpimap" | sudo tee -a /etc/hosts
+      - name: install dependencies
+        run: make deps-backend
+      - name: build
+        run: make backend
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          TAGS: bindata
+      - name: run tests
+        run: make test-mysql-migration integration-test-coverage
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata
+          RACE_ENABLED: true
+          USE_REPO_TEST_DIR: 1
+          TEST_INDEXER_CODE_ES_URL: "http://elastic:changeme@elasticsearch:9200"
+
+  # MySQL8 Tests
+  db_mysql8_test:
+    runs-on: ubuntu-latest
+    services:
+      mysql8:
+        image: mysql:8
+        env:
+          MYSQL_ALLOW_EMPTY_PASSWORD: yes
+          MYSQL_DATABASE: testgitea
+        ports:
+          - "3306:3306"
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20.0'
+      - name: Add hosts to /etc/hosts
+        run: echo "127.0.0.1 mysql8" | sudo tee -a /etc/hosts
+      - name: install dependencies
+        run: make deps-backend
+      - name: build
+        run: make backend
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          TAGS: bindata
+      - name: run tests
+        run: timeout -s ABRT 50m make test-mysql8-migration test-mysql8
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata
+          USE_REPO_TEST_DIR: 1
+
+  # MSSQL Tests
+  db_mssql_test:
+    runs-on: ubuntu-latest
+    services:
+      mssql:
+        image: mcr.microsoft.com/mssql/server:latest
+        env:
+          ACCEPT_EULA: Y
+          MSSQL_PID: Standard
+          SA_PASSWORD: MwantsaSecurePassword1
+        ports:
+          - "1433:1433"
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20.0'
+      - name: Add hosts to /etc/hosts
+        run: echo "127.0.0.1 mssql" | sudo tee -a /etc/hosts
+      - name: install dependencies
+        run: make deps-backend
+      - name: build
+        run: make backend
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          TAGS: bindata
+      - name: run tests
+        run: timeout -s ABRT 50m make test-mssql-migration test-mssql
+        env:
+          GOPROXY: https://goproxy.io
+          TAGS: bindata
+          USE_REPO_TEST_DIR: 1
diff --git a/.github/workflows/pull-docker_dryrun.yml b/.github/workflows/pull-docker_dryrun.yml
index 719668db81..8e5acb3cee 100644
--- a/.github/workflows/pull-docker_dryrun.yml
+++ b/.github/workflows/pull-docker_dryrun.yml
@@ -1,4 +1,4 @@
-name: Docker build dry run
+name: "Pull: Docker Dry Run"
 
 on: [pull_request]
 
diff --git a/.github/workflows/pull-e2e.yml b/.github/workflows/pull-e2e.yml
new file mode 100644
index 0000000000..2cd6bd0d6a
--- /dev/null
+++ b/.github/workflows/pull-e2e.yml
@@ -0,0 +1,28 @@
+name: "Pull: E2E Tests"
+
+on: [pull_request]
+
+jobs:
+  e2e_tests:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v3
+      - name: setup go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '>=1.20'
+      - name: setup node
+        uses: actions/setup-node@v3
+        with:
+          node-version: 18
+      - name: build
+        run: make deps-frontend frontend deps-backend
+      - name: Install playwright browsers
+        run: npx playwright install --with-deps
+      - name: run tests
+        run: timeout -s ABRT 40m make test-e2e-sqlite
+        env:
+          GOPROXY: https://goproxy.io
+          GOSUMDB: sum.golang.org
+          USE_REPO_TEST_DIR: 1
diff --git a/.github/workflows/push-publish_docs.yml b/.github/workflows/push-publish_docs.yml
index 579157ccd8..9037e278ca 100644
--- a/.github/workflows/push-publish_docs.yml
+++ b/.github/workflows/push-publish_docs.yml
@@ -1,4 +1,4 @@
-name: Publish documentation
+name: "Docs: Publish"
 
 on:
   push: