从文件创建 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 }}
我有一个模板可以从 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 }}