头盔测试最佳做法

时间:2019-10-08 14:45:58

标签: docker kubernetes kubernetes-helm

只是澄清一下。

  1. 我不是在谈论Helm图表最佳实践。我可以在这里自己阅读它们:https://helm.sh/docs/chart_best_practices/
  2. 我不是在谈论Terratest。

我对Helm Test感兴趣,您可以在https://helm.sh/docs/chart_tests/#chart-tests上详细了解它。

不幸的是,文档没有为您提供很多信息,这部分是造成此问题的原因。

我们所拥有的:

  1. 我们可以通过以下路径在图表中定义测试
  

our-app / templates / tests / test-our-app.yaml

  1. 据我所知并根据文档,它不是图表的单元测试,而更像是冒烟测试或集成测试。文档:“验证图表在安装时是否可以按预期工作”。这正是我所需要的。
  2. 为了运行测试https://helm.sh/docs/chart_tests/#steps-to-run-a-test-suite-on-a-release。 我们需要安装我们的应用程序图表
    $ helm install our-app

然后我们可以测试该图像

    $ helm test release-with-our-app

我想澄清的事情:

  1. 我们应该有两个单独的docker映像还是一个用于应用程序和测试的映像?...

    a)。如果应用程序代码和测试代码都是单个映像,那么我们将在该映像上添加用于所有测试的代码,这使其变得更大,此外,我们需要在该映像上放置测试所需的依赖项。对我来说,这种解决方案似乎是错误的。

    b)。我们有一个单独的映像进行测试的情况更有意义,因为我们的应用程序docker映像没有任何不必要的依赖关系。更重要的是,在第二种解决方案中,我们并不真正在乎带有测试的docker映像的大小,因为它应该是一个短暂的映像,当对其进行测试时会关闭。

    我的假设是正确的,我们应该为这些测试使用单独的图像吗?

  2. 如果有两个单独的图像,一个用于代码,另一个用于测试。我们如何彼此结婚?这是否意味着我们必须将构建/发布编号传递给头盔测试命令,以便它能够提取正确的图像进行测试?

  3. 如果我们有两个单独的图像,也是这样。我应该在docker文件中指定测试运行以进行测试吗? 例如:

   CMD ["sh", "-c", "gradle test -Denvironment=$ENVIRONMENT"]

还是应该在图表内

   our-app/templates/tests/test-our-app.yaml

例如mysql仓库中的test.yaml:

  

https://github.com/helm/charts/blob/master/stable/mysql/templates/tests/test-configmap.yaml

  1. 文档中似乎根本没有提到环境。我的问题是将环境名称传递到图表的最佳/推荐方式是什么,以便测试知道要命中哪些端点?应该是图表参数How to pass dynamic arguments to a helm chart that runs a job吗?

2 个答案:

答案 0 :(得分:3)

您可以通过以下链接在mysql图表中找到一个示例 https://github.com/helm/charts/tree/master/stable/mysql/templates

回答我自己的问题:

  1. 由于以下原因,我们为舵机测试制作了单独的docker映像:
    1.1当头盔烟雾docker映像分离时,使其不受主应用程序docker映像的任何约束。因此,您可以安装任何库,并避免遵循主要应用程序必须遵循的一些安全准则。
    1.2对舵手测试的docker图像的大小没有限制,因为它是短时的活动图像,舵手测试的图像在整个测试期间都是实时的。
  2. 我们通过Chart版本与他们结婚。因此,主应用程序的映像始终与头盔测试泊坞窗映像具有相同的版本。 enter image description here

我们无需传递任何内容,当您运行“ helm test yourapp”时,helm会查找成功部署的yourapp版本并使用该版本运行helm test。
enter image description here
3.运行“ helm test yourapp”命令时。头盔出现在文件中
yourapp / templates / tests / smoke-test.yaml
调用以下路径指定的命令:
规格/容器/命令:[“ sh”,“-c”,“您的命令”] 请看截图或转到mysql图表https://github.com/helm/charts/tree/master/stable/mysql/templates enter image description here

的git repo
  1. 传递数据和Env特定数据的最佳方法是通过配置映射,env变量和秘密来传递它们,因为Hanx尚未得到解答。如果以这种方式存储数据,则可以通过头盔值文件填充此类数据,并且很容易更新。我们发现在映像中包含特定于环境的数据是一个不好的解决方案,因为例如,如果某个环境中的URL /主机发生了变化,我们需要创建一个新的版本,而不是仅仅更新值文件并执行部署。

答案 1 :(得分:1)

只需开始本主题:

我认为这取决于您的需求。

对于1,2,3-据我了解,“ 头盔测试”非常灵活,可以根据您的需要执行任何其他测试。

您可以使用不同的图像和不同的方法,也可以使用一个具有不同参数的图像,但有时由于docker入口点的缘故,这可能是不可能的-请参阅commands and arguments

根据第四个问题-我认为您应该考虑使用configmapssecrets来定义env变量并将其公开到pod中。

其他资源“安全测试”:

希望获得帮助。