🐋

HELM の if は 短絡評価されない

2022/06/02に公開
{{- if and .Values.test1 .Values.test1.test2 }}

と書いたとき
C++ など多くの言語では 1 つ目の文の評価(ここでいうと .Values.test1)が false の場合、2 つ目の文の評価はされない。
2 つ目の評価が true/false のどちらであれ、全体として false になることが決定するからである。これを短絡評価と言う。

HELM の場合、この短絡評価が行われない。
例えば、Values.yaml に以下を渡す。

test3:
  test4: "testtest"

このとき、期待としては .Values.test1 の値は false になるため、全体として false になってほしいのだが、実際は以下のようなエラーがでる。

<.Values.test1.test2>: nil pointer evaluating interface {}.test2

2 つ目の文も評価され、nil の要素にtest2は存在しないというエラーになる。

現状、回避策として 2 回に if を分けて運用しているが、他に良い案があれば教えて下さい。。

{{- if .Values.test1 }}
{{- if .Values.test1.test2 }}

Discussion