测试舵图模板

问题描述 投票:0回答:1
有没有办法测试模板是否适用于所有可能的值?

(注意:这与 helm 测试不同,helm 测试用于通过作业中运行的任意代码来测试已部署的图表)。

我想要实现的是迭代一组值并检查每个值生成的 K8s 资源。

假设我们要测试我们的图表是否正确书写:

图表: 值.yaml

app: port: 8081 pod2: enabled: true
AppPod.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: AppPod labels: app: nginx spec: ... spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: {{ $.Values.app.port| default 8080 }}
Pod2.yaml

{{- if $.Values.pod2.enabled }} apiVersion: apps/v1 kind: Deployment metadata: name: Pod2 labels: app: nginx2 spec: ... {{- end}}

我们要运行以下测试:

    使用默认 Values.yaml -> 断言 port=8081 并创建 Pod2
  • 缺少 app.port -> 断言 port=8080
  • pod2.enabled false -> 断言 Pod2 未创建
  • 缺少 pod2 -> 测试将失败,因为密钥“pod2”是强制性的
所以基本上是为了测试模板逻辑。

我现在在做什么: 每当我修改图表中的某些内容时,我只需为不同的 Values.yaml 运行 helm 模板并手动检查结果。手动执行此操作很容易出错,并且图表包含的模板越多,就越耗时。

是否有任何内置的 helm 功能或单独的框架?

testing kubernetes automated-tests kubernetes-helm
1个回答
3
投票
是的,我们通过

Rego 政策规则 来做到这一点。设置并不复杂,这就是它作为我们管道之一的一部分的样子(这是一个非常简单的示例,可以帮助您入门):

# install conftest to be able to run helm unit tests wget https://github.com/open-policy-agent/conftest/releases/download/v0.28.1/conftest_0.28.1_Linux_x86_64.tar.gz tar xzf conftest_0.28.1_Linux_x86_64.tar.gz chmod +x conftest # you can call "helm template" with other override values of course, too helm template src/main/helm/my-service/ > all.yaml echo "running opa policies tests" if ! ./conftest test -p src/main/helm/my-service/ all.yaml; then echo "failure" exit 1 fi

my-service

 目录内有一个 
policy
 文件夹,其中包含用于测试的“规则”(尽管这可以作为参数传递)。这是我最近编写的两条规则的示例:

package main deny_app_version_must_be_present[msg] { input.kind == "Deployment" env := input.spec.template.spec.containers[_].env[_] msg := sprintf("env property with name '%v' must not be empty", [env.name]) "APP_VERSION" == env.name ; "" == env.value } deny_app_version_env_variable_must_be_present[msg] { input.kind == "Deployment" app_version_names := { envs | envs := input.spec.template.spec.containers[_].env[_]; envs.name == "APP_VERSION"} count(app_version_names) != 1 msg := sprintf("'%v' env variable must be preset once", ["APP_VERSION"]) }
这验证了 

Deployment

 中的容器有一个名为 
APP_VERSION
 的环境变量,该变量必须是唯一且非空的。

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