46.第38章 Devops之基于Jenkins的CI与CD
一.DevOps简介
DevOps 是Development 和Operations 的组合,也就是开发和运维的简写。
DevOps 是针对企业中的研发人员、运维人员和测试人员的工作理念,是他们在应用开发、代码部署和质量测试等整条生命周期中协作和沟通的最佳实践,DevOps 强调整个组织的合作以及交付和基础设施变更的自动化、从而实现持续集成、持续部署和持续交付。
DevOps 四大平台:代码托管(gitlab/svn)、项目管理(jira)、运维平台(腾讯蓝鲸/开源平台)、持续交付(Jenkins/gitlab)
1.1什么是DevOps
1.2 为什么要推广DevOps?
DevOps 强调团队协作、相互协助、持续发展,然而传统的模式是开发人员只顾开发程序,运维只负责基础环境管理和代码部署及监控等,其并不是为了一个共同的目标而共同实现最终的目的,而DevOps 则实现团队作战,即无论是开发、运维还是测试,都为了最终的代码发布、持续部署和业务稳定而付出各自的努力,从而实现产品设计、开发、测试和部署的良性循环,实现产品的最终持续交付。
1.3 DevOps 技术团队
1.4 什么是持续集成(CI-Continuous integration)
持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。
1.5 什么是持续部署(CD-continuous deployment)
是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代速率。
1.6 什么是持续交付(Continuous Delivery)
持续交付是在持续部署的基础之上,将产品交付到线上环境,因此持续交付是产品价值的一种交付,是产品价值的一种盈利的实现。
二.常见的代码部署方式
2.1 蓝绿部署
蓝绿部署指的是不停老版本代码(不影响上一个版本访问),而是在另外一套环境部署新版本然后进行测试,测试通过后将用户流量切到新版本,其特点为业务无中断,升级风险相对较小。
具体过程:
1.当前版本业务正常访问(V1)
2.在另外一套环境部署新代码(V2),代码可能是增加了功能或者是修复了某些bug
3.测试通过之后将用户请求流量切到新版本环境
4.观察一段时间,如有异常直接切换旧版本
5.下次升级,将旧版本升级到新版本(V3)
蓝绿部署适用的场景:
1.不停止老版本,额外部署一套新版本,等测试发现新版本OK后,删除老版本。
2.蓝绿发布是一种用于升级与更新的发布策略,部署的最小纬度是容器,而发布的最小纬度是应用。
3.蓝绿发布对于增量升级有比较好的支持,但是对于涉及数据表结构变更等等不可逆转的升级,并不完全合适用蓝绿发布来实现,需要结合一些业务的逻辑以及数据迁移与回滚的策略才可以完全满足需求。
2.2 金丝雀发布
金丝雀发布也叫灰度发布,是指在黑与白之间,能够平滑过度的一种发布方式,灰度发布是增量发布的一种类型,灰度发布是在原有版本可用的情况下,同时部署一个新版本应用作为“金丝雀”(小白鼠),测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。
“金丝雀”的由来:17世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;而当瓦斯含量超过一定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”,以便在危险状况下紧急撤离。
金丝雀发布、灰度发布步骤组成:
1.准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
2.从负载均衡列表中移除掉“金丝雀”服务器。
3.升级“金丝雀”应用(排掉原有流量并进行部署)。
4.对应用进行自动化测试。
5.将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
6.如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)
灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
灰度发布/金丝雀部署适用的场景:
1、不停止老版本,额外搞一套新版本,不同版本应用共存。
2、灰度发布中,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。
3、经常与A/B测试一起使用,用于测试选择多种方案。
2.3 滚动发布
滚动发布,一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。
2.4 A/B测试
A/B测试也是同时运行两个APP环境,但是蓝绿部署完全是两码事,A/B 测试是用来测试应用功能表现的方法,例如可用性、受欢迎程度、可见性等等,蓝绿部署的目的是安全稳定地发布新版本应用,并在必要时回滚,即蓝绿部署是一套正式环境环境在线,而A/B测试是两套正式环境在线。
然后基于评比结果,选出最终优胜的方案。
三.代码部署流程
开发把代码提交到gitlab,运维或开发用jenkins从gitlab clone代码,也可以是jenkins 通过ssh连到部署服务器clone代码,使用sonarqube对源码进行扫描,扫描完后没有问题,使用maven、ant等工具编译代码,编译好后生成jar包或war包,用scp、ansibel、SaltStack等工具分发编译好的jar包或war包,从haproxy或nginx等负载均衡器下线要分发的服务器,停止web服务,代码替换,启动web服务,测试web服务器url是否能正常访问,从haproxy或nginx等负载均衡器上线服务器。