ci-demo (Gitea) — учебный стенд CI к лекции 9

Мини-проект к лекции «Метрики сложности и CI» (неделя 9, ../09l_л_Метрики_сложности.md). Домен — «калькулятор скидок», чтобы студенты узнавали код из практики.

CI

Замените gitea.example.com и OWNER на ваш сервер и логин.

Что внутри

app/
  discounts.py        # стратегии скидок: regular / vip / employee
  service.py          # OrderService — контекст, делегирует скидке
  legacy_report.py    # функция ранга C — для метрического гейта
tests/
  test_discounts.py   # 5 тестов, включая проверку версии Python для матрицы
  test_legacy_report.py
.gitea/workflows/
  ci.yml              # lint → test (coverage) → metrics (radon + xenon)
workflows_заготовки/
  ci-metrics-strict.yml  # тот же пайплайн, но xenon --max-absolute B (красный)
  ci-matrix.yml          # матрица 3.11/3.12/3.13, fail-fast: false
  ci-artifacts.yml       # артефакт coverage.xml
  bad.yml                # «плохой» workflow с || true

Локальный запуск

python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
pytest -q --cov=app --cov-branch --cov-fail-under=60
ruff check .
radon cc app -s -a
xenon --max-absolute C app/    # зелёный: legacy_report.py ранга C
xenon --max-absolute B app/    # красный: гейт не пропускает C

Требования к серверу Gitea

Gitea 1.19+ с включёнными Actions (app.ini: [actions] ENABLED = true); act_runner онлайн с меткой ubuntu-latest.

Как развернуть стенд

  1. Создайте пустой репозиторий ci-demo на сервере Gitea.
  2. Содержимое этой папки — корень репозитория:
git init
git add .
git commit -m "Стартовый каркас демо"
git branch -M main
git remote add origin https://gitea.example.com/OWNER/ci-demo.git
git push -u origin main
  1. Замените gitea.example.com и OWNER в бейдже README.
  2. Дождитесь первого прогона CI (act_runner прогреет кеш pip).
  3. Настройте защиту ветки main: обязательные проверки lint, test, metrics (Status Check Contexts), запрет force-push.

Отличия Gitea-варианта

  • workflow лежит в .gitea/workflows/ci.yml;
  • прогоны выполняет act_runner;
  • кеш и артефакты зависят от версии Gitea: заготовки это учитывают.

Метрический гейт

app/legacy_report.py намеренно содержит функцию ранга C (V(G) = 17). Основной workflow использует xenon --max-absolute C и остаётся зелёным. Строгая заготовка ci-metrics-strict.yml поднимает планку до B — сборка красная. Это и есть демонстрация «метрика работает, когда её нельзя игнорировать»: порог в CI делает рост сложности блокирующим.

Важно

Стенд учебный: секреты, деплой и реальные данные здесь не используются. «Плохой» workflow из workflows_заготовки/bad.yml запускать только в этом демо-репозитории. CI trigger 2026-11-12T14:25:56.0739892+08:00 CI trigger 2026-11-12T14:31:25.5544331+08:00 CI trigger 2026-11-12T15:27:18.8774138+08:00

Description
Демо CI: GitHub/Gitea Actions
Readme 183 KiB
Languages
Python 100%