Helm3单元测试教程

导读:本篇文章讲解 Helm3单元测试教程,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

7349fba93e8866cc3554e412623231ec.png

图为知更鸟蛋。https://pixabay.com/zh/photos/robin-robin-eggs-nest-four-2301209/

Helm是一款声明式的K8s部署工具。Chart是Helm的部署方式的一个包的格式。本文基于helm v3版本。

本文将介绍:

  1. 1. 为什么需要Helm单元测试

  2. 2. 如何写Helm单元测试

  3. 3. 如何集成到构建流水线中

为什么需要Helm单元测试

Helm使用的模板语言是Go Template。而这种模板语言非常难维护,所以,Helm的Chart包也就变得难维护。

当我们写好Chart中的YAML文件后,我们只能通过手工执行Helm template命令去验证它的语法正确性。这样做的弊端有:

  1. 1. 无法自动化验证

  2. 2. 无法重复验证

如何进行Helm单元测试

Helm3的单元测试需要以下几步:

  1. 1. 安装helm3-unittest插件 ;

  2. 2. 将$YOUR_CHART/tests加入到 .helmignore。因为你不需要将tests目录打包进最终的chart包中;

  3. 3. 写单元测试代码;

  4. 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. 1. 创建$YOUR_CHART/tests目录。注意,不是$YOUR_CHART/templates/test目录。

  2. 2. 在$YOUR_CHART/tests目录写单元测试。

  3. 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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!