ci(tradein): тесты браузерного сайдкара наконец бегут в пайплайне (#2722)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI Trade-In / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 50s
CI Trade-In / frontend-checks (pull_request) Successful in 1m14s
CI Trade-In / backend-tests (pull_request) Successful in 3m18s
All checks were successful
CI / changes (pull_request) Successful in 9s
CI Trade-In / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 50s
CI Trade-In / frontend-checks (pull_request) Successful in 1m14s
CI Trade-In / backend-tests (pull_request) Successful in 3m18s
Каталог 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
This commit is contained in:
parent
3231233b73
commit
9947c57689
1 changed files with 55 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue