fix(ci): deploy-tradein paths-filter base = last deployed SHA (накопленный diff, fail-safe build-all) #1839
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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#1839
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/deploy-tradein-cumulative-base"
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?
Чинит class-баг деплоя: при быстрых мержах build-джобы пропускались → код в main, образа нет (сегодня ударило по #1825 и #1829).
Корень
changes-джоба (dorny/paths-filter) диффала per-merge-commit против родителя. Frontend-only мерж #1830 не видел backend-изменений #1829 (они в предыдущем коммите) →build-backend/build-browserskipped, хотя дерево их содержит. Выживший ран собирает только дельту СВОЕГО коммита, а ран #1829 (который собрал бы backend/browser) отменён concurrency-гонкой.Решение (вариант B — инкрементально, без «всегда 3 образа»)
paths-filter
base= последний успешно задеплоенный SHA → накопленный diffdeployed..HEAD. Frontend-мерж сразу после backend-мержа теперь диффает от last-DEPLOYED → видит И backend И frontend → собирает оба.Трекинг — host-file (
/opt/gendesign/.tradein-deployed-sha): deploy-джоба пишет$GITHUB_SHAПОСЛЕДНИМ в SSH-скрипте (подset -euo pipefail→ только на полном успехе). Выбран вместо git-ref т.к. ни один workflow не использует токен сcontents:write— переиспользуем существующие DEPLOY_* секреты, ноль новых зависимостей/attack-surface.changes-джоба:
fetch-depth:0; шагresolve-baseSSH-читает marker, валидирует (40-hex +merge-base --is-ancestor); если SHA есть → paths-filter сbase=; если нет → шагset-allэмитит все outputs=true.Fail-safe (критично)
ЛЮБАЯ неопределённость → build-all, никогда build-none: первый ран (marker нет), VPS недоступен, битый/не-предок SHA, force-push. Лишняя сборка безопаснее пропуска.
Сценарии (проверены логикой, CI локально не гоняется)
Не трогали
concurrency: cancel-in-progress: false(true рискует оборвать прод-деплой mid-SSH);workflow_dispatchфорс-билд.YAML валиден (
yaml.safe_load+ pre-commit check-yaml). Файл один:.forgejo/workflows/deploy-tradein.yml.