gendesign/backend/tests/ops
bot-backend d5f0557ca8
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m8s
CI / openapi-codegen-check (pull_request) Successful in 2m3s
CI / backend-tests (pull_request) Successful in 17m40s
fix(deploy): сверка маунтов Caddy не может провалиться втихую (#3443, ревью)
Две дыры из deep-ревью PR #3506 — обе про «отказ выглядит как успех».

M1. `stale=$(docker inspect … | while …)` под `set -eu` без `pipefail`
(в POSIX-sh его нет) отдаёт статус `while`, то есть всегда 0. Провал
`docker inspect` или пустой вывод давали пустой список → ветка «всё
доехало» → `caddy reload` → зелёная джоба с надписью «окна недоступности
нет» при прокси, работающем по СТАРОМУ конфигу. Ровно тот беззвучный
отказ, ради которого написан скрипт. Теперь список читается отдельной
командой, провал и пустой вывод считаются расхождением (fail-safe в
прежнее поведение), число сверенных файлов печатается — «сверили пять» и
«сверили ноль» в логе больше не выглядят одинаково. Ноль пофайловых
маунтов (например, если Caddyfile переведут на именованный том) — тоже
расхождение, а не тавтологически успешная сверка.

M2. В фильтре `backend` (ci.yml) не было `ops/**`, а все содержательные
регрессии живут в самом ops/caddy-apply.sh: гейт его ИСПОЛНЯЕТ. PR,
правящий только скрипт, давал backend=false — джоба пропускается, гейт не
исполняется, «пересоздавать всегда» уезжает в main зелёным. Тот же класс,
что уже осуждён комментариями рядом (#2950/#3448/#3467).

Мелочи оттуда же:
* `[ -d "$src" ] && continue` вместо `[ -f "$src" ] || continue` — пропуск
  по `-f` склеивал «это каталог» (пропустить верно) и «файла на хосте
  нет», для которого в контейнере как раз живёт старый инод;
* сообщение об отказе `caddy validate` больше не называет причиной
  битый конфиг, когда упасть мог и сам запуск проверочного контейнера;
* в комментарии к проверке записана её граница: в полном деплое общий
  `up -d $UP_SERVICES` (deploy.yml:959) поднимает и caddy за ~110 строк
  до вызова скрипта, поэтому правка, которая одновременно ломает Caddyfile
  и меняет блок caddy в compose, пересоздаст контейнер раньше проверки.

Гейт дорос с 16 до 22 проверок: `docker inspect` не ответил → пересоздание,
ноль пофайловых маунтов → пересоздание, исчезнувший файл на хосте →
пересоздание, число сверенных маунтов печатается, `caddy reload`/вызов
скрипта не проглочены `|| true`, ci.yml-фильтр покрывает ops/**.
Все 11 мутантов (7 новых + 4 прежних) краснеют, контроль зелёный.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 20:49:34 +05:00
..
__init__.py fix(ci): прод-деплои в одну группу concurrency — прун одного убивал pull другого (#2950) (#2952) 2026-08-20 07:47:48 +00:00
test_3xxx_alertmanager_inode.py fix(ops/metrics): правки конфига Alertmanager молча не доезжали до контейнера 2026-08-27 15:10:23 +03:00
test_2203_backup_trailer_grep_dashdash.py fix(ops): проверка трейлера дампа падала на grep — ведущие -- принимались за опции (#2203) 2026-08-20 23:38:45 +03:00
test_2203_env_offbox.py feat(ops): off-box копия рантайм-конфига — зашифрованной, иначе никак 2026-08-27 16:32:27 +03:00
test_2203_notify_topic.py fix(tests): ruff E741 — однобуквенное имя переменной в разборе скрипта 2026-08-27 13:16:26 +03:00
test_2950_deploy_concurrency_group.py chore(format): нормализация под ruff 0.15.20 — 161 файл, только формат (#2864) (#3022) 2026-08-21 12:01:52 +00:00
test_3029_deploy_drift.py feat(ops): сторож расхождения «прод ↔ main» — молчаливый недоехавший деплой становится видимым (#3029) 2026-08-27 12:35:43 +03:00
test_3059_alert_retry.py fix(ops): алерт не теряется от одного сетевого отказа (#3059) 2026-08-26 10:02:46 +03:00
test_3078_alert_ack.py fix(tests): убрать директивы noqa на неактивное правило 2026-08-27 14:32:34 +03:00
test_3078_alert_topic.py fix(ops/metrics): тема «метрики» задаётся дефолтом, а не ручным заведением секрета 2026-08-27 22:28:52 +03:00
test_3078_exporter_profiles.py fix(observability): агент не падает из-за переменной чужой роли (#3078) 2026-08-26 12:45:31 +03:00
test_3078_metrics_role_discovery.py fix(observability): привилегированную роль спрашиваем у контейнера, а не угадываем (#3078) 2026-08-26 12:08:37 +03:00
test_3078_oncall_route.py feat(observability): кнопка «Принял в работу» под клиентским инцидентом (#3078) 2026-08-27 13:56:00 +03:00
test_3114_log_credential_scrub.py fix(observability): пароли не уезжают в Loki — скруббер учётных данных (#3114) 2026-08-26 15:50:57 +03:00
test_3114_pg_exporter_version.py fix(ops/metrics): postgres-exporter печатал пароль БД в лог при каждой ошибке 2026-08-27 15:55:24 +03:00
test_3443_caddy_reload_not_recreate.py fix(deploy): сверка маунтов Caddy не может провалиться втихую (#3443, ревью) 2026-09-12 20:49:34 +05:00
test_3448_caddy_only_detection.py Гейт #3448: закрыть зелёные мутации, добавить признак непустоты, запускать на ci-tradein.yml 2026-09-12 15:57:11 +05:00
test_3467_prometheus_reload.py fix(ops): деплой метрик перечитывает конфиг Prometheus, а не только кладёт его на диск 2026-09-12 13:55:53 +03:00
test_alert_value_is_the_described_quantity.py fix(alerts): в тексте тревоги печаталась не та величина, которую текст называет 2026-09-12 14:27:02 +05:00