ci: убирать buildx-билдер в конце сборочных job'ов (#2869) #2870
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2870
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2869-buildx-cleanup"
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?
Зачем
Сегодня деплой упал так:
Диск VPS был на 94% (145G / 136G занято / 9.0G свободно). Тем же дефицитом
покрасились ещё две проверки на других PR — один дефицит, три «независимых» симптома.
Корень
docker/setup-buildx-action@v3создаёт билдерdocker-containerна каждый прогон,а его post-step под Forgejo
act_runnerне срабатывает. На хосте накопилось20 контейнеров
buildx_buildkit_builder-*возрастом до двух месяцев:Почему рост незаметен до отказа:
docker volume pruneих не видит;docker system dfпоказываетBuild Cache 0B, потому что кэш живёт внутриконтейнеров-билдеров, а не у хостового демона.
Инструмент, слепой по построению: смотришь на «0B» и делаешь вывод, что чистить нечего.
Что делает PR
Шесть сборочных job'ов (три в
deploy.yml, три вdeploy-tradein.yml) получаютid: buildxу шага setup и шаг уборки в конце:if: always()— убирает и после упавшей сборки, иначе именно при падениях билдеры и копятся.actне гарантировано, чтоsteps.buildx.outputs.nameзаполнится; если он пуст, в логе будет явная строка,а не молчаливый no-op, который читался бы как «почищено».
Проверка
yaml.safe_loadобоих файлов — валидны, состав job'ов не изменился(
deploy.yml: changes/build-backend/build-worker/build-frontend/deploy;deploy-tradein.yml: changes/test/build-backend/build-frontend/build-browser/deploy)а не глазами)
check yaml— passeddocker ps | grep -c buildx_buildkitдо и после следующего деплоя — число не должно расти
Что этот PR НЕ делает
(пункт 1 в #2869). Кэш в них я сегодня вычистил (
buildctl prune --all, толькорегенерируемый кэш): 132G → 117G занято, свободно 13G → 28G.
Refs #2869
Поправка к описанию выше — механизм оказался другой, и первая версия PR была почти бесполезной
В первом коммите я написал, что post-step у
setup-buildx-action«не срабатывает подact_runner». Замер это опроверг. Даты создания всех 20 висящих билдеров:
Между 05.07 и 13.08 — пять недель без единой протечки, хотя деплоев за это время были
десятки. А два сегодняшних созданы в 11:57:43 — ровно тем прогоном, который упал с
no space left on device.Значит штатная уборка работает, а билдеры текут, когда job умирает аварийно
(ENOSPC, OOM, отмена concurrency-группой): контейнер job'а уже мёртв, и никакие
завершающие шаги — включая мой
if: always()— не выполняются. То есть первая версияэтого PR не сработала бы ровно в тех случаях, которые и создают мусор: защита, которая
не защищает.
Что теперь
Добавлен шаг на входе каждого сборочного job'а: подбирает ЧУЖИЕ протёкшие билдеры
старше 6 часов вместе с их
_state-томами.живой параллельный прогон.
df -h /— чтобы заполнениедиска было видно в логе КАЖДОГО деплоя, а не всплывало красным один раз в три месяца.
Внимание — это удаляет контейнеры и тома на хосте раннера. Именно поэтому пишу явно:
после мержа первый же деплой уберёт 18 исторических билдеров (17.05–05.07). Кэш из них
я уже вычистил вручную, так что по месту выигрыш будет небольшой, но дальше мусор
перестанет накапливаться. Если такое авто-удаление нежелательно — скажи, переделаю на
«только отчитываться, не удалять».
Проверка после мержа
До мержа: 20. После первого деплоя ожидаю ≤ 3 (только свежие этого прогона),
и строку
buildx: убрано протёкших Nв логе job'а.bash -e