gendesign/.forgejo/workflows/perimeter-smoke.yml
bot-backend 134985a624
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
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 / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
fix(smoke): отказ TLS-сертификата — это FAIL, а не «ответа нет»
Повтор запроса включался на ЛЮБОМ ненулевом rc curl, хотя собственный
комментарий рядом называл сетевой класс (6/28/35/52/56). Протухший, чужой
или самоподписанный сертификат даёт rc=60 (замер: expired.badssl.com,
self-signed.badssl.com, wrong.host.badssl.com) — и измеренный регресс
периметра уезжал в колонку «периметр этой проверкой НЕ проверен», потратив
на детерминированный отказ три попытки и 6 c пауз. Ровно этот отказ и есть
предмет проверки 5b: без site-блока Caddy не выпускает сертификат.

Коды сетевого класса вынесены в NETWORK_RC рядом с комментарием, чтобы
описание и поведение не разъезжались; повтор делается только по ним. rc=7
(соединение отвергнуто) добавлен туда же — ответа при нём тоже нет.
curl_failed печатает rc в обеих ветках: строки RETRY при SMOKE_ATTEMPTS=1
нет вовсе, и «домена нет» (6) было не отличить от «сертификат протух» (60).

timeout-minutes 10 → 40: худший случай (прод не отвечает — мертвы все 43
проверки) = 43 × 53 c ≈ 38 мин, в 10 минут помещалось ~8 мёртвых проверок,
и job убивали ДО печати FAIL-строк и итога — в том самом сценарии, ради
которого правка и делалась.
2026-09-12 01:07:11 +05:00

75 lines
5.1 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Регресс-тест публичного B2C-периметра МЕРА (ЭТАП 1 плана B2C-запуска).
#
# НЕ pre-merge гейт — эти 4 проверки требуют реального DNS + выпущенного TLS-
# сертификата для meraocenka.ru, т.е. осмысленны ТОЛЬКО против прода после
# деплоя. Запускается вручную (workflow_dispatch) или раз в сутки (cron) —
# страхует от случайной регрессии периметра (например, будущий PR по ошибке
# открывает B2B-путь на публичном домене, или basic_auth gate на gendsgn.ru
# случайно снимают).
#
# ДО того как появится DNS A-record meraocenka.ru → IP VPS, проверки 1 и 2
# (см. scripts/smoke-mera-perimeter.sh) ожидаемо КРАСНЫЕ — это не регресс,
# просто домен ещё не резолвится. Проверки 3 и 4 не зависят от DNS нового
# домена и обязаны быть зелёными всегда.
name: perimeter-smoke-mera
on:
workflow_dispatch: {}
schedule:
# Раз в сутки, 06:17 UTC — вне пиков, время произвольное.
- cron: '17 6 * * *'
# #2917: правка самого смоука должна проверяться сразу, а не следующим утром.
# Проверки read-only (curl по публичным адресам), поэтому прогонять их на
# push в main безопасно и дёшево. Синтаксис скрипта отдельно гейтится в
# ci.yml на каждом PR — здесь проверяется уже поведение против прода.
push:
branches: [main]
paths:
- 'scripts/smoke-mera-perimeter.sh'
- '.forgejo/workflows/perimeter-smoke.yml'
concurrency:
group: perimeter-smoke-mera
cancel-in-progress: false
jobs:
smoke:
runs-on: ubuntu-latest
# 11.09.2026: было 5 минут — теперь мало. В скрипте появились пауза между
# проверками (2 c) и повтор запроса, если ответа не пришло вовсе: обычный
# прогон вырос с ~89 c до ~175 c, а ХУДШИЙ случай — гораздо больше, потому
# что каждая неотвечающая проверка стоит до 3×15 c таймаута плюс паузы
# (~53 c против обычных ~2 c).
#
# 12.09.2026: 10 минут — тоже мало, и мало ровно в том сценарии, ради
# которого повтор писался. АРИФМЕТИКА ХУДШЕГО СЛУЧАЯ. Одна неотвечающая
# проверка сетевого класса = 3×15 c таймаута + 2 c и 4 c пауз ретрая + 2 c
# паузы между проверками = 53 c. Прод не отвечает целиком (DNS не
# резолвится, вход лежит) — мертвы ВСЕ проверки: 43 × 53 = 2279 c ≈ 38 мин.
# Откуда 43 (замер 12.09, зелёный прогон против прода — 43 PASS за 167 c):
# 42 обычные проверки + отдельная загрузка HTML лэндинга; 43-я, производный
# layout-чанк, при мёртвом ответе не запрашивается вовсе — запросов ровно
# столько же.
# В 10 минут помещалось ~8 мёртвых проверок из 43, дальше job убивали ДО
# печати FAIL-строк и итога — то есть лог терялся при полном отказе прода.
#
# Правка «повторяем только сетевой класс» (12.09) худший случай НЕ
# уменьшает: 15-секундный таймаут как раз сетевой (rc=28) и повторяется
# по-прежнему. Она удешевляет ДРУГОЙ сценарий — протухший/чужой сертификат
# (rc=60): отказ приходит сразу и без повторов. Замер 12.09 на
# expired.badssl.com, одна проверка при SMOKE_PAUSE=0 — 23 c на прежней
# голове (3 попытки + 6 c пауз) против <1 c теперь.
#
# 40 минут = 38 мин худшего случая + запас на чекаут и разброс сети.
# Цена промаха несимметрична: занятый раннер стоит дёшево (прогон daily +
# on-push), потерянный лог при полном отказе прода — дорого.
timeout-minutes: 40
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Run perimeter smoke checks
run: |
chmod +x scripts/smoke-mera-perimeter.sh
./scripts/smoke-mera-perimeter.sh