如何将环境变量传递到Helmfile值文件

问题描述 投票:0回答:1

我是

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 }}"

有人可以帮助我吗?我在这里缺少什么?

azure-devops go-templates helmfile
1个回答
0
投票

环境中的值通常在 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)环境不同。

© www.soinside.com 2019 - 2024. All rights reserved.