Gibt es eine Regex-Funktion für Kubernetes-Helmvorlagen?

9

Ich versuche, eine Ingress-Helmvorlage zu implementieren, die die aktuelle Anwendungsversion in die URL codiert. Auf diese Weise können Benutzer eine weiche Migration durchführen, indem sie verschiedene Versionen der Anwendung bereitstellen.

Beispiel:

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

Um zu verhindern, dass dies bei jedem Update manuell im Ingress konfiguriert wird, würde ich einen regulären Ausdruck bevorzugen, der die major.minor-Version automatisch ermittelt. Die Anwendung wurde gemäß Semver 2.0.0 überarbeitet, daher sollte ein Muster wie \ d +. \ D + die Arbeit erledigen.

Ich habe so etwas versucht:

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+ }} 

Leider konnte ich keine Funktion für reguläre Ausdrücke finden. Gibt es eine Option, um dies mit einer Helmvorlage zu erreichen?

Oliver Probst
quelle

Antworten:

11

Ja da ist. Es ist jedoch leider nicht dokumentiert.
Helm verwendet den Zweig Bibliothek zusätzliche Funktionen zur Verfügung zu stellen für Templating. Was nicht dokumentiert ist, sind viele der Zweigfunktionen, die dem Code hinzugefügt wurden (siehe Ausgabe Nr. 84 ), und die Regex-Funktionen sind einige davon. Sie finden diese Funktionen hier: https://github.com/Masterminds/sprig/blob/master/regex.go

So können Sie tun {{ .Chart.AppVersion | regexFind "\d+\.\d+" }}

(Beachten Sie, dass ich auch ein \vor dem hinzugefügt habe ., um ihm zu entkommen ., um einem Charakter zu entsprechen, der nicht Ihre Absicht zu sein scheint.)

 

Nicht Ihr Anwendungsfall, aber ein Hinweis für andere, die an der Verwendung der regex*Funktionen von sprig interessiert sein könnten , ist, dass der Sprig-Besitzer die Betreffzeichenfolge leider zum zweiten Argument aller Funktionen gemacht hat und einige der Funktionen nachher zusätzliche Argumente haben es (zB die regexReplaceAllFunktion). Der Grund, warum dies ein Problem ist, besteht darin, dass bei Verwendung einer Funktion in einer Pipeline das Ergebnis des vorherigen Elements in der Pipeline zum letzten Argument der Funktion wird. Dies funktioniert also nicht : "foo subject string" | regexReplaceAll "foo" "bar", da es barals die Zeichenfolge behandelt wird, mit der gearbeitet werden soll, und foo subject stringals Zeichenfolge, um alle Vorkommen von foodurch zu ersetzen (was in diesem Beispiel keine geben würde).

Patrick
quelle
2
Nur für den Fall, dass jemand anderes das gleiche Problem hat, das ich damit gemacht habe, musste ich mich dem Backslash entziehen \d, damit dies funktioniert, und mein Vorlagen-Snippet .Capabilities.KubeVersion.Minor | regexFind "\\d+"
erstellen
8

Musste mich heute damit befassen, werden Sie etwas wollen wie:

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

Benötigt die doppelte Flucht aufgrund von Yaml.

Docs dafür

John White
quelle