# Сценарий демонстрации CI на лекции (Gitea Actions) **К дисциплине**: «Современные технологии разработки программного обеспечения» (СТРПО), неделя 9 **Основа**: лекция `../09l_л_Метрики_сложности.md`, блок CI (слайды 18–24) **Стенд**: эта папка `Демо_CI_Gitea`; GitHub-версия — `../Демо_CI` (мини-проект «калькулятор скидок») **Длительность**: 10–12 минут; бонусные акты — ещё 4 минуты **Формат**: живой показ на проекторе; реплики лектора — в блоках «Что говорить» ## Карта актов ↔ слайды лекции | Акт | Что показываем | Слайд | |---|---|---| | 0 | Подготовка стенда (до лекции) | — | | 1 | Зелёный локальный прогон, устройство пайплайна | «GitHub Actions: минимальный workflow» | | 2 | Красный PR, лог падения, merge заблокирован | «Падай рано: правило 10 минут» | | 3 | Лечение теста, зелёный прогон, merge, бейдж | «GitHub Actions: минимальный workflow» | | 4 | Метрический гейт: `radon` + `xenon` | «Метрики в CI» | | Бонус | Кеш, матрица, артефакты, «плохой» CI | «Стадии пайплайна» | ## Отличия Gitea-варианта - workflow лежит в `.gitea/workflows/ci.yml`; - прогоны выполняет act_runner; - защита ветки — Status Check Contexts в Settings → Branches. ## Акт 0. Подготовка (до лекции, 15–20 минут) 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.md`. 4. Прогрейте кеш: дождитесь зелёного первого прогона act_runner. 5. Защита ветки: обязательные Status Check Contexts `lint`, `test`, `metrics`. **Чек-лист готовности:** первый прогон зелёный; проверки `lint`, `test`, `metrics` видны в branch protection; кеш прогрет. ## Акт 1. Зелёный старт (1–2 мин) Покажите структуру: `app/`, `tests/`, `.gitea/workflows/ci.yml`. Запустите локально: ```powershell pytest -q ``` **Ожидаемо:** все тесты зелёные (сейчас 19). Откройте Actions — последний прогон на `main` зелёный. **Что говорить.** «Локально зелёный — и в CI зелёный. CI не делает ничего волшебного: он повторяет те же шаги — checkout, Python, зависимости, pytest. Workflow — ваш локальный ритуал, записанный в YAML». Покажите `ci.yml`: `on:` — триггер, `jobs.lint` — стиль, `jobs.test` — тесты с порогом покрытия, `jobs.metrics` — `radon` и `xenon`, `needs` — порядок и гейт. ## Акт 2. Красный PR (3 мин) ```powershell git switch -c feature/vip-095 ``` В `app/discounts.py` измените скидку VIP: `return total * 0.9` → `return total * 0.95`. Тесты не трогайте. ```powershell git add -A git commit -m "VIP: скидка 0.95 (требование изменено)" git push -u origin feature/vip-095 ``` Откройте PR: `lint` — зелёный, `test` — красный, `metrics` — не запускается. В логе видно `assert ... pytest.approx(900.0)` и фактическое `950.0`. Кнопка merge заблокирована. **Что говорить.** «Тест красный — merge нельзя. Это подарок: ошибка поймана за минуту. Красная main — stop-the-line. Упал только `test`; `lint` прошёл и не ждал тестов: быстрые проверки — первыми». ## Акт 3. Лечим тест, мёржим (2 мин) **Спросите:** что правильнее — вернуть код или обновить тест? Ответ: требование изменилось, значит меняется тест. В `tests/test_discounts.py`: `pytest.approx(900.0)` → `pytest.approx(950.0)`. ```powershell git commit -am "Тест VIP приведён к новому требованию 0.95" git push ``` Дождитесь зелёного прогона и нажмите Merge. Покажите бейдж в README. **Что говорить.** «Зелёная галочка на PR — Definition of Done в действии: код, ревью, зелёный CI, merge. Без гейта DoD — просто список пожеланий». ## Акт 4. Метрический гейт (2–3 мин) **Действия.** ```powershell radon cc app -s -a xenon --max-absolute C app/ ``` **Ожидаемо:** `legacy_report.py:12 classify_order — C (17)`, гейт C зелёный. Теперь скопируйте строгую заготовку: ```powershell Copy-Item workflows_заготовки/ci-metrics-strict.yml .gitea/workflows/ci.yml git switch -c demo/strict-metrics git add . git commit -m "Демо: строгий метрический гейт" git push -u origin demo/strict-metrics ``` В PR `metrics` красный: `xenon --max-absolute B` не пропускает ранг C. PR закройте, верните основной workflow. **Что говорить.** «Метрика работает, когда её нельзя игнорировать. Порог C пропускает функцию сложности 17; порог B — нет. Рост сложности становится видимым и блокирующим, а не темой для спора на ревью». ## Бонусные акты (по времени) - **Кеш**: сравните Duration первого и последнего прогонов; найдите `Cache hit`. - **Матрица**: `Copy-Item workflows_заготовки/ci-matrix.yml ...` → 3.11 красный, 3.12/3.13 зелёные; PR не мёржить. - **Артефакты**: `ci-artifacts.yml` → скачайте `coverage-report`. - **Плохой CI**: `bad.yml` с `|| true` — тест падает, а проверка зелёная. ## Если что-то пошло не так - Первый прогон медленный — кеша ещё нет; прогрейте заранее. - Branch protection не видит проверки — обновите страницу после первого прогона. - Раннеры тормозят — покажите заранее сделанные прогоны по закладкам. ## Уборка ```powershell git switch main git checkout main -- .gitea/workflows/ci.yml git push origin --delete feature/vip-095 demo/strict-metrics ``` ## Шпаргалка ответов - **Почему отдельные job'ы?** Параллельность + `needs` задаёт порядок и гейт. - **Что такое runner?** Чистая машина под прогон; состояние не сохраняется. - **Можно ли доверять зелёному CI?** Только если проверки настоящие: без `|| true`. - **Чем CI отличается от CD?** CI — интеграция и проверки; CD — доставка, отдельная тема.