Skip to content

DevOps 分享 #26

Description

@snxq

今天给大家分享下 devops 的相关内容。

之前我就是在老东家的工程效率部门做大仓的 devops 相关工作,来腾讯后也是在 CICD 平台做过一阵子开发。其实 devops 和我们是息息相关,只要你还在写代码,只要现网还有要维护的服务,那么就需要了解下 devops,能够帮助你利用现有的平台和工具提高服务质量以及交付速度。

开发模型进化史

那我们就开始吧,首先说说历史上的开发模型。

瀑布开发模型是比较早的开发方式定义,从计划制定到产品交付整个过程划分了几个主要阶段,制定计划、需求分析、软件设计、程序编写、软件测试和运行维护,主要涉及到的角色有 产品经理、开发人员、测试人员、运维人员。瀑布模型定义在当前阶段完成之后才能进入到下一个阶段,由此导致的问题就是阶段间相互依赖,到软件测试阶段代码才会集成,导致项目 delay 的风险极大。

所以在之后的敏捷开发就提出来了要尽早的集成代码,并且随着需求的动态变更,可以尽可能快地看到修改结果。但这样搞其实不管是开发测试还是运维产品,大家都比较累,属于是小迭代加快了,但是工作量依旧是那么多,只是在保证质量的前提下加快了交付速度。

那么就到了 devops 了,从字面意思理解,就是开发和运维放在一起了。在瀑布到敏捷开发的转变下,其实工作量并没有减少,所以这个交付速度的提升是有上限的。所以提出来用自动化的方式来加快从开发到部署上线期间的过程,从而达到干掉测试以及运维来提高交付效率。也就是,you build & test & deploy it。

测试自动化

接下来看看如何干掉测试,也就是测试自动化是怎么搞的。首先要说明的是测试并不能与质量挂钩,有测试不一定代表代码质量一定很好。这里我按测试规模从小到大排序,而越小的测试运行频率则越高,分别为 单元测试、接口测试、系统测试、全链路压力测试。

单元测试可以说是发现 bug 最有效的方式,它的测试对象为函数,一般是将函数抽象为黑盒,对给定的函数输入断言输出是否与期望相等。当然也可以做白盒测试,对函数中的各个步骤做验证。之前很火热的 TDD 测试驱动开发,也大多可以在单测上试试。不过单测好是好,也需要评估下是否需要,如果是需要一直迭代的项目,那写一次单测的收益会很高,反之如果是一次性的脚本类似工作的话,大可不必浪费时间。

接口测试主要测试对象为 api,也是断言给定输入下的输出是否为预期结果。从某种意义上来说,也算是一种 e2e 测试,一般都有对应的自动化测试脚本生成工具,工作量都在测试用例的编写上,mock 掉下游的依赖服务,一次编写,即可每次在变更后自动验证。

这里的系统测试指类似于前后端联调,在微服务比较多的情况下会涉及到很多模块,这种测试一般会针对测试指标或者功能单独划分环境进行手动测试。

全链路压测一般用不上,除非是像微信淘宝这种toc的服务,对qps和可靠性要求都非常高,一般都是手动测试,不过压测有对应的压测平台。

综上所述,将最常用到的单测和接口测试自动化,会很好的提高代码质量。除此之外呢还有基准测试啊模糊测试啊混沌测试,不过这些都是针对服务的某一方面,一般服务也不会用到的。

上云干掉运维

讲完测试,接下来需要干运维了,那就是上云。在没有上云之前,我们的服务需要部署在物理机上,如果是多台机器还得分别登录操作,所以之前用的最多的常用工具之一就是跳板机,在各种环境跳来跳去。手动创建配置文件,手动运行命令跑服务,所以很容易出问题。

上云后简单多了,通过脚本编译生成容器镜像,无需关心运行环境,一条命令就可以部署镜像到 k8s 集群中多个实例。配合已有的服务注册中心、远程配置中心、网关服务,除了需要手动创建网关路由外,即可全自动化部署,无需人工参与。

CICD 流水线

在讲 cicd 自动化前,特意加了一章,先来说说 git 工作流。git flow 有很多种,目前主要流行的还是 github flow,也最方便。首先它是基于主干开发,保证的是主干上一定是最新的代码。一般情况主干也会是生产环境运行的当前代码,也可以通过打标签来实现迭代发布。其次是使用功能分支作为一次性的开发分支,使用该分支创建 mr,然后使用压缩合并到主干,这样不会污染到主干的提交历史。

最后来说说 cicd 自动化流程。按环境区分,cicd的流程也是不一样的,一个完整的 cicd 流程包括 lint test build 以及 deploy。在我们创建功能分支后,就需要创建 pull request了,之后在该分支上的所有提交都会触发测试环境的 CICD 流水线,如果代码没有问题就会发布到测试环境(保证最小可行性以及尽早集成),接受cr,反复这一过程,直到测试没有问题,cr通过,那么就可以 merge 了。这里建议是每个 mr 负责人负责 merge,因为这里的修改提交人最清楚,提交信息也是负责人写最好。等到merge成功后就会触发正式环境的 cicd 流水线,完成功能交付。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions