0

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

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

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

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

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

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

这是一个示例,以使其更清楚:

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

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

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

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

app1:
  image:
    tag: 1.33.7

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

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

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

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

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

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

有没有其他方法可以实现这一目标?

提前致谢!

4

2 回答 2

0

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

  1. helm install -fvalues.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'
于 2022-02-03T12:15:47.447 回答
0

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

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

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.

感谢您的想法和建议!

于 2022-02-17T11:32:54.827 回答