ci: setup Woodpecker CI pipeline with parallel jobs, volume cache, and E2E support

This commit is contained in:
2026-05-09 19:51:15 +03:00
parent cf4982c0e5
commit 7270d544a5
5 changed files with 90 additions and 41 deletions

View File

@@ -1,14 +0,0 @@
when:
- event: [push, pull_request]
branch: dev
steps:
- name: lint
image: python:3.13
commands:
- pip install uv
- uv sync --no-dev --only-group lints
- uv run ruff check .
- uv run ruff format --check .
- uv run isort --check-only .

89
.woodpecker/pipeline.yml Normal file
View File

@@ -0,0 +1,89 @@
when:
event: [push, pull_request]
branch: [dev, main, master]
steps:
- name: deps
image: python:3.13
volumes:
- /tmp/uv-cache:/root/.cache/uv
environment:
UV_CACHE_DIR: /root/.cache/uv
UV_LINK_MODE: copy
UV_PYTHON: "3.13"
commands:
- pip install uv
- cd ..
- |
cat > pyproject.toml << 'EOF'
[project]
name = "pyaqa"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = []
[tool.uv.workspace]
members = ["blog.pyaqa.ru", "pytfm"]
EOF
- git clone https://git.pyaqa.ru/pi3c/pytfm.git
- cd $CI_WORKSPACE
- rm -rf .venv
- uv sync --group lints --group tests --group types --group dev
- name: lint
image: python:3.13
volumes:
- /tmp/uv-cache:/root/.cache/uv
environment:
UV_CACHE_DIR: /root/.cache/uv
UV_LINK_MODE: copy
UV_PYTHON: "3.13"
depends_on: [deps]
commands:
- pip install uv
- uv run --no-sync ruff check .
- uv run --no-sync ruff format --check .
- uv run --no-sync isort --check-only .
- name: type
image: python:3.13
volumes:
- /tmp/uv-cache:/root/.cache/uv
environment:
UV_CACHE_DIR: /root/.cache/uv
UV_LINK_MODE: copy
UV_PYTHON: "3.13"
depends_on: [deps]
commands:
- pip install uv
- uv run --no-sync mypy .
- name: test-unit
image: python:3.13
volumes:
- /tmp/uv-cache:/root/.cache/uv
environment:
UV_CACHE_DIR: /root/.cache/uv
UV_LINK_MODE: copy
UV_PYTHON: "3.13"
depends_on: [deps]
commands:
- pip install uv
- uv run --no-sync pytest tests/unit/
- name: test-e2e
image: python:3.13
volumes:
- /tmp/uv-cache:/root/.cache/uv
environment:
UV_CACHE_DIR: /root/.cache/uv
UV_LINK_MODE: copy
UV_PYTHON: "3.13"
depends_on: [deps]
commands:
- pip install uv
- apt-get update && apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2
- uv run --no-sync playwright install chromium
- uv run --no-sync blog &
- sleep 5
- uv run --no-sync pytest tests/e2e/ -v --no-cov

View File

@@ -1,11 +0,0 @@
when:
- event: [push, pull_request]
branch: dev
steps:
- name: test
image: python:3.13
commands:
- pip install uv
- uv sync --no-dev --group tests
- uv run pytest --cov=app --cov-fail-under=70 --cov-report=term-missing

View File

@@ -1,11 +0,0 @@
when:
- event: [push, pull_request]
branch: dev
steps:
- name: type
image: python:3.13
commands:
- pip install uv
- uv sync --no-dev --only-group types
- uv run mypy .

View File

@@ -48,14 +48,11 @@ tests = [
"pytfm", "pytfm",
] ]
lints = [ lints = [
"black>=23.7.0",
"ruff>=0.15.11", "ruff>=0.15.11",
"isort>=8.0.1", "isort>=8.0.1",
] ]
types = [ types = [
"mimesis>=19.1.0",
"mypy>=1.20.1", "mypy>=1.20.1",
"pytfm",
] ]
[project.scripts] [project.scripts]
@@ -66,11 +63,10 @@ pytfm = { workspace = true }
[tool.pytest.ini_options] [tool.pytest.ini_options]
asyncio_mode = "auto" asyncio_mode = "auto"
addopts = "--cov=app --cov-report=term-missing --cov-report=html" addopts = "--cov=app --cov-fail-under=70 --cov-report=term-missing --cov-report=html"
pythonpath = "." pythonpath = "."
testpaths = "tests" testpaths = "tests"
xfail_strict = true xfail_strict = true
exclude = ["tests/e2e"]
markers = [ markers = [
"e2e: End-to-end tests requiring running server", "e2e: End-to-end tests requiring running server",
] ]