CI demo: metrics + Gitea Actions

This commit is contained in:
2026-11-12 13:55:02 +08:00
commit 6637fb8ff4
17 changed files with 564 additions and 0 deletions

83
README.md Normal file
View File

@@ -0,0 +1,83 @@
# ci-demo (Gitea) — учебный стенд CI к лекции 9
Мини-проект к лекции «Метрики сложности и CI» (неделя 9, `../09l_л_Метрики_сложности.md`).
Домен — «калькулятор скидок», чтобы студенты узнавали код из практики.
[![CI](https://gitea.example.com/OWNER/ci-demo/actions/workflows/ci.yml/badge.svg?branch=main)](https://gitea.example.com/OWNER/ci-demo/actions)
> Замените `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
```
## Локальный запуск
```powershell
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. Содержимое этой папки — корень репозитория:
```powershell
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
```
3. Замените `gitea.example.com` и `OWNER` в бейдже README.
4. Дождитесь первого прогона CI (act_runner прогреет кеш pip).
5. Настройте защиту ветки `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` запускать только в этом
демо-репозитории.