Files
ci-demo/Сценарий_демонстрации.md

159 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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 на лекции (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 — доставка, отдельная тема.