CI demo: metrics + Gitea Actions
This commit is contained in:
83
README.md
Normal file
83
README.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# 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` запускать только в этом
|
||||
демо-репозитории.
|
||||
Reference in New Issue
Block a user