使用 Terraform 和 GitHub Actions 对基础设施进行自动化安装测试

1. 测试是海上的航标

项目越复杂、规模越大,越能体现测试的价值和重要性。测试保证了方向的正确性。就像航行时,海上出现的航标,可以用来检验、纠正路线。便于掌舵人,随时了解动态,做出调整。测试决定了迭代的速度。随着 Scrum 等敏捷开发方法的实践,交付的节奏在加快。测试是交付质量的保障,如果测试跟不上,敏捷将无法落地。测试很重要,但却是一本经济账。太少,不足以保障质量;太多,维护成本又很高。卡住关键点位,才能获得高的性价比。再来看看需要测试的产品。KubeSphere 很小,却又很大。说它很小,是因为只是 Kubernetes 上的应用负载,并不对原生的 Kubernetes 进行改造。说它很大,是因为集成了很多可选的组件,提供了整套的解决方案。在日常的开发过程中,有两个地方汇聚了高密度的价值: 主仓库和安装程序。主仓库,汇聚了开发者的每次变更;安装程序,汇聚了各个组件在用户安装时的行为。比较之下,我认为安装更加需要额外的自动化测试,而且也更好测试。安装是用户体验的第一印象,更加贴近用户端。下面来看看,我在测试安装程序上做的工作吧。

2. 使用 KubeSphere 测试 KubeSphere

这是一个有趣的做法,使用 KubeSphere 创建新的 KubeSphere ,并实现自测。听起来有点像自举,自己创建自己,自己测试自己。这样就有了安装程序的第一版自动化测试。每天对单节点、多节点、高可用三种安装方式进行自动化测试。安装之后,也会做一些 API 和 UI 层的测试,可以参考文档 《基于 Kubernetes 和 Jenkins 搭建自动化测试系统》 ,还有一些拨测用来实时验证线上服务是否正常,《使用 Jenkins 进行服务拨测》 。下面说一下测试流程:
  • 创建一条创建集群的流水线
  • 运行 API 自动化测试
  • 运行 UI 自动化测试,在新机器上创建一条创建集群的流水线。
  • 每次合并 PR 执行一次
  • 一个防火墙
  • 一个防火墙规则
  • 一个云主机
  • 一个安装资源
  • 初始化 IaaS 秘钥
  • Terraform 创建资源
  • 安装 KubeSphere 并检测是否符合预期
  • Terraform 销毁资源
  • Slack 发送通知
  • 进入新建的 Slack App ,点击 【Incoming Webhooks】添加 Webhook 之后,就可以获取到 Webhook URL 。
  • 4. 总结

    目前测试 Case 相对单一,后续需要继续扩充。考虑不同维度选项的组合,通过 matrix 批量组合执行。其实,Terraform 和 GitHub Actions 的方式也不是最优的。GitHub Actions 支持运行 Kind (使用一个 Docker 容器运行 Kubernetes)。如果能对接上 Kind ,完全使用 GitHub Actions 进行自动化测试会更好。另外就是可以引入 Chaos 类型的工具,在系统健壮性、高可用方面进行测试。