chore(deps): три места, где сборка не воспроизводится — лок-призрак, глоб и неприпинованный сайдкар #3213
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3213
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/deps-hygiene-dockerfiles"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ничего не апгрейдит. Убирает три способа собрать образ не тем, что лежит в репозитории.
1.
tradein-mvp/backend/uv.lock— удалёнФайл был untracked и в
.gitignoreс рождения. Мера — uv-workspace: сборка берёт корневойtradein-mvp/uv.lock(context: ./tradein-mvp,COPY pyproject.toml uv.lock ./+uv sync --frozen). Лок, созданныйuv lockизbackend/, не читает никто — и он тихо разошёлся с рабочим. На 2026-08-29 в нём:pillow12.2.0 ·starlette1.0.1 ·python-multipart0.0.29 ·pydantic-settings2.14.1 ·weasyprint68.1Пять пакетов с открытыми advisory, которых в реальной сборке Меры нет вообще. Именно этот файл подмешал пять фантомных строк в OSV-скан текущей серии — я на них сам чуть не начал чинить то, чего нет.
Строка в
.gitignoreостаётся (второй лок не нужен), но теперь с объяснением почему — иначе следующий читатель снимет ignore и закоммитит призрак.2.
backend/Dockerfile— глоб и молчаливый фолбэкГлоб плюс фолбэк означали: лок пропал — сборка не падает, а молча переключается на резолв «свежайшее из диапазонов
pyproject». Образ собрался бы с версиями, которых никто не видел ни в одном PR, и воспроизвести прод-сборку было бы нечем. Теперьuv.lockобязателен: его пропажа роняетCOPY, то есть даёт красный билд вместо незаметной подмены зависимостей.Контекст сборки
./backend(deploy.yml:220,243,342,361),backend/uv.lock— tracked. Проверено.3.
tradein-mvp/browser/Dockerfile— сайдкар без единого пинаУ браузерного сайдкара нет лока вообще, так что любая пересборка образа — в том числе автоматическая, на несвязанном коммите — тянула свежайший
camoufox, а вместе с ним другойplaywright. Под который не написанsed-патчcoreBundle.jsв том же файле (#915/#918, null-guard дляpageError.location); при несовпадении паттерна сборка падает по построению.Запинено по факту работающего прод-контейнера
tradein-browser:camoufox==0.5.5,playwright==1.60.0,aiohttp==3.14.3.playwright— явно, хотя и приходит транзитивно (camoufox0.5.5 требуетplaywright<1.61): патч завязан на конкретную сборку драйвера, диапазон тут не годится. Наличие всех трёх версий на PyPI и совместимостьcamoufox 0.5.5 → playwright<1.61проверены.Заодно: комментарий, который врал в обе половины
camoufoxне был запинен ни на что (см. строкуpip installвыше), а 0.4.11 в проде не стоит неизвестно с каких пор — контейнер сейчас несёт 0.5.5 и playwright 1.60.0. Переписано на то, как есть: апгрейд не заблокирован, но связан —playwrightподнимается только вместе сcamoufoxи только с проверкой, что паттерныsedещё на месте.Риск
Пункты 1 и 2 не меняют результат сборки (лок как был корневой, так и остался;
uv.lockкак был на месте, так и остался). Пункт 3 пересоберёт образ сайдкара — ставя ровно то, что в нём уже работает.Пункт 4 из 6 в цепочке апдейта зависимостей (после #3207, #3210, #3211).