From 9947c576897ba05bb7e2e8452e6bc7d91e3e2c4b Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 6 Aug 2026 16:12:43 +0500 Subject: [PATCH] =?UTF-8?q?ci(tradein):=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= =?UTF-8?q?=20=D0=B1=D1=80=D0=B0=D1=83=D0=B7=D0=B5=D1=80=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B0=D0=B9=D0=B4=D0=BA=D0=B0=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BA=D0=BE=D0=BD=D0=B5=D1=86=20=D0=B1=D0=B5=D0=B3?= =?UTF-8?q?=D1=83=D1=82=20=D0=B2=20=D0=BF=D0=B0=D0=B9=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=B9=D0=BD=D0=B5=20(#2722)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Каталог tradein-mvp/browser/ не гонял НИ ОДИН пайплайн: ci-tradein гейтит backend/ и frontend/, deploy-tradein — тоже, а сам сайдкар не член uv-воркспейса (members = backend + packages/*), так что и pytest из backend его не собирал. Итог — 108 содержательных тестов вне охвата, из них 4 лежали красными на main (с 2026-06-20 и 2026-07-02) при том, что файл дважды правился уже после поломки. Красноту починил PR #2724, этот job закрывает причину, по которой её не видели. Отдельный job, а не шаг в backend-job: - сайдкар вне воркспейса → uv sync --frozen его зависимости не ставит; - aiohttp (единственная не-stdlib зависимость сьюта) отсутствует в tradein-mvp/uv.lock, то есть backend-окружение сьют просто не запустит; - свой paths-filter: правка browser/ не обязана гонять backend-сьют и наоборот. Окружение намеренно лёгкое: pytest + aiohttp, и всё. camoufox/playwright не нужны — camoufox импортируется лениво внутри _launch_browser, а тесты мокают _ensure_browser/_do_fetch. pytest-asyncio тоже не нужен: `async def test_` в каталоге ноль, каждый тест сам крутит asyncio.run(). Проверено прогоном на venv ровно из этих двух пакетов: 108 passed, 0 skipped — то есть в CI идёт весь сьют целиком, без молча пропущенной интеграционной части. timeout-minutes: 10 — у каталога нет своего pyproject, а значит и pytest-timeout из backend'а (timeout=120) на него не распространяется; нативный job-таймаут дешевле плагина ради одного каталога. Refs #2722 --- .forgejo/workflows/ci-tradein.yml | 55 +++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/.forgejo/workflows/ci-tradein.yml b/.forgejo/workflows/ci-tradein.yml index 94b9d2ff..c74ceca6 100644 --- a/.forgejo/workflows/ci-tradein.yml +++ b/.forgejo/workflows/ci-tradein.yml @@ -30,6 +30,7 @@ jobs: outputs: backend: ${{ steps.filter.outputs.backend }} frontend: ${{ steps.filter.outputs.frontend }} + browser: ${{ steps.filter.outputs.browser }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 @@ -54,6 +55,12 @@ jobs: frontend: - 'tradein-mvp/frontend/**' - '.forgejo/workflows/ci-tradein.yml' + browser: + # Сайдкар — сервис ВНЕ uv-воркспейса (tradein-mvp/pyproject.toml + # members = backend + packages/*), со своим Dockerfile и без pyproject, + # поэтому и фильтр отдельный: backend-гейт его тестов не видел вовсе. + - 'tradein-mvp/browser/**' + - '.forgejo/workflows/ci-tradein.yml' backend-tests: runs-on: ubuntu-latest @@ -106,6 +113,54 @@ jobs: uv run pytest -q \ --deselect "tests/test_search_api.py::test_search_cache_hit" + # Тесты браузерного сайдкара (#2722). До этого job'а они не бежали НИГДЕ: + # ci-tradein гейтил только backend/frontend, deploy-tradein — тоже, а каталог + # вне uv-воркспейса, так что и `uv run pytest` из backend их не собирал. Итог: + # 4 теста лежали красными на main (с 2026-06-20 и 2026-07-02), файл при этом + # правился, и никто не узнал. Починка — PR #2724, этот job закрывает причину. + # + # Почему НЕ переиспользуем backend-job: + # 1. сайдкар не член воркспейса → `uv sync --frozen` его не ставит; + # 2. aiohttp (единственная не-stdlib зависимость сьюта) нет в tradein-mvp/uv.lock; + # 3. разный scope paths-filter: правка browser/ не должна гонять backend-сьют. + browser-tests: + runs-on: ubuntu-latest + needs: changes + if: needs.changes.outputs.browser == 'true' + # Сьют идёт ~15с. Лимит — страховка от зависшего теста: у сайдкара нет своего + # pyproject, а значит и pytest-timeout'а backend'а (timeout=120). Дешевле + # взять нативный job-таймаут, чем тащить плагин ради одного каталога. + timeout-minutes: 10 + defaults: + run: + working-directory: ./tradein-mvp/browser + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + # 3.12 — как в browser/Dockerfile (FROM python:3.12-slim). + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install test deps + # ВЕСЬ список: pytest + aiohttp. Ни playwright, ни camoufox, ни закачки + # Firefox — camoufox импортируется ЛЕНИВО внутри _launch_browser + # (server.py, `from camoufox.async_api import AsyncCamoufox`), а сами тесты + # мокают _ensure_browser/_do_fetch и грузят server.py по пути через importlib. + # pytest-asyncio тоже НЕ нужен: ни одного `async def test_` — каждый тест сам + # крутит asyncio.run(). Проверено локально на venv ровно из этих двух пакетов. + # + # aiohttp без пина — ровно как в browser/Dockerfile (`pip install ... aiohttp`), + # то есть гейт видит ту же версию, что уедет в образ. Пин здесь означал бы + # проверку версии, которой в проде нет. + run: pip install pytest aiohttp + + - name: Run pytest (tradein-mvp/browser) + # Каталог без pyproject/pytest.ini → дефолтная конфигурация, ничего + # не deselect'ится. Ожидание: 108 passed, 0 failed, 0 skipped. + run: pytest -q + frontend-checks: runs-on: ubuntu-latest needs: changes -- 2.45.3