83

I’m trying to change the value of a variable if another variable it set by combining the two with a dash in the middle, I’m not sure of the syntax to do this, I’m thinking of somethings like:

{{- $serviceNamespace := .Values.serviceNamespace -}}
{{- $serviceTag := .Values.serviceTag -}}
{{- if $serviceTag}}
{{- $serviceNamespace := .Values.serviceNamespace  "-" .Values.serviceTag -}}
{{- end}}

Is this correct? if serviceNamespace was hello and serviceTag was 1.0.0 would I end up with serviceNamespace being hello-1.0.0?

Simon I
  • 3,406
  • 4
  • 26
  • 32
  • 1
    What is the need for reassigning $serviceNamespace variable again. Why can't use (( $serviceNamespace }} - {{ $serviceTag }}? – Bimal Jul 25 '17 at 00:49

3 Answers3

108

For concatenation just use printf:

{{-  $serviceNamespace := printf "%s-%s" .Values.serviceNamespace .Values.serviceTag -}}
abinet
  • 2,552
  • 1
  • 15
  • 24
  • 1
    This gives me an error "mapping values are not allowed in this context" on helm install, but still works... ??? – A. Rabus Feb 12 '19 at 12:53
  • Thank you for this. I'm going to post an issue to their github repo which shows how I used this to avoid a string casting issue to int inside a range loop! – dokun1 Aug 21 '19 at 13:03
  • or if you want to concatenate string `name: {{ .Release.Name }}-mystring-chart` – Adiii Sep 30 '21 at 05:59
73

You can simply do it like this , with string ":" in middle

"{{ $values.image.repository }}:{{ $values.image.tag }}"
Gabriel Wu
  • 1,938
  • 18
  • 30
35

Update

It is now possible in the 1.11 version of golang, see commit:

{{- $serviceNamespace := .Values.serviceNamespace -}}
{{- $serviceTag := .Values.serviceTag -}}
{{- if $serviceTag}}
{{- $serviceNamespace = print .Values.serviceNamespace  "-" .Values.serviceTag -}}
{{- end}}

Notice the new = operator in $serviceNamespace = print .Values.serviceNamespace "-" .Values.serviceTag

Older golang versions

You cannot currently (in golang 1.9, but available in 1.11, see update above) reassign template variables because if introduces a new scope. Until this is fixed (see issue and proposed fix), you can work around this by writing a function:

{{ define "makeServiceNamespace" }}
    {{- if .Values.serviceTag }}
    {{- printf "%s-%s" .Values.serviceNamespace .Values.serviceTag -}}
    {{- else }}
    {{- print .Values.serviceNamespace }}
    {{- end }}
{{- end }}

Then use it like so:

serviceNamespace: {{ template makeServiceNamespace . }}
David
  • 9,635
  • 5
  • 62
  • 68