ci: валидировать шаблоны ExternalSecret (ESO v2) — ошибки исполнения не видны до кластера #64
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?
Что было
В #62 добавил шаблон ESO для
HINDSIGHT_API_TENANT_USERS. Локальноflate test allпрошёл (77 passed), а в кластереExternalSecret/ai/hindsightушёл вReady=False / SecretSyncedError:Причина — sprig-функция
keys(func keys(dicts ...map[string]interface{})) противmap[string]string, который ESO отдаёт в шаблон. Починено в #63 (rangeпо карте +sortAlphaпо готовым парам).Почему CI это не поймал
flate testпроверяет рендер, ссылки, статусы и (после #56) схемы CR — но не исполняет шаблоны ESO: они исполняются в контроллере ESO уже в кластере, локального «рендера ExternalSecret» нет ни у flate, ни у kustomize. Класс ошибок «шаблон падает на типе/функции» проходит зелёным.Чем это опасно: при ошибке шаблона ESO не перезаписывает целевой Secret, то есть новое значение молча не доезжает (в нашем случае спасло то, что старое значение было корректным и API продолжал работать). Заметить можно только глазами в статусе ES.
Варианты
go run) сtext/template+ sprig, на входе —map[string]string(как у ESO, именно в этом соль), на выходе — ошибка на первом невалидномExternalSecret.spec.target.template.dataиз отрендеренного дерева. Версию ESO пинить, как и всё остальное (правило: сверять с установленной версией, см. #56). Рекомендую.ExternalSecretсReady=False— в мониторинг: ловит не только шаблоны, но и любые ошибки провайдера (Vault недоступен, свойство удалено — ровно тот случай, из-за которого #62 вообще понадобился). Рекомендую как дополнение к 1.Готовность
keys .вместоrange) и зелёный на текущемhindsight.ExternalSecretв состоянииReady=False.Пока этого нет, правило зафиксировано в скилле:
home-ops-cluster/references/eso-templates.md(не использовать sprig-функции, требующиеmap[string]interface{}; сортировать значения для стабильности байтов;mergePolicy: Replaceпо умолчанию; при ошибке шаблона Secret не портится, а точный текст ошибки — только в логе контроллера).