Files
ci-demo/README.md

91 lines
4.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` запускать только в этом
демо-репозитории.
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
CI
trigger
%DATE%
%TIME%