CI: валидировать YAML/JSON, вложенный текстом в ConfigMap (ловить синтаксис внутреннего конфига) #289

Open
opened 2026-09-29 17:32:23 +00:00 by hermes · 0 comments
Collaborator

Зачем

На PR #288 (Tracktor) в kubernetes/apps/homepage/homepage/app/configmap.yaml добавлена плитка дашборда со строкой:

description: Учёт машин: топливо, обслуживание, страховки

Двоеточие с пробелом внутри незакавыченного скаляра — синтаксическая ошибка YAML для того текста, который лежит в data.services.yaml. Разбор внутреннего текста даёт:

mapping values are not allowed here
  in "<unicode string>", line 62, column 32

Внешний манифест при этом валиден: 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, но не на их содержимое.
  • Обычные линтеры YAML (yamllint и прочие) видят только внешний документ: block scalar для них — одна строка.

Класс не экзотический: в репо три файла и девять таких ключей — homepage/homepage-config (семь ключей *.yaml), apps/ai/searxng (settings.yml), apps/grachevko/filebrowser. Проверка «в лоб» на текущем main покраснеет из-за строки выше — это и есть негативная проба её силы.

Что должно быть

CI валит PR, если текст внутри ConfigMap.data.<ключ> с расширением .yaml/.yml/.json не парсится соответствующим парсером, и называет место:

homepage/homepage-config data.services.yaml: mapping values are not allowed here (line 62, column 32)

Критерий готовности

  1. Ветка с description: Учёт машин: топливо, обслуживание, страховки в homepage-config/services.yaml краснеет; в тексте ошибки — объект, ключ, строка и столбец.
  2. Ветка с тем же значением в кавычках (description: "Учёт машин: топливо, обслуживание, страховки") проходит.
  3. Проверка идёт джобой в существующем workflow рядом с Flate (иначе её контекст не входит в защиту ветки), фильтр по путям kubernetes/**/* её уже покрывает.
  4. Остальные файлы с вложенным конфигом (searxng, filebrowser) остаются зелёными — проверка не должна ловить не-ошибки.
  5. Вводить её вместе с правкой той строки: без правки main красный по собственному же гейту.

Развилка (нужно решение владельца)

Готового гейта под класс не нашлось (список kube-linter и README flate — выше). Варианты:

  1. Свой чекер (десяток строк: взять ConfigMap.data, распарсить ключи по расширению) — ловит класс точно и даёт сообщение с координатами; упирается в правило репо «гейт ставится готовым инструментом, свой скрипт в CI возвращается».
  2. Без гейта, класс на ревью: тогда правило-привычка — значения с : внутри block scalar цитировать, и первым делом правка строки в #288.
  3. Ждать проверку в апстриме (home-operations/flate, «rendering-only»): рассчитывать на неё сейчас не на что.

Вариант 1 закрывает класс целиком; вариант 2 бесплатный, но опирается на глаз.

Связано: #74 (ссылки на Secret/ConfigMap и их ключи), #56 (схемы CRD), #64 (шаблоны ESO). Это тот же предполётный слой, но класс другой: не ссылки и не значения, а текст, который парсит само приложение.

## Зачем На PR #288 (Tracktor) в `kubernetes/apps/homepage/homepage/app/configmap.yaml` добавлена плитка дашборда со строкой: ``` description: Учёт машин: топливо, обслуживание, страховки ``` Двоеточие с пробелом внутри незакавыченного скаляра — синтаксическая ошибка YAML для того текста, который лежит в `data.services.yaml`. Разбор внутреннего текста даёт: ``` mapping values are not allowed here in "<unicode string>", line 62, column 32 ``` Внешний манифест при этом валиден: `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, но не на их содержимое. - Обычные линтеры YAML (`yamllint` и прочие) видят только внешний документ: block scalar для них — одна строка. Класс не экзотический: в репо три файла и девять таких ключей — `homepage/homepage-config` (семь ключей `*.yaml`), `apps/ai/searxng` (`settings.yml`), `apps/grachevko/filebrowser`. Проверка «в лоб» на текущем main покраснеет из-за строки выше — это и есть негативная проба её силы. ## Что должно быть CI валит PR, если текст внутри `ConfigMap.data.<ключ>` с расширением `.yaml`/`.yml`/`.json` не парсится соответствующим парсером, и называет место: ``` homepage/homepage-config data.services.yaml: mapping values are not allowed here (line 62, column 32) ``` ## Критерий готовности 1. Ветка с `description: Учёт машин: топливо, обслуживание, страховки` в `homepage-config/services.yaml` краснеет; в тексте ошибки — объект, ключ, строка и столбец. 2. Ветка с тем же значением в кавычках (`description: "Учёт машин: топливо, обслуживание, страховки"`) проходит. 3. Проверка идёт джобой в существующем workflow рядом с `Flate` (иначе её контекст не входит в защиту ветки), фильтр по путям `kubernetes/**/*` её уже покрывает. 4. Остальные файлы с вложенным конфигом (`searxng`, `filebrowser`) остаются зелёными — проверка не должна ловить не-ошибки. 5. Вводить её вместе с правкой той строки: без правки main красный по собственному же гейту. ## Развилка (нужно решение владельца) Готового гейта под класс не нашлось (список `kube-linter` и README `flate` — выше). Варианты: 1. Свой чекер (десяток строк: взять `ConfigMap.data`, распарсить ключи по расширению) — ловит класс точно и даёт сообщение с координатами; упирается в правило репо «гейт ставится готовым инструментом, свой скрипт в CI возвращается». 2. Без гейта, класс на ревью: тогда правило-привычка — значения с `: ` внутри block scalar цитировать, и первым делом правка строки в #288. 3. Ждать проверку в апстриме (`home-operations/flate`, «rendering-only»): рассчитывать на неё сейчас не на что. Вариант 1 закрывает класс целиком; вариант 2 бесплатный, но опирается на глаз. Связано: #74 (ссылки на Secret/ConfigMap и их ключи), #56 (схемы CRD), #64 (шаблоны ESO). Это тот же предполётный слой, но класс другой: не ссылки и не значения, а текст, который парсит само приложение.
Sign in to join this conversation.
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
grachevko/home-ops#289
No description provided.