auto-sync: 2026-06-04 00:50:01
This commit is contained in:
62
tasks/orchestrator/DEV_TASK_QG_PYTEST_NO_MAKE.md
Normal file
62
tasks/orchestrator/DEV_TASK_QG_PYTEST_NO_MAKE.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# DEV TASK — БАГ 5: QG check_tests_local зависит от `make` (которого нет в контейнере)
|
||||
|
||||
**Проект:** orchestrator | **Сервер:** slin@82.22.50.71 | **Репо:** /home/slin/repos/orchestrator | **Контейнер:** orchestrator (8500)
|
||||
**Ветка:** `fix/qg-pytest-no-make` из свежего main (`git checkout main && git pull && git checkout -b fix/qg-pytest-no-make`). main = `b6aa107` (PR #15).
|
||||
|
||||
⚠️ **ГРАБЛЯ push (ORCH-7):** после push `git log origin/main..origin/fix/qg-pytest-no-make` ДОЛЖЕН показать коммит ДО отчёта «PR готов».
|
||||
ℹ️ Токен Gitea: `docker exec orchestrator printenv ORCH_GITEA_TOKEN`.
|
||||
|
||||
## Симптом (боевой, task 29 ET-011)
|
||||
developer завершил фичу (exit 0, 12 файлов, коммит `eea6c846`), но QG после него упал:
|
||||
```
|
||||
Task 29: QG 'check_tests_local' not passed after developer: Local test run error: [Errno 2] No such file or directory: 'make'
|
||||
```
|
||||
task 29 застрял в `development`, дальше в review не пошёл. **Это баг QG, НЕ кода ET-011.**
|
||||
|
||||
## Корень
|
||||
`src/qg/checks.py`, `check_tests_local()` (~стр.250-272):
|
||||
```python
|
||||
r = subprocess.run(
|
||||
["make", "test"], cwd=repo_path,
|
||||
capture_output=True, text=True, timeout=600,
|
||||
)
|
||||
```
|
||||
В контейнере оркестратора **`make` НЕ установлен** (`which make` → пусто) → `FileNotFoundError` → QG падает с `Local test run error`.
|
||||
|
||||
Диагностика (подтверждено ассистентом):
|
||||
- `make` в контейнере: **НЕТ**
|
||||
- `pytest` в контейнере: **ЕСТЬ** (`/usr/local/bin/pytest`, 9.0.3), `python3` есть
|
||||
- Makefile в enduro-trails: **ЕСТЬ**, цель `test:` = `cd src/api && python -m pytest ../../tests/ -v`
|
||||
- CI (`.gitea/workflows/ci.yml`) гоняет тесты напрямую: `pytest tests/` — без make.
|
||||
|
||||
## Фикс — заменить `make test` на прямой pytest (вариант B)
|
||||
В `check_tests_local`, заменить вызов subprocess на прямой эквивалент того, что делает `make test` в Makefile enduro-trails:
|
||||
```python
|
||||
r = subprocess.run(
|
||||
["python", "-m", "pytest", "tests/", "-v"],
|
||||
cwd=os.path.join(repo_path, "src", "api"),
|
||||
capture_output=True, text=True, timeout=600,
|
||||
)
|
||||
```
|
||||
**Ключевое — повторить семантику Makefile цели `test`:**
|
||||
- Makefile: `cd src/api && python -m pytest ../../tests/ -v` → из `src/api`, путь к тестам `../../tests/` (= `<repo>/tests/`).
|
||||
- Эквивалент: `cwd=<repo_path>/src/api`, аргумент тестов `../../tests/` ЛИБО абсолютный путь к `<repo_path>/tests/`. ВЫБЕРИ вариант, при котором pytest находит тесты независимо от структуры (рекомендую `cwd=repo_path/src/api`, args `["python","-m","pytest","../../tests/","-v"]` — 1:1 с Makefile). Проверь, что conftest/импорты не ломаются (тесты в enduro-trails ожидают запуск из src/api — это видно из Makefile).
|
||||
- Используй `python` (не `python3`) или `sys.executable` — что доступно в контейнере (`python3` точно есть; проверь `which python` — если нет, бери `sys.executable` или `"python3"`).
|
||||
|
||||
Оставь обработку: returncode==0 → (True, "Local tests passed"), иначе (False, f"Local tests failed: ...{tail}"), TimeoutExpired, общий except. Docstring обнови (убери упоминание make).
|
||||
|
||||
## Ограничения
|
||||
- 🚫 НЕ ставить `make` в Dockerfile (избегаем лишней зависимости — у нас уже pytest).
|
||||
- 🚫 НЕ трогай другие QG-функции (check_ci_green/check_review_approved/check_analysis_*/check_architecture_done/check_tests_passed/check_reviewer_verdict), реестр QG_CHECKS оставь как есть (только тело check_tests_local меняется).
|
||||
- 🚫 НЕ трогай: stage_engine advance-логику, webhook, nginx/openclaw.json/.env/deploy/HMAC/очередь/PLANE_STATES/conftest.py/gitea_public_url/status-only.
|
||||
- Conventional Commits, один коммит: `fix(qg): run pytest directly instead of make in check_tests_local`.
|
||||
|
||||
## Тесты (контейнер)
|
||||
`IMG=$(docker inspect orchestrator --format '{{.Config.Image}}'); docker run --rm -v /home/slin/repos/orchestrator:/code -w /code --entrypoint python3 $IMG -m pytest tests/ -q`
|
||||
- Найди существующие тесты check_tests_local (есть в tests/test_stage_engine.py / test_webhooks.py / test_resilience.py — они мокают subprocess.run). ОБНОВИ их: теперь мокается вызов pytest, не make. Проверь что assert на аргументы (если есть `["make","test"]`) поправлен на новый вызов.
|
||||
- Добавь/обнови тест: при `returncode=0` → passed True; при `returncode!=0` → passed False с tail; при FileNotFoundError → НЕ должно происходить (раньше падало на make).
|
||||
Baseline: **210 passed + 9 pre-existing failed** (tests/test_webhooks.py HMAC/401 — off-limits, не трогать). Не урони passed-счётчик ниже 210 (минус правки на мок make→pytest, плюс новые — итог ≥210).
|
||||
|
||||
## Отчёт
|
||||
- НЕ деплоить, НЕ мержить (мерж + боевой прогон делает ассистент: после деплоя перезапущу QG на task 29, чтобы он наконец прошёл в review).
|
||||
- В отчёте: точные строки правки (старый/новый subprocess.run), какой python-бинарь использован и почему, как нашёл тесты (cwd+путь), список обновлённых тест-моков, вывод pytest (полный счётчик). Маленькая правка — не раздувай. Один исполнитель.
|
||||
Reference in New Issue
Block a user