CI: валидировать YAML/JSON, вложенный текстом в ConfigMap (ловить синтаксис внутреннего конфига) #289
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
На PR #288 (Tracktor) в
kubernetes/apps/homepage/homepage/app/configmap.yamlдобавлена плитка дашборда со строкой:Двоеточие с пробелом внутри незакавыченного скаляра — синтаксическая ошибка YAML для того текста, который лежит в
data.services.yaml. Разбор внутреннего текста даёт:Внешний манифест при этом валиден:
data.services.yaml— литеральный block scalar, для Kubernetes это просто строка, поэтому объект применяется, а ошибка живёт внутри конфига Homepage. Homepage парсит девять своих файлов (settings/services/widgets/bookmarks/kubernetes/docker/proxmox) сам, на старте, то есть ошибка проявляется уже после мёржа — в дашборде, а не в CI. Строку нашёл владелец глазами, все чеки PR при этом зелёные (Flate,Flux Local - Test/Diff).Почему CI не поймал
flate test all— рендер: README инструмента прямо говорит «flate is rendering-only»; содержимоеdata.*не парсится.Flux Local— значения HelmRelease противvalues.schema.jsonчарта; текст в ConfigMap к ним не относится.kubeconform-класс иkube-linter(schema-validation) — схема самого объекта, а не содержимое строки.kube-linter(61 встроенная проверка, docs.kubelinter.io/#/generated/checks) проверки вложенного в ConfigMap конфига нет: ближайшие —schema-validationи dangling-проверки на имена Secret/ConfigMap, но не на их содержимое.yamllintи прочие) видят только внешний документ: block scalar для них — одна строка.Класс не экзотический: в репо три файла и девять таких ключей —
homepage/homepage-config(семь ключей*.yaml),apps/ai/searxng(settings.yml),apps/grachevko/filebrowser. Проверка «в лоб» на текущем main покраснеет из-за строки выше — это и есть негативная проба её силы.Что должно быть
CI валит PR, если текст внутри
ConfigMap.data.<ключ>с расширением.yaml/.yml/.jsonне парсится соответствующим парсером, и называет место:Критерий готовности
description: Учёт машин: топливо, обслуживание, страховкивhomepage-config/services.yamlкраснеет; в тексте ошибки — объект, ключ, строка и столбец.description: "Учёт машин: топливо, обслуживание, страховки") проходит.Flate(иначе её контекст не входит в защиту ветки), фильтр по путямkubernetes/**/*её уже покрывает.searxng,filebrowser) остаются зелёными — проверка не должна ловить не-ошибки.Развилка (нужно решение владельца)
Готового гейта под класс не нашлось (список
kube-linterи READMEflate— выше). Варианты:ConfigMap.data, распарсить ключи по расширению) — ловит класс точно и даёт сообщение с координатами; упирается в правило репо «гейт ставится готовым инструментом, свой скрипт в CI возвращается».:внутри block scalar цитировать, и первым делом правка строки в #288.home-operations/flate, «rendering-only»): рассчитывать на неё сейчас не на что.Вариант 1 закрывает класс целиком; вариант 2 бесплатный, но опирается на глаз.
Связано: #74 (ссылки на Secret/ConfigMap и их ключи), #56 (схемы CRD), #64 (шаблоны ESO). Это тот же предполётный слой, но класс другой: не ссылки и не значения, а текст, который парсит само приложение.