From 89bfb46b1c8e7ade70cbbacc801ca0e79f9d2170 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Wed, 30 Sep 2026 10:30:41 +0300 Subject: [PATCH] =?UTF-8?q?docs(history):=20=D1=8D=D1=82=D0=B0=D0=BF=204?= =?UTF-8?q?=20=E2=80=94=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20+=20=D0=BF=D0=BE=D0=B4=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=B0=D0=BC=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перенесено в файл репозитория (а не только в служебную память VS Code): - результаты полной перегенерации и перепроверки всех трёх стендов; - подводные камни: случайные default от API (детектор дрейфа по побайтовому сравнению не работает); случайный default вшивается в Go-код → drift 15 файлов сразу после перегенерации; generated/<стенд>/go|docs стареют после шага 01; 403 без браузерного User-Agent (DDoS-Guard); - актуальная карта пайплайна, токены, что удалено и что оставлено осознанно. --- HISTORY/2026-09-30_yaml_pipeline_hardening.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/HISTORY/2026-09-30_yaml_pipeline_hardening.md b/HISTORY/2026-09-30_yaml_pipeline_hardening.md index 3abf1f7..03d9bc6 100644 --- a/HISTORY/2026-09-30_yaml_pipeline_hardening.md +++ b/HISTORY/2026-09-30_yaml_pipeline_hardening.md @@ -186,6 +186,69 @@ GET {NUBES_API_ENDPOINT}/services?limit=200&isProductionReady=true Исправлено коммитом `a68a36a`: `151 k8sOpenbao` раскомментирован (комментарий «нет в PROD UI» устарел), prod перегенерирован — 36 YAML, ровно как в облаке. +## Этап 4 — перепроверка после полной перегенерации + подводные камни + +Команда: «сгенери YAML для всех стендов, проследи чтобы старого ничего не осталось, +перепроверь после генерации всё». Выполнено три прогона `01`: + +```bash +for s in dev test prod; do ./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/$s; done +# все три: exit=0 +``` + +### Результат перепроверки (2026-09-30) + +| Стенд | YAML | = активных в списке | = облако (`isProductionReady=true`) | Stale | Дубли id | Failures | +|---|---|---|---|---|---|---| +| dev | 40 | ✅ 40 | ✅ 40 | нет | нет | пусто | +| test | 36 | ✅ 36 | ✅ 36 | нет | нет | пусто | +| prod | 36 | ✅ 36 | ✅ 36 | нет | нет | пусто | + +Дополнительно проверено: + +- staging-каталоги (`resources_yaml.staging.*`) — не осталось ни одного; +- в `resources_yaml/` только `*.yaml`, `.stand`, `embed.go` — посторонних файлов нет; +- `.stand` в каждом каталоге совпадает с профилем (`dev`/`test`/`prod`); +- бэкапы прошлых версий: dev 3, test 2, prod 2 (ротация `KEEP_BACKUPS=5`); +- `generated/<стенд>/tmp/yaml_gen_failures.txt` — пусты; +- `git status` — чисто. + +### ⛔ Подводные камни, найденные при перепроверке (важно на будущее) + +1. **API отдаёт случайные `default`.** Часть параметров приходит со случайным + суффиксом (`db-ievgpdvu` → `db-ujama5rb`, `kvname-grzjes7l` → `kvname-g3s0uof2`, + `flask-seqtiq3t` → `flask-xwfdxdqh`). Поэтому **побайтовое сравнение двух прогонов + не является детектором дрейфа** — различия в этих строках не регрессия. +2. **Случайный `default` вшивается в сгенерированный Go-код.** + Пример: `generated/dev/go/151_k8s_openbao_kv_resource.go` содержит + `Default: stringdefault.StaticString("kvname-XXXX")`. Следствие: + `check_generated_drift.sh dev` показывает **дрейф 15 файлов сразу после любой** + перегенерации YAML — это не ошибка оператора. +3. **Производные артефакты стареют молча.** `generated/<стенд>/go` и `generated/<стенд>/docs` + создаются шагом `02` и после нового `01` становятся старше своих источников + (на момент проверки: `go`/`docs` dev — 08:46, YAML dev — 10:18). Отдельно живёт + эфемерная копия `provider/internal/resources_gen` + `provider/resources_yaml` + (её кладёт `dev-materialize.sh`, маркер `.stand` = стенд). Их нужно обновлять + шагом `02` после каждого `01`. +4. **Прямые HTTP-запросы к API без браузерного `User-Agent` получают 403** + (DDoS-Guard). С `User-Agent` + `Referer` — 200. + +### Актуальная карта пайплайна на 2026-09-30 + +- Единственный путь генерации YAML: `TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/<стенд>` + (`--profile` обязателен, без него `exit 2`). +- Один универсальный движок на все стенды: `TOOLS/bin/yaml-generator`, стенд задаётся + переменными окружения (`NUBES_API_ENDPOINT`, `NUBES_API_TOKEN`, `NUBES_SERVICE_ID`, + `NUBES_SERVICE_NAME`, `NUBES_OUTPUT_DIR`); список сервисов — свой у каждого стенда. +- Стенд-специфичных хардкодов в коде нет — контролируется `check_hardcoded_service_ids.sh`. +- Токены: `secrets/{dev,test,prod}.token` (валидны на 2026-09-30, срок до 2026-12-27); + обновление — `TOOLS/scripts/00_token_manager.sh` (keycloak refresh, `THRESHOLD_MIN=10`). +- Удалены как мёртвые (`1e796c8`): `10/11/12/13_yaml_*.sh`, + `02_generate_resources_and_docs_template_v2.sh`, общий `TOOLS/config/services_list.txt`. +- Оставлены осознанно: поддержка легаси-прокси `index.cfm`, справочная копия + `DOCS_PIPELINE/publish-docs.sh`, исторические `HISTORY/`/`NOTES/`/`docs/`, + ручные утилиты `scripts/*.py`. + ## Открытые вопросы (на решение владельца) 1. Поддержка легаси-прокси `index.cfm`: оставляем или выпиливаем (README уже помечает