我是
helmfile
的新手,我想使用在运行 helmfile diff 时在 helmfile 值文件中使用的导出环境变量。
我有以下
helmfile.yaml
如下:
repositories:
- name: backstage
url: https://backstage.github.io/charts
# - name: backstage-additional-configs
# url: ./backstage-additional-configs
helmDefaults:
cleanupOnFail: true
verify: false
wait: true
timeout: 180
historyMax: 0
recreatePods: true
atomic: true
createNamespace: false
helmfiles:
- path: releases/releases.yaml
values:
- {{ .Environment.Name }}.yaml
environments:
dev:
values:
- dev.yaml.gotmpl
这就是我的
dev.yaml.gotmpl
的样子
backstage:
image:
registry: somregistry
image: someimage
tag: {{ .Values.IMAGE_TAG | quote }}
我正在使用 Azure DevOps 管道执行
helmfile
命令,因为我需要根据 IMAGE_TAG
动态设置 $(Build.BuildId)
值,所以这是我的 pipeline.yaml
的外观:
. . .
- task: AzureCLI@1
displayName: 'Run helmfile - diff'
inputs:
azureSubscription: ${{ parameters.keyvault_service_connection }}
scriptLocation: 'inlineScript' # Options: inlineScript, scriptPath
inlineScript: |
set -euo pipefail
export IMAGE_TAG=$(Build.BuildId) #<-------- exporting here
helmfile -b /usr/local/bin/helm3 -e ${{ parameters.env }} repos
helmfile -b /usr/local/bin/helm3 -e ${{ parameters.env }} diff
所以我用
IMAGE_TAG
命令导出 export IMAGE_TAG=$(Build.BuildId)
。
我收到以下错误:
在./helmfile.yaml中:无法读取helmfile.yaml:无法加载环境值文件“dev.yaml.gotmpl”:无法渲染[dev.yaml.gotmpl],因为模板:stringTemplate:18:19:在<.Values.IMAGE_TAG>处执行“stringTemplate”:地图没有键“IMAGE_TAG”的条目
我也尝试过
tag: "{{ .Values.IMAGE_TAG }}"
有人可以帮助我吗?我在这里缺少什么?
环境中的值通常在 Helmfile 模板(或普通 Helm)中不可见。
Helmfile 包含
env
和 requiredEnv
模板函数,并且 文档包含使用它们的示例。在您的 *.yaml.gotmpl
文件中,您需要显式请求环境值;它不会自动反映在 Helmfile 值中。
# dev.yaml.gotmpl
tag: {{ requiredEnv "IMAGE_TAG" | quote }}
如果未设置环境变量,则 env
默认为空字符串,与 shell 中的 "$IMAGE_TAG"
相同;您可以将其与 default
结合使用。如果未设置变量,requiredEnv
会产生致命错误。
原则上,您可以使用
helmfile --state-values-set
选项将此值注入 Helmfile 级值,以便问题中显示的模板语法有效。不过,这并没有大量记录。它的语法大概类似于 helm --set
,它带有一些不寻常的语法以及一些它可以和不能直接设置的东西;对于简单的字符串值,这将是一个合理的替代方案。
Helmfile 术语在这里有点令人困惑,因为 Helmfile 还有一个“环境”的概念,通常是“dev”与“prod”之类的东西,这与 Unix(shell)环境不同。