Назад | Перейти на главную страницу

Доступна ли функция регулярного выражения для шаблонов kubernetes helm?

Я пытаюсь реализовать шаблон входящего 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.

Документы для этого