ci-demo (Gitea) — учебный стенд CI к лекции 9
Мини-проект к лекции «Метрики сложности и CI» (неделя 9, ../09l_л_Метрики_сложности.md).
Домен — «калькулятор скидок», чтобы студенты узнавали код из практики.
Замените
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.
Как развернуть стенд
- Создайте пустой репозиторий
ci-demoна сервере Gitea. - Содержимое этой папки — корень репозитория:
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
- Замените
gitea.example.comиOWNERв бейдже README. - Дождитесь первого прогона CI (act_runner прогреет кеш pip).
- Настройте защиту ветки
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