fix(forgejo): экранировать ${1} в шаблоне uuid — Flux подставляет ${...} в манифестах #99

Merged
grachevko merged 1 commit from fix/forgejo-runner-uuid-subst into main 2026-09-21 17:38:37 +00:00
Collaborator

Ошибка применения: post build failed for 'ExternalSecret.v1.external-secrets.io/forgejo-runner': envsubst error: variable substitution failed: variable not set (strict mode): "1".

Причина. Flux после kustomize build прогоняет манифесты через envsubst (postBuild) и в strict-режиме падает на любой ${...}, которой нет среди переменных. В шаблоне ESO я использовал regexReplaceAll со ссылками на группы в Go-синтаксисе — ${1}…${5} — и Flux принял их за переменные с именем «1».

Правка. Ссылки экранированы двойным долларом: $${1}. Это штатный способ kustomize-controller сохранить фигурные скобки — в доках установленной версии (v1.9.5, docs/spec/v1/kustomizations.md) сказано дословно: «you can use $${var} which will print out ${var}». После подстановки в объекте останется ${1}, и шаблон ESO отрендерит uuid как задумано. Изменена одна строка.

Альтернатива, которую я не стал применять: аннотация kustomize.toolkit.fluxcd.io/substitute: disabled на самом ExternalSecret (тоже штатный механизм, им Flux помечает свои CRD) — но она отключает подстановку для всего объекта, а здесь достаточно локального экранирования.

Замечание по проверкам. flate этот класс ошибок не видит: он валидирует рендер, а падает подстановка уже в кластере (это тот же разрыв между «фиксом и проверкой в пайплайне», что описан в issue #81). Когда раннер заработает и в репе появится workflow, в него стоит добавить простую проверку: искать ${ внутри {{ }} в шаблонах ESO и требовать $${ для литералов. Я такую проверку прогнал вручную по всему репозиторию — нашлось ровно одно место (этот файл) плюс законная подстановка ${SECRET_DOMAIN} в echo.

Ошибка применения: `post build failed for 'ExternalSecret.v1.external-secrets.io/forgejo-runner': envsubst error: variable substitution failed: variable not set (strict mode): "1"`. **Причина.** Flux после kustomize build прогоняет манифесты через envsubst (postBuild) и в strict-режиме падает на любой `${...}`, которой нет среди переменных. В шаблоне ESO я использовал `regexReplaceAll` со ссылками на группы в Go-синтаксисе — `${1}…${5}` — и Flux принял их за переменные с именем «1». **Правка.** Ссылки экранированы двойным долларом: `$${1}`. Это штатный способ kustomize-controller сохранить фигурные скобки — в доках **установленной** версии (v1.9.5, `docs/spec/v1/kustomizations.md`) сказано дословно: «you can use `$${var}` which will print out `${var}`». После подстановки в объекте останется `${1}`, и шаблон ESO отрендерит uuid как задумано. Изменена одна строка. Альтернатива, которую я не стал применять: аннотация `kustomize.toolkit.fluxcd.io/substitute: disabled` на самом ExternalSecret (тоже штатный механизм, им Flux помечает свои CRD) — но она отключает подстановку для всего объекта, а здесь достаточно локального экранирования. **Замечание по проверкам.** flate этот класс ошибок не видит: он валидирует рендер, а падает подстановка уже в кластере (это тот же разрыв между «фиксом и проверкой в пайплайне», что описан в issue #81). Когда раннер заработает и в репе появится workflow, в него стоит добавить простую проверку: искать `${` внутри `{{ }}` в шаблонах ESO и требовать `$${` для литералов. Я такую проверку прогнал вручную по всему репозиторию — нашлось ровно одно место (этот файл) плюс законная подстановка `${SECRET_DOMAIN}` в echo.
fix(forgejo): экранировать ${1} в шаблоне uuid — Flux подставляет ${...}
Some checks failed
Flate / Flate - Filter (pull_request) Failing after 2s
Flate / Flate (pull_request) Has been skipped
Flate / Flate - Success (pull_request) Successful in 3s
5d5e7f9a9c
grachevko deleted branch fix/forgejo-runner-uuid-subst 2026-09-21 17:38:37 +00:00
Sign in to join this conversation.
No reviewers
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!99
No description provided.