name: CI # Гейт качества на каждый PR и push в dev/main — как в Vobot (.gitea/workflows/backend.yml). # CD (.gitea/workflows/deploy.yml) тесты не гоняет: они прошли здесь, на PR. on: push: branches: [dev, main] pull_request: branches: [dev, main] concurrency: group: ci-${{ github.ref }} cancel-in-progress: true jobs: lint-and-test: # Имя джоба — контекст статуса в PR; если включать branch protection, требовать именно его. name: ruff · mypy · pytest runs-on: ubuntu-latest services: postgres: image: postgres:16-alpine env: POSTGRES_DB: tgit_test POSTGRES_USER: tgit POSTGRES_PASSWORD: tgit options: >- --health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 10 # без маппинга портов: act_runner запускает job в контейнере, сервис доступен по имени `postgres` # (опыт Vobot: маппинг 5432 на хост конфликтует с postgres самого Gitea) steps: - uses: actions/checkout@v4 - name: Setup Python 3.12 uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install uv # pip, а не astral-sh/setup-uv: на self-hosted Gitea экшен ходит в GitHub API и падает (опыт Vobot) run: pip install uv - name: Install deps run: uv sync --frozen - name: Ruff run: | uv run ruff check . uv run ruff format --check . - name: Mypy run: uv run mypy - name: Migrations on PostgreSQL — up, down, up # pytest гоняет схему на SQLite; здесь — настоящий Postgres: JSONB, BIGINT, CHECK, откат env: DATABASE_URL: postgresql+asyncpg://tgit:tgit@postgres:5432/tgit_test run: | uv run alembic upgrade head uv run alembic downgrade base uv run alembic upgrade head - name: Pytest (+ порог покрытия из pyproject) run: | git config --global user.name ci git config --global user.email ci@ci uv run pytest -q --cov --cov-report=term