91 lines
4.1 KiB
Markdown
91 lines
4.1 KiB
Markdown
# ci-demo (Gitea) — учебный стенд CI к лекции 9
|
||
|
||
Мини-проект к лекции «Метрики сложности и CI» (неделя 9, `../09l_л_Метрики_сложности.md`).
|
||
Домен — «калькулятор скидок», чтобы студенты узнавали код из практики.
|
||
|
||
[](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` запускать только в этом
|
||
демо-репозитории.
|
||
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
|
||
C |