gendesign/backend/tests/ops
bot-backend 091137a0c5
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 13s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m34s
CI / backend-tests (pull_request) Successful in 17m41s
Быстрый путь caddy_only: считаем изменённые файлы сами, без исключающих шаблонов (#3448)
Быстрый путь «правка ТОЛЬКО прокси» (#2916) не отработал ни разу: мерж
84920e6c, где в диффе один файл caddy/sites/apps.caddy, пересоздал весь стек
ПТИЦЫ (gendesign-caddy-1 Created=2026-09-11T20:40:14, в логе Caddy
"serving initial configuration" — холодный старт, а не reload).

ПРИЧИНА НЕ ТА, ЧТО В ГИПОТЕЗЕ. Гипотеза #3448 — пустой github.event.before у
мерж-коммита — опровергнута логом задачи 29244 (run 10881):

    Changes will be detected between 204e2e09de and main
    git diff --no-renames --name-status -z 204e2e09..refs/remotes/origin/main
    M caddy/sites/apps.caddy
    Detected 1 changed files

before валиден, коммит дотянут, дифф верный. Дальше в том же логе:

    ##[group]Filter non_caddy = true
    Matching files:
    caddy/sites/apps.caddy [modified]

Исключённый файл сам себя и «исключил». dorny/paths-filter склеивает шаблоны
одного фильтра через some, то есть ИЛИ (src/filter.ts: patterns.some(aPredicate),
predicate-quantifier по умолчанию some), поэтому

    non_caddy: ['**', '!Caddyfile', '!caddy/**']

читается как «подходит под ** ИЛИ не Caddyfile ИЛИ не caddy/**» — а ** матчит
всё. non_caddy был true ВСЕГДА, caddy_only — false всегда, deploy-caddy
пропускался. Сигнала не было ни одного: пропущенную джобу Forgejo рисует
зелёной, и «зелёный deploy-caddy» неотличим от невыполненного.

ЧТО СДЕЛАНО. Job changes считает список файлов сам: git diff по явным границам
(before → HEAD), флаги backend/frontend/infra/caddy_only выводятся из этого
списка. Заплатки к фильтрам не годятся: predicate-quantifier: every действует
на ВЕСЬ блок и сломал бы backend/frontend/infra, то есть фикс снова висел бы на
незаметном умолчании.

Шаг ПЕЧАТАЕТ и список файлов, и итоговые флаги — у правки должен быть
наблюдаемый признак, иначе «сработало» и «просто не совпало» выглядят одинаково.
База не разрешилась (ручной запуск, пустой/нулевой before, коммита нет в клоне)
→ изменённым считается весь репозиторий: лишний полный деплой безопаснее
пропущенного. Фолбэка на HEAD^..HEAD намеренно нет — у push'а из нескольких
коммитов он молча урезал бы список и включил быстрый путь там, где приехал бэкенд.

Гейт backend/tests/ops/test_3448_caddy_only_detection.py ИСПОЛНЯЕТ этот шаг на
временном репозитории с настоящим мерж-коммитом и проверяет значения флагов:
только caddy → caddy_only=true; caddy+backend → false; база не разрешилась →
полный деплой; решение видно в логе. Отдельная проверка ловит класс бага во всех
воркфлоу — исключающие шаблоны '!' в любом paths-filter без predicate-quantifier: every.

Приёмка на проде: следующий мерж с единственным файлом под caddy/** не меняет
docker inspect gendesign-caddy-1 --format '{{.Created}}', а в логе Caddy —
reload, а не "serving initial configuration".

Closes #3448

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 14:26:52 +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_3448_caddy_only_detection.py Быстрый путь caddy_only: считаем изменённые файлы сами, без исключающих шаблонов (#3448) 2026-09-12 14:26:52 +05:00