是否有适用于 kubernetes helm 模板的正则表达式函数?

是否有适用于 kubernetes helm 模板的正则表达式函数?

我正在尝试实现一个将当前应用程序版本编码到 URL 中的入口 Helm 模板。这将允许用户通过向他们提供不同版本的应用程序进行软迁移。

例子:

mydomain.org/1.0/applicationpath
mydomain.org/1.1/applicationpath
mydomain.org/2.0/applicationpath

为了避免每次更新时在入口处手动配置这一点,我更喜欢使用正则表达式自动确定主要版本和次要版本。该应用程序是根据 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+ }} 

不幸的是,我找不到正则表达式函数。有没有办法使用 helm 模板来实现这一点?

答案1

是的。但不幸的是,它没有文档记录。Helm
使用小枝库提供模板的附加函数。许多添加到代码中的 sprig 函数尚未记录(参考问题 #84) 和正则表达式函数就是其中的一些。您可以在这里找到这些函数:https://github.com/Masterminds/sprig/blob/master/regex.go

因此你可以这样做{{ .Chart.AppVersion | regexFind "\d+\.\d+" }}

(请注意,我还在\之前添加了一个以.将其转义为.匹配任何字符的手段,这似乎不是你的意图)

 

这不是您的用例,但对于其他可能有兴趣使用regex*sprig 中的函数的人来说,有一点需要注意,那就是不幸的是,sprig 所有者将主题字符串作为所有函数的第二个参数,并且某些函数在其后面有附加参数(例如函数regexReplaceAll)。 这是一个问题的原因是,当在管道中使用函数时,管道中前一个元素的结果将成为函数的最后一个参数。 所以这不起作用:,"foo subject string" | regexReplaceAll "foo" "bar"因为它会将其bar视为要操作的字符串,并将foo subject string其视为要替换任何出现的字符串foo(在此示例中不会有任何出现)。

答案2

今天必须处理这个问题,你会想要类似这样的东西:

{{ regexFind "\\d+\\.\\d+" .Chart.AppVersion }}

由于 yaml,需要双重转义。

文档

相关内容