从文件创建 configMap 对文件类型和文件中的行数至关重要

Creating a configMap from file is critical to file type and lines count in the file

我有一个模板可以从 helm chart 中的 jmeter-test-data-file-configmap.yaml 文件创建 configMap

{{- if .Values.env.datafile }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: jmeter-testdata
data:
  {{ .Values.env.datafile }}: |-
  {{ .Files.Get .Values.env.datafile | indent 4}}
{{- end }}

对应的yaml.configuration是:

env:
  testfile: sample
  datafile: example.csv

当我执行 helm upgrade 时,一切正常,如果 example.csv 是这样的单行文本文件:

1,1

但它至少有两行甚至更多行

1,1
2,2

部署失败并显示不相关的错误消息:

upgrade.go:123: [debug] preparing upgrade for jmeter
Error: UPGRADE FAILED: YAML parse error on jmeter/templates/jmeter-test-data-file-configmap.yaml: error converting YAML to JSON: yaml: line 7: did not find expected key
helm.go:81: [debug] error converting YAML to JSON: yaml: line 7: did not find expected key
YAML parse error on jmeter/templates/jmeter-test-data-file-configmap.yaml

调试详情为:

helm.sh/helm/v3/pkg/releaseutil.(*manifestFile).sort
        /home/circleci/helm.sh/helm/pkg/releaseutil/manifest_sorter.go:146
helm.sh/helm/v3/pkg/releaseutil.SortManifests
        /home/circleci/helm.sh/helm/pkg/releaseutil/manifest_sorter.go:106
helm.sh/helm/v3/pkg/action.(*Configuration).renderResources
        /home/circleci/helm.sh/helm/pkg/action/action.go:165
helm.sh/helm/v3/pkg/action.(*Upgrade).prepareUpgrade
        /home/circleci/helm.sh/helm/pkg/action/upgrade.go:215
helm.sh/helm/v3/pkg/action.(*Upgrade).Run
        /home/circleci/helm.sh/helm/pkg/action/upgrade.go:124
main.newUpgradeCmd.func2
        /home/circleci/helm.sh/helm/cmd/helm/upgrade.go:155
github.com/spf13/cobra.(*Command).execute
        /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:850
github.com/spf13/cobra.(*Command).ExecuteC
        /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:958
github.com/spf13/cobra.(*Command).Execute
        /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:895
main.main
        /home/circleci/helm.sh/helm/cmd/helm/helm.go:80
runtime.main
        /usr/local/go/src/runtime/proc.go:204
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1374
UPGRADE FAILED
main.newUpgradeCmd.func2
        /home/circleci/helm.sh/helm/cmd/helm/upgrade.go:157
github.com/spf13/cobra.(*Command).execute
        /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:850
github.com/spf13/cobra.(*Command).ExecuteC
        /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:958
github.com/spf13/cobra.(*Command).Execute
        /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:895
main.main
        /home/circleci/helm.sh/helm/cmd/helm/helm.go:80
runtime.main
        /usr/local/go/src/runtime/proc.go:204
runtime.goexit

所以,错误指向这一行:

  {{ .Values.env.datafile }}: |-

这里可能出了什么问题,文件本身如何因为它的新行而损害模板处理?我们累了 /r/n, /n, /r 都没有成功,都一样

我们也试过像这样对 line:7 进行 hadcode:

{{- if .Values.env.datafile }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: jmeter-testdata
data:
  example.csv: |-
  {{ .Files.Get .Values.env.datafile | indent 4}}
{{- end }}

还是一样的错误。甚至用硬编码替换模板值:

{{- if .Values.env.datafile }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: jmeter-testdata
data:
  {{ (printf "example.csv" ) }}: |-
  {{ .Files.Get (printf "example.csv" ) | indent 4}}
{{- end }}

但是还是一样的错误

几乎相同的配置不会发生这种情况,它将多行 xml 文件以完全相同的方式引入 configMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: jmeter-test
data:
  test.jmx: |-
{{ .Files.Get (printf "%s.jmx" .Values.env.testfile ) | indent 4}}

我想,出于某种原因,当 intend 应用于 jmx 文件时,它可能并未应用于 csv 文件的所有行。但是如何解决这个问题呢?

更新:

1, 1
    2, 2
    3, 3

像上面那样手动“打算”文件成功了,它被部署了,但是这个文件不能满足当时的需要。如何避免这种情况?

{{ .Files.Get (printf "%s" .Values.env.datafile ) | nindent 4}}

而不是

{{ .Files.Get (printf "%s" .Values.env.datafile ) | indent 4}}

已解决问题。

但我仍然不清楚为什么 csv 文件出现了问题,而 XML 文件却没有。都是因为空格吗?

如果你有一行包含 indent 它可能需要从行的开头开始,即使它在其他缩进的上下文中也是如此。

{{- if .Values.env.datafile }}
...
data:
  {{ .Values.env.datafile }}: |-
{{ .Files.Get .Values.env.datafile | indent 4}}
{{/*- previous line is not indented */}}
{{- end }}

在你原来的例子中,让我们关注这两行:

  {{ .Values.env.datafile }}: |-
  {{ .Files.Get .Values.env.datafile | indent 4}}
## (these two spaces are important)

现在,如果输入行是你的第二个例子

1,1
2,2

现在:包含 indent 4 的行本身缩进了 2 个空格。所以在该行的开头有两个空格,加上 indent 4 中的四个空格,所以有 6 个空格;然后是来自 indent 4 的换行符和四个空格,但没有 start-of-line 空格(您仍在 indent 的输出中),所以只有 4 个空格。

  test.jmx: |-
      1,1
    2,2

如果您在原始图表上 运行 helm template --debug,您仍然会遇到 YAML 解析错误,但它也应该打印出此输出。

在某些情况下,您可能会发现使用 nindent 稍微更美观一些,它在第一行缩进之前包含一个换行符,并结合花括号内的 - 来消耗前面的空格(包括空格和换行符)。这也应该有效:

data:
  {{ .Values.env.datafile }}: |-
  {{- .Files.Get .Values.env.datafile | nindent 4}}
  {{/*- indented, starts with -, uses nindent */}}

但也例如:

metadata:
  labels: {{- include "common.labels" . | nindent 4 }}
  annotations: {{- include "common.annotations" . | nindent 4 }}