Я пытаюсь реализовать шаблон входящего Helm, кодирующий текущую версию приложения в URL-адресе. Это позволит пользователям выполнять мягкую миграцию, предоставляя им разные версии приложения.
Пример:
mydomain.org/1.0/applicationpath
mydomain.org/1.1/applicationpath
mydomain.org/2.0/applicationpath
Чтобы предотвратить настройку этого вручную при входе при каждом обновлении, я бы предпочел, чтобы регулярное выражение определяло версию major.minor автоматически. Приложение переработано в соответствии с Semver 2.0.0, так что шаблон вроде \ d +. \ D + должен работать.
Я пробовал примерно так:
apiVersion: extensions/v1beta1
kind: Ingress
spec:
backend:
serviceName: {{ .Release.Name }}-my-srv
servicePort: 80
rules:
- host: {{ .Values.app.ingress.host }}
http:
paths:
- path: /{{ .Chart.AppVersion | regex \d+.\d+ }}
К сожалению, мне не удалось найти функцию для регулярных выражений. Есть ли возможность добиться этого с помощью шаблона руля?
Да, есть. Однако, к сожалению, это недокументировано.
Хелм использует веточка библиотека для предоставления дополнительных функций для создания шаблонов. Недокументировано множество функций веточки, которые были добавлены в код (см. Выпуск # 84), и некоторые из них - функции регулярных выражений. Вы можете найти эти функции здесь: https://github.com/Masterminds/sprig/blob/master/regex.go
Таким образом вы можете сделать {{ .Chart.AppVersion | regexFind "\d+\.\d+" }}
(обратите внимание, что я также добавил \
перед .
чтобы избежать этого как .
означает соответствие любому символу, который не соответствует вашим намерениям)
Не ваш вариант использования, а одно примечание для других, которые могут быть заинтересованы в использовании regex*
функций из веточки, заключается в том, что, к сожалению, владелец веточки сделал строку объекта вторым аргументом всех функций, а некоторые функции имеют дополнительные аргументы после нее (например, regexReplaceAll
функция). Причина, по которой это является проблемой, заключается в том, что когда функция используется в конвейере, результат предыдущего элемента в конвейере становится последним аргументом функции. Так что это не работает: "foo subject string" | regexReplaceAll "foo" "bar"
, как это будет лечить bar
как строка для работы, и foo subject string
в качестве строки для замены любых вхождений foo
with (которых в этом примере не было бы).
Пришлось разобраться с этим сегодня, вам понадобится что-то вроде:
{{ regexFind "\\d+\\.\\d+" .Chart.AppVersion }}
Требуется двойное экранирование из-за yaml.