我正在尝试实现一个将当前应用程序版本编码到 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
(在此示例中不会有任何出现)。