一些持续交付的实践经验
分析团队的问题 我是2020年3月份加入该部门。刚加入时发现问题还挺多。而这些问题在行业里都很典型,比如: 分支管理不统一:虽说大部分人还是在master上开发,但是还有部分人自己拉feature分支开发。 没有统一的制品打包:Docker镜像的打包基本都是在开发人员的电脑上进行的。 对制品仓库的push权限没有管理:每个人都有push权限,而且使用的是同一个账号。 没有版本管理:在交给测试人员测试(俗称提测)时,开发在本地打包后,push上制品库的包的版本号为uat20200302(UAT是测试环境的简称)。测试通过后,再使用此版本号,部署到生产环境。结果就是你会看到生产环境运行的包的版本:uat20200302,是不是很奇怪? 没有监控:这也是很多团队的通病了。 没有单元测试:开发人员有在main方法写单元测试的,有写出来的测试是无法自动化的。 开发团队没有自己的自动化测试。 多个应用部署在同一台机器。 手工部署:每次部署都是人工登录到服务器执行部署。 数据库没有版本化。 没有代码审查。 问题还有很多,就不一一列举。在笔者看来以上问题的最终表现都是软件系统的质量低下。笔者希望通过实践持续交付以提升软件系统的质量。 但是问题是该如何实践呢?笔者认为只要掌握了它的基本原则,剩下的就是根据实际情况结合基本原则来解决问题了。 持续交付的原则 幸福的家庭都是相似的,不幸的家庭各有各的不幸——《安娜卡列尼娜》 从《持续交付》书中,基本原则有: 为软件的发布创建一个可重复且可靠的过程 将几乎所有的事情自动化 把所有的东西都纳入版本控制 提前并频繁地做让你感到痛苦的事 内建质量 “DONE”意味着“已发布” 交付过程是每个成员的责任 持续改进 我们可以这么理解这些原则:基于所有东西都要进行版本化的原则,所有的东西都要代码化。 因为代码化以后就可以放到类似Git这类版本化工具中。而代码化以后的东西就可以很容易地实现自动化。在实现自动化以后就可以为软件的发布创建一个可重复且可靠的过程。 实现自动化的过程是需要每一位成员持续参与的,因为交付过程是每个人责任。 “DONE意味着已发布”是团队每个成员都要达成的共识。达成共识后,才能更好的参与持续改进。在持续改进过程中,我们的软件系统就获得了内建质量。 笔者认为,在持续交付中,代码化与版本化是基础。 实践持续交付 在理解原则后,我们就可以开始实践了。可是该如何下手呢?笔者通常遵循以下指导思想: 先CI,后CD。 无监控,无安心觉。 先配置项版本化,后标准化,最后才有自动化。 根据指导思想,再结合团队的实际情况,笔者做出以下计划: 打包自动化。 实现基础监控(机器级别监控、中间件监控)。 实现所有的配置版本化。 实现自动化部署应用。 实现应用监控。 实现数据库版本化。 实现业务监控。 研发数据收集 …. 由于团队原来已经有日志收集机制,所以,暂且不需要实现。以上步骤只代表一个优先级。如果团队人力充足,可以同时一起做。 虽说有了计划,但是团队不具备相应的能力,什么计划都白搭。 1. 打包自动化 之所以使用“打包”这个听起来不怎么“高端”的词,而不是使用“构建”。是因为“构建”这个词,太容易引起歧义。而且打包这个词很形象,就是把源代码编译后,链接,最后打包成一个可执行包。当然不同的编程语言,打包过程可能不同。 因为大多数团队都没有写自动化测试的习惯(我们团队也不例外),让他们写自动化测试,他们只会觉得自己的工作量增加了。所以,我在团队中导入持续交付实践时,一开始就不要求自动化测试。团队意识的转变需要很长的过程。这是使用“打包”的第二个原因:它不包括自动化测试。 要实现自动化打包,其实并不难。基本步骤就是: 搭建制品库:Nexus。 搭建自动化服务:Jenkins。 在Jenkins中创建pipeline任务。 在业务代码仓库中加入Jenkinsfile,将打包逻辑写到Jenkinsfile中。 所谓打包逻辑就是你在本地开发时,利用IDE或命令将源代码编译成可执行文件的过程。打包自动化的过程,就是将你在本地执行的打包过程“搬”到自动化系统上执行,再加上一些优化。 在这个阶段中,我们需要实现: 统一制品库:收回所有人上传制品的账号。只能由Jenkins打包上传。 统一版本号:比如使用格式年-月-日-commitId-构建号来定义所有的后端应用。注意,不管使用哪种方式,你必须很容易的根据版本号找回相应的源码。 统一分支管理:使用主干开发,分支发布的模式。我们根据团队情况有稍微做了一些改变。发布并没有切分支出来,而在发布后发现某版本有Bug,我们就会从该版本的代码切一个分支出来改,打包,部署。最后再将该分支的commit cherry pick回master分支。 2. 实现基础监控 没有监控,在我们这个行业太常见了。所以,在我加入团队后,发现几乎没有任何监控,也就没有什么好惊讶的了。所以,在解决打包问题之后 ,紧接着就是给所有的机器加上监控。至少机器的CPU、硬盘、内存等要监控起来。 上一阶段,我们已经把Jenkins搭建起来,所以,Prometheus就开始自动化部署了。 使用Prometheus的原因很多,但是关键是它的配置是代码化的,非常容易版本化。持续交付的原则:将几乎所有的事情自动化、把所有的东西都纳入版本控制。像Zabbix,使用需要使用界面进行操作的,就被我排除了。 ...