【问题标题】:Change value in yaml file without changing the files structure在不更改文件结构的情况下更改 yaml 文件中的值
【发布时间】:2022-02-03 11:56:48
【问题描述】:

我正在考虑使用 Jenkins 和 ArgoCD 在我的集群中设置 GitOps CI/CD 管道。

首先,我想为我的 CI 环境创建一个存储库,其中包含一些用于我的应用程序的 Helm 图表的值文件。

我无法真正弄清楚的一件事是,如何在不更改文件整体结构的情况下自动编辑 Helm 值文件。

用于读取和写入 yaml 文件的 Jenkins 管道方法将完全重新创建它,并在此过程中重新格式化整个文件。

yq 不会(似乎)重新排序键,但它会删除空行和 cmets,例如。

我想到的唯一其他事情是使用sed。但这感觉有点不对劲。它可能很容易破裂。就像我在另一个同名的组中添加第二个键一样。或者添加或删除键。

为了更清楚,这里举个例子:

我有两个存储库,一个用于我的应用程序,一个用于我的 CI、NI 等配置。

我的应用程序仓库并不那么重要。只是一些应用程序。我的配置存储库看起来有点像这样:

 .
...
├── ci
│   ├── app1
│   │   ├── Chart.yaml
│   │   ├── values.yaml
│   ├── app2
...
├── staging
│   ├── app1
│   │   ├── Chart.yaml
│   │   ├── values.yaml
│   ├── app2
...

app1 在ci 文件夹中的values.yaml 文件可能如下所示:

app1:
  image:
    tag: 1.33.7

  ingress:
    enabled: true
    hosts:
      - app1.my-internal-ci.company.com
  ...

实际的舵图在其他地方,这里只是环境中应用程序的配置。

ArgoCD 监视此 repo 并注意所需状态(由 repo 的状态指定)和集群中的实际状态匹配(有关该工具的更多信息,请参阅 https://argoproj.github.io/cd/)。

作为最后一步,我的app1 的 CI 管道从我的应用程序仓库中的代码构建 docker 映像,应该使用新版本 @ 更新配置仓库中 ci 文件夹中的 values.yaml 文件987654332@ 刚刚构建的应用程序并将其作为新提交推送到主分支。

除此之外,还配置了其他值,例如入口,如果需要,我会在 repo 中手动更新。

由于文件由 CI 构建管道自动更新并由开发人员/DevOps 工程师手动更新,因此我希望能够使它们易于被人类阅读(键的顺序、换行符、cmets ...... )

还有其他方法可以实现吗?

提前致谢!

【问题讨论】:

  • 您能更具体地说明您要完成的工作吗?为什么要编辑值文件?你可以在 CI 中使用 不同的 值文件吗?这个问题有一个具体的例子会更好。
  • 我添加了一个示例以使其更清晰。

标签: jenkins yaml kubernetes-helm gitops


【解决方案1】:

您可以在此处直接使用helm install -f 选项。关于它有两个重要的细节:

  1. helm install -f 值在图表中与values.yaml 一起使用。您无需在本地设置中重复图表的值。
  2. helm install -f 接受任何有效的 YAML 文件;但是每个有效的 JSON 文件都是有效的 YAML 文件,所以如果你的 CI 工具可以写出 JSON,它可以创建一个可以传递给 helm install -f 的文件。

确实,YAML 文件的精确格式并不重要,只要正确的键、序列和映射具有正确的结构。

在 Jenkins 上下文中,您可以使用标准的 writeJSON 函数来生成本地值文件:

// Only need to provide the specific values we need to set;
// the chart's values.yaml will be used for anything we don't
// directly provide here
helmValues = ['environment': 'production',
              'tag': GIT_COMMIT]
writeJSON file: 'values.deploy.yaml', json: helmValues

sh 'helm upgrade --install -n myproject myproject ./charts/myproject -f values.deploy.yaml'

【讨论】:

  • 要添加到此,您可以在命令中指定多个-f。最后一个优先并覆盖其他。例如:helm install someChart -f base_values.yaml -f devEnvironment.yaml -f productionEnvironment.yaml
  • 感谢您的想法,但似乎我没有很好地解释我的问题。我不想从我的 CI 管道执行 helm upgrade,而是使用 CD 工具(如 ArgoCD)进行实际部署。我在原始帖子中添加了一个示例来概述我想要进行的设置。
【解决方案2】:

经过进一步挖掘,我认为我现在最好的选择是yq。在较新的版本(> 3.0.0;https://github.com/mikefarah/yq/issues/19)中,它不应再删除任何 cmets。我想,有了换行符,我就可以活下去了。

因此,如果您有上述文件,则可以使用以下内容更新您的图像标签:

yq -i '.app1.image.tag = "1.33.8"' ci/app1/values.yaml

值得一提:如果您使用的是 kustomize 而不是 Helm,则有一个内置函数:kustomize edit set image my-app=myregistry.io/my-platform/my-app:1.2.3。

感谢您的想法和建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多