图为知更鸟蛋。https://pixabay.com/zh/photos/robin-robin-eggs-nest-four-2301209/
Helm是一款声明式的K8s部署工具。Chart是Helm的部署方式的一个包的格式。本文基于helm v3版本。
本文将介绍:
-
1. 为什么需要Helm单元测试
-
2. 如何写Helm单元测试
-
3. 如何集成到构建流水线中
为什么需要Helm单元测试
Helm使用的模板语言是Go Template。而这种模板语言非常难维护,所以,Helm的Chart包也就变得难维护。
当我们写好Chart中的YAML文件后,我们只能通过手工执行Helm template命令去验证它的语法正确性。这样做的弊端有:
-
1. 无法自动化验证
-
2. 无法重复验证
如何进行Helm单元测试
Helm3的单元测试需要以下几步:
-
1. 安装helm3-unittest插件 ;
-
2. 将$YOUR_CHART/tests加入到 .helmignore。因为你不需要将tests目录打包进最终的chart包中;
-
3. 写单元测试代码;
-
4. 集成到持续集成流水线。
安装helm3-unittest插件
helm plugin install https://github.com/vbehar/helm3-unittest
当然,你也可以加 –version 参数指定版本。如下:
helm plugin install --version 1.0.16 https://github.com/vbehar/helm3-unittest
写单元测试的步骤
步骤很简单,如下:
-
1. 创建$YOUR_CHART/tests目录。注意,不是$YOUR_CHART/templates/test目录。
-
2. 在$YOUR_CHART/tests目录写单元测试。
-
3. 在repo的根目录执行命令:
helm unittest .
。
单元测试的写法
我们创建一个单元测试案例$YOURCHART/tests/deloyment_test.yaml:
suite: test deployment
templates:
- deployment.yaml
tests:
- it: should pass all kinds of assertion
values:
# 指定一个values文件 相对于 $YOUR_CHART/tests路径。
- ./values/image.yaml
set:
# 覆盖以上values的一项配置
service.internalPort: 8080
asserts:
- equal:
path: spec.template.spec.containers[0].image
value: apache:latest
- notEqual:
path: spec.template.spec.containers[0].image
value: nginx:stable
- matchRegex:
path: metadata.name
pattern: ^.*-basic$
- notMatchRegex:
path: metadata.name
pattern: ^.*-foobar$
- contains:
path: spec.template.spec.containers[0].ports
content:
containerPort: 8080
- notContains:
path: spec.template.spec.containers[0].ports
content:
containerPort: 80
- isNull:
path: spec.template.nodeSelector
- isNotNull:
path: spec.template
- isEmpty:
path: spec.template.spec.containers[0].resources
- isNotEmpty:
path: spec.template.spec.containers[0]
- isKind:
of: Deployment
- isAPIVersion:
of: extensions/v1beta1
- hasDocuments:
count: 2
- matchSnapshot:
path: spec
集成到持续集成流水线
我们使用GitHub actions为例:
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Helm unittest
uses: WyriHaximus/github-action-helm3@v2.0.0
with:
# 可以考虑自定义一个github-action-helm3插件,然后将插件打包进去
exec: helm plugin install --version 1.0.16 https://github.com/vbehar/helm3-unittest && helm unittest .
Helm插件的一点点基础知识
-
• 环境变量 HELM_PLUGINS 可以指定Helm plugin的安装路径。
-
• 如果工程中的Helm插件过多,可以考虑提前将插件放在$HELM_PLUGINS目录中。
后续
Helm单元测试只是测试Helm语法级别的错误,并不能测试到它真正运行在K8s的效果。如果要测试它真正运行在K8s上的效果,我们需要集成测试。这是另一个主题。
代码地址:https://github.com/zacker330/helm3-unittest-demo
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/70956.html