scripts/smoke-mera-perimeter.sh — единственная проверка, которая видит
публичный периметр целиком (короткие адреса, 301 с длинных, публичный API,
закрытость B2B-путей на публичном домене). Запускался он только ночным
cron'ом 06:17 UTC, поэтому регресс жил до суток, и находил его либо тот же
cron, либо владелец — ровно тот сценарий, против которого проверки и писались.
Добавлен job `perimeter-smoke` в ОБА пайплайна: конфиг прокси (deploy.yml) и
фронт МЕРЫ (deploy-tradein.yml) едут раздельно, сломать периметр может каждый.
Отдельный job, а не шаг внутри deploy: «выкатили» и «периметр цел» — два
разных вердикта, красный смоук не должен читаться как неудавшийся деплой.
Идёт только при deploy.result == 'success' — поверх несостоявшейся выкатки
проверять нечего.
Перед смоуком — ожидание готовности по ДВУМ признакам (лэндинг 200 и API 401):
`up -d --force-recreate` отдаёт управление раньше, чем бэкенд начинает
отвечать, и без ожидания смоук ловил бы гонку, а не регресс. По истечении
150 с ожидание не падает, а печатает warning и пускает смоук — иначе
«не успел подняться» и «периметр сломан» слились бы в один красный шаг.
Дублирование 20 строк в двух пайплайнах осознанное: `workflow_call` под
act_runner не гарантирован, а зависимость, которая может молча не сработать,
здесь хуже повтора.
Заодно:
- ci.yml: гейт `bash -n` на все shell-скрипты (14 файлов) — shellcheck'а в
репозитории нет, а опечатка в смоуке обнаружилась бы следующим утром и
выглядела бы как регресс периметра. Гейт падает, если не нашёл ни одного
файла: пустая маска дала бы зелёный шаг, который ничего не проверяет.
- perimeter-smoke.yml: push-триггер на сам скрипт — правка проверяется сразу.
Проверено: смоук против прода сейчас зелёный целиком, 27 из 27 проверок,
то есть в пайплайн въезжает работающий гейт, а не заведомо красный.
Опасение из задачи про внешний геокодер проверено по коду и оказалось у́же:
`geocoder.suggest` — цепочка «кадастр → DaData → Nominatim → []», каждый
внешний тир под `except Exception`, отказ и квота дают 200 с пустым списком.
Покраснеть проверка может только на зависании дольше 15 с. Записал это в
самом скрипте, ожидание не ослаблял.
Closes#2917