auto-sync: 2026-06-05 17:00:01
This commit is contained in:
@@ -0,0 +1,90 @@
|
|||||||
|
# Dev Report: ORCH-39 — Fix lagging webhook tests + close CI hole
|
||||||
|
Дата: 2026-06-05
|
||||||
|
Статус: DONE
|
||||||
|
|
||||||
|
## Задача
|
||||||
|
Починить 4 webhook-теста, отставших после ORCH-10 (per-project резолвинг
|
||||||
|
состояний Plane), и закрыть дыру CI. Чинить ТОЛЬКО `tests/` + `.gitea/workflows/ci.yml`
|
||||||
|
(+ инфра deps), `src/` не трогать. PR в `main`, НЕ мержить.
|
||||||
|
|
||||||
|
Репо: Gitea `admin/orchestrator`, сервер `slin@82.22.50.71`.
|
||||||
|
Ветка: `fix/ORCH-39-webhook-tests` от `main` (053ea3b).
|
||||||
|
|
||||||
|
## Корень проблемы
|
||||||
|
После ORCH-10 `src/webhooks/plane.py::handle_issue_updated` резолвит ожидаемый
|
||||||
|
in_progress UUID через `get_project_states(project_id)` (импорт локальный из
|
||||||
|
`..plane_sync`). Тесты хардкодили **ET**-UUID `b873d9eb` в payload `state.id`
|
||||||
|
даже для запросов по **ORCH**-проекту → UUID не совпадал с
|
||||||
|
`get_project_states(ORCH)["in_progress"] = e331bfb3` → pipeline не стартовал →
|
||||||
|
`assert task is not None` падал.
|
||||||
|
|
||||||
|
Падали:
|
||||||
|
- `test_m6_sequence.py::test_created_uses_plane_sequence_id`
|
||||||
|
- `test_m6_sequence.py::test_created_falls_back_to_db_when_plane_down`
|
||||||
|
- `test_plane_webhook.py::test_orchestrator_project_routes_to_orchestrator_repo`
|
||||||
|
- `test_plane_webhook.py::test_prefixes_independent_per_project`
|
||||||
|
|
||||||
|
## Дыра CI (найдена при аудите)
|
||||||
|
`requirements.txt` НЕ содержал `pytest-asyncio` → 6 тестов
|
||||||
|
`@pytest.mark.asyncio` в `test_orch10_states.py` **молча SKIP-ались**
|
||||||
|
(`async def function and no async plugin installed`). CI был зелёный, хотя
|
||||||
|
async-пути ORCH-10 webhook вообще не выполнялись. Это и есть "CI green while
|
||||||
|
broken": сломанный async-handler прошёл бы CI.
|
||||||
|
|
||||||
|
## Сделано
|
||||||
|
- [x] Замокал `get_project_states` (patch `src.plane_sync.get_project_states`,
|
||||||
|
т.к. plane.py импортит её локально из `..plane_sync`) детерминированной
|
||||||
|
per-project картой ET/ORCH (без сети) в обоих тест-файлах.
|
||||||
|
- [x] Сброс `_STATES_CACHE` через `plane_sync.reload_project_states()` в
|
||||||
|
autouse-фикстуре (setup и teardown) — нет протечки между файлами.
|
||||||
|
- [x] Каждый `_post`/`_post_created` теперь шлёт `state.id` = in_progress UUID,
|
||||||
|
соответствующий своему проекту (derive из той же карты).
|
||||||
|
- [x] Добавил `pytest-asyncio==0.23.8` в `requirements.txt`.
|
||||||
|
- [x] Создал `pytest.ini`: `asyncio_mode = auto` (async-тесты реально гоняются),
|
||||||
|
`markers = asyncio`, `testpaths = tests`.
|
||||||
|
- [x] Захардил `.gitea/workflows/ci.yml`: `set -euo pipefail` в обоих шагах,
|
||||||
|
`python3 -m pytest tests/ -q -p no:cacheprovider --strict-markers` —
|
||||||
|
любой fail/неизвестный маркер краснит сборку, гоняется весь набор.
|
||||||
|
- [x] Закоммитил, запушил, создал PR #35. src/ не тронут.
|
||||||
|
|
||||||
|
## Изменённые файлы
|
||||||
|
- `tests/test_m6_sequence.py` — мок get_project_states + per-project карта + сброс кэша + project-aware UUID в `_post`
|
||||||
|
- `tests/test_plane_webhook.py` — то же + per-project UUID в `_post_created`
|
||||||
|
- `requirements.txt` — `+pytest-asyncio==0.23.8`
|
||||||
|
- `pytest.ini` — NEW: asyncio_mode=auto, strict markers, testpaths
|
||||||
|
- `.gitea/workflows/ci.yml` — set -euo pipefail, --strict-markers, no:cacheprovider
|
||||||
|
|
||||||
|
## Результат / Проверка
|
||||||
|
Прогон в окружении прод-образа орка (host-репо смонтирован в контейнер
|
||||||
|
`orchestrator` как `/repos/orchestrator`), из клона ветки, как сделает CI:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker exec -w /repos/orchestrator -e PYTHONPATH=/repos/orchestrator orchestrator \
|
||||||
|
python3 -m pytest tests/ -q -p no:cacheprovider --strict-markers
|
||||||
|
...
|
||||||
|
342 passed, 1 warning in 7.65s
|
||||||
|
```
|
||||||
|
|
||||||
|
- 4 целевых теста: зелёные (11 passed в двух файлах).
|
||||||
|
- 6 ранее SKIP-авшихся async-тестов в test_orch10_states.py теперь **PASSED**
|
||||||
|
(23 passed в файле вместо 17 passed + 6 skipped).
|
||||||
|
- Итог: **342 passed, 0 skipped, 0 failed** (до фикса было 336 passed / 6 skipped
|
||||||
|
/ 4 failed в целевых).
|
||||||
|
|
||||||
|
Коммит на origin (проверено):
|
||||||
|
```
|
||||||
|
git log origin/main..origin/fix/ORCH-39-webhook-tests
|
||||||
|
5f93cba fix(tests): per-project Plane states in webhook tests + close CI hole (ORCH-39)
|
||||||
|
```
|
||||||
|
|
||||||
|
PR: **#35** → https://git.mva154.duckdns.org/admin/orchestrator/pulls/35 (НЕ смержен)
|
||||||
|
|
||||||
|
## Проблемы и решения
|
||||||
|
- scp недоступен в sandbox → файлы переносил через `ssh cat` (read/edit локально, push обратно).
|
||||||
|
- pytest-asyncio отсутствовал в прод-образе → поставил эфемерно в работающий
|
||||||
|
контейнер ТОЛЬКО для валидации (не персистит в образ, не влияет на прод-рантайм
|
||||||
|
— сервис тесты не гоняет; пропадёт при рестарте). В CI ставится через requirements.txt.
|
||||||
|
|
||||||
|
## Следующий шаг
|
||||||
|
Ревьюер мержит PR #35 после проверки. После мержа CI на main будет краснеть на
|
||||||
|
любом падении и реально гонять async-тесты.
|
||||||
Reference in New Issue
Block a user