From c906c05bcef042c15d938429b8938f07e4c58cdb Mon Sep 17 00:00:00 2001 From: Stream Date: Thu, 4 Jun 2026 00:50:01 +0300 Subject: [PATCH] auto-sync: 2026-06-04 00:50:01 --- .../DEV_TASK_QG_PYTEST_NO_MAKE.md | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tasks/orchestrator/DEV_TASK_QG_PYTEST_NO_MAKE.md diff --git a/tasks/orchestrator/DEV_TASK_QG_PYTEST_NO_MAKE.md b/tasks/orchestrator/DEV_TASK_QG_PYTEST_NO_MAKE.md new file mode 100644 index 0000000..68c9766 --- /dev/null +++ b/tasks/orchestrator/DEV_TASK_QG_PYTEST_NO_MAKE.md @@ -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/` (= `/tests/`). +- Эквивалент: `cwd=/src/api`, аргумент тестов `../../tests/` ЛИБО абсолютный путь к `/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 (полный счётчик). Маленькая правка — не раздувай. Один исполнитель.