From 5d50401d40a6d8f9b6da915db3ec43aa0567319e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E9=A3=8E?= Date: Mon, 11 May 2026 10:33:38 +0800 Subject: [PATCH] ci(gitea): add offline-friendly test workflows and deploy on bt Co-authored-by: Cursor --- .gitea/workflows/deploy.yml | 1 + .gitea/workflows/playwright.yml | 98 ++++++++++++++++++++++++ .gitea/workflows/test-backend.yml | 44 +++++++++++ .gitea/workflows/test-docker-compose.yml | 31 ++++++++ 4 files changed, 174 insertions(+) create mode 100644 .gitea/workflows/playwright.yml create mode 100644 .gitea/workflows/test-backend.yml create mode 100644 .gitea/workflows/test-docker-compose.yml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index ea943ab..eb87c52 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - bt jobs: deploy: diff --git a/.gitea/workflows/playwright.yml b/.gitea/workflows/playwright.yml new file mode 100644 index 0000000..bc768c3 --- /dev/null +++ b/.gitea/workflows/playwright.yml @@ -0,0 +1,98 @@ +name: Playwright Tests + +on: + push: + branches: + - main + - bt + pull_request: + types: + - opened + - synchronize + workflow_dispatch: + +jobs: + test-playwright: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - name: Checkout + run: | + set -euo pipefail + git clone "http://172.17.0.1:3000/${{ github.repository }}.git" . + git checkout "${{ github.sha }}" + + - name: Detect relevant file changes + id: changes + run: | + set -euo pipefail + CHANGED=false + + if [ "${{ github.event_name }}" = "pull_request" ]; then + BASE="${{ github.base_ref }}" + git fetch origin "+refs/heads/${BASE}:refs/remotes/origin/${BASE}" --depth=200 2>/dev/null \ + || git fetch origin --depth=200 + if git rev-parse "origin/${BASE}" >/dev/null 2>&1; then + FILES=$(git diff --name-only "origin/${BASE}...HEAD" || true) + else + FILES=$(git show --name-only --pretty=format: HEAD) + fi + else + BEFORE="${{ github.event.before }}" + if [ -z "${BEFORE}" ] || [ "${BEFORE}" = "0000000000000000000000000000000000000000" ]; then + FILES=$(git show --name-only --pretty=format: HEAD) + else + FILES=$(git diff --name-only "${BEFORE}" "${{ github.sha }}" || true) + fi + fi + + while IFS= read -r line; do + [ -z "${line}" ] && continue + case "${line}" in + backend/*|frontend/*|.env|compose*|.gitea/workflows/playwright.yml|.github/workflows/playwright.yml) + CHANGED=true + break + ;; + esac + done <<< "${FILES}" + + echo "changed=${CHANGED}" >> "${GITHUB_OUTPUT}" + echo "Relevant changes for Playwright: ${CHANGED}" + + - name: Skip Playwright (no relevant changes) + if: steps.changes.outputs.changed != 'true' + run: echo "Skipping Playwright — no changes under backend/, frontend/, compose, .env, or playwright workflows." + + - name: Install uv and Bun + if: steps.changes.outputs.changed == 'true' + run: | + set -euo pipefail + export PATH="${HOME}/.local/bin:${HOME}/.bun/bin:${PATH}" + export UV_PYTHON_DOWNLOADS=automatic + + sudo apt-get update -qq + sudo apt-get install -y python3 python3-pip python3-venv curl unzip ca-certificates + + python3 -m pip install --user --upgrade pip + python3 -m pip install --user "uv>=0.4" + + # Official Bun installer (not GitHub Actions) + curl -fsSL https://bun.sh/install | bash + + - name: Generate client, build images, run Playwright + if: steps.changes.outputs.changed == 'true' + run: | + set -euo pipefail + export PATH="${HOME}/.local/bin:${HOME}/.bun/bin:${PATH}" + export BUN_INSTALL="${HOME}/.bun" + + (cd backend && uv sync) + bun ci + bash scripts/generate-client.sh + + docker compose build + docker compose down -v --remove-orphans || true + docker compose run --rm playwright bunx playwright test \ + --fail-on-flaky-tests \ + --trace=retain-on-failure + docker compose down -v --remove-orphans || true diff --git a/.gitea/workflows/test-backend.yml b/.gitea/workflows/test-backend.yml new file mode 100644 index 0000000..449b37b --- /dev/null +++ b/.gitea/workflows/test-backend.yml @@ -0,0 +1,44 @@ +name: Test Backend + +on: + push: + branches: + - main + - bt + pull_request: + types: + - opened + - synchronize + +jobs: + test-backend: + runs-on: ubuntu-latest + steps: + - name: Checkout and run backend tests + run: | + set -euo pipefail + export PATH="${HOME}/.local/bin:${PATH}" + export UV_PYTHON_DOWNLOADS=automatic + + git clone "http://172.17.0.1:3000/${{ github.repository }}.git" . + git checkout "${{ github.sha }}" + + sudo apt-get update -qq + sudo apt-get install -y python3 python3-pip python3-venv ca-certificates + + python3 -m pip install --user --upgrade pip + python3 -m pip install --user "uv>=0.4" + + docker compose down -v --remove-orphans || true + docker compose up -d db mailcatcher + + (cd backend && uv run bash scripts/prestart.sh) + (cd backend && uv run bash scripts/tests-start.sh "Coverage for ${{ github.sha }}") + + docker compose down -v --remove-orphans || true + + if [ -d backend/htmlcov ]; then + echo "Coverage HTML generated under backend/htmlcov (view on runner if needed)." + fi + + (cd backend && uv run coverage report --fail-under=90) diff --git a/.gitea/workflows/test-docker-compose.yml b/.gitea/workflows/test-docker-compose.yml new file mode 100644 index 0000000..913d94f --- /dev/null +++ b/.gitea/workflows/test-docker-compose.yml @@ -0,0 +1,31 @@ +name: Test Docker Compose + +on: + push: + branches: + - main + - bt + pull_request: + types: + - opened + - synchronize + +jobs: + test-docker-compose: + runs-on: ubuntu-latest + steps: + - name: Checkout and verify compose stack + run: | + set -euo pipefail + + git clone "http://172.17.0.1:3000/${{ github.repository }}.git" . + git checkout "${{ github.sha }}" + + docker compose build + docker compose down -v --remove-orphans || true + docker compose up -d --wait backend frontend adminer + + curl -fsS http://localhost:8000/api/v1/utils/health-check + curl -fsS http://localhost:5173 + + docker compose down -v --remove-orphans || true