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