fix(ci): докер-секции прод-деплоев исключают друг друга через host-lock (#2950) #2955
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#2955
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2950-host-lock"
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?
Поправка к #2952 по тому же issue #2950.
Что я утверждал и что оказалось
В #2952 я свёл обе группы
concurrencyк одной и написал, что это сериализует деплои. Не сериализует.Коммит
2a01dea1трогает оба деплой-workflow, поэтому запустил обе цепочки. При работающей общей группе вторая не стартовала бы вовсе. На раннере в этот момент:Обе идут бок о бок. Forgejo
10.0.3+gitea-1.22.0, runnerv6.3.1— workflow-levelconcurrencyздесь не исполняется.Следствие шире, чем моя ошибка: прежние
deploy-prod/deploy-tradein-prodтоже никогда ничего не делали, как иcancel-in-progress: false. Причиной гонки было не различие имён групп, а отсутствие взаимного исключения как такового.flock я отверг по неверному основанию
В #2952 я написал, что host-lock не годится: «при аварийной смерти job'а лок залипает». Перепроверил на настоящем сценарии — обрыв ssh-сессии, а не
kill -9родителя в отрыве:Лок действительно держит живой потомок скрипта. Но ведь и докер-команды после обрыва сессии продолжают работать на хосте — отпустить лок в этот момент было бы как раз неправильно. Это не дефект, а нужная семантика: исключение действует ровно пока жив тот, кто мутирует докер. «Залипание» требует по-настоящему зависшего процесса, а ожидание ограничено
flock -wс сообщением, где написано, чем посмотреть держателя.Правка
Обе докер-секции берут общий лок
/var/lock/gendesign-docker-deploy.lockперед работой. Второй ssh-шаг ПТИЦЫ (перезагрузка прокси) лок не берёт — он образов не тянет, пруну там нечего портить.Секция
concurrencyоставлена: заработает при обновлении Forgejo. Но гейт больше не выдаёт её за действующий механизм — проверки разделены на обязательные (лок) и декларативные (группа), и в шапке файла написано, почему.Мутационная проверка гейта
flockиз tradein-деплояКритерий приёмки (не закрываю #2950 до него)
Следующий раз, когда мерж в
backend/**и мерж вtradein-mvp/**попадут в одно окно: оба деплоя завершаютсяsuccess, ни одногоunable to lease contentв логах, и в логе второго видна строка ожидания лока — то есть он реально ждал первого, а не разошёлся с ним случайно.prune -afубиваетcompose pullдеплоя ПТИЦЫ (разные группы concurrency, один докер-демон) #2950