这篇文章描述的系统,是由质量保障部宋伟达设计并实施。感谢伟达的支持!
整个系统以在tomcat部署web应用为例,部署其他可执行Java程序过程类似。
一、整体架构
上线系统的整体结构如下图
整体架构主要涉及5部分系统
1、Git
Git版本管理库用于存放上线系统的 CM工程(Configuration Management,配置管理工程,后续会详细介绍)以及需要部署的业务系统。
2、Jenkins
执行代码编译、打包、部署代码等任务
3、Nexus
Maven数据仓库,用于Jenkins下载依赖包以及存放编译代码生成的jar包(java)
4、Business Server
用于部署业务系统的服务器(含Tomcat等java容器)
5、Nginx
业务系统的负载均衡。部署重启业务系统时,需要先通过Nginx把该服务流量切走;重启成功后,再将流量切回来。
二、核心流程
下图是自动化上线系统核心流程
1、Jenkins拉取CM工程。
(1)系统上线人员在Jenkins中执行上线操作,将上线脚本script和上线系统配置信息configurations从Git中拉取到Jenkins的上线Job。
(2)Jenkins Job根据job_name(对应上线哪个业务系统)确定对应配置信息 configuration
(3)载入配置信息configuration
(4)执行部署脚本script中的Deploy.sh
2、预处理业务系统代码(由Deploy.sh文件描述处理流程)
(1)将业务系统代码克隆岛Jenkins所在服务器(集群模式为某个slave节点)。git clone -b
(2)执行Maven打包。maven package -P ……
(3)如果是正式发布版本,执行打tag。(建议 发验收环境也打tag,用来发部线上系统;线上环境也打tag用来回滚)
3、与Maven仓库交互
在第2步(上一步)执行过程中,会涉及到下载依赖jar包,或者上传上线工程中编译产生的jar包的操作。
4、同步部署代码(jar包)
(全量部署和增量部署的问题)
(1)将第2步中生成的jar包、war包等同步到应用部署服务器(Business Server),其中包含deploy_tomcat.sh项目实际部署脚本。
(2)(Jenkins Job所在服务器的deploy.sh脚本)通过ssh方式,连接到应用部署服务器(Business Server),执行deploy_tomcat.sh脚本,开始部署应用系统。
如果是集群,重复4、5、6步,直到部署完所有节点。也可以部署一部分节点,实现灰度上线。
5、本地部署
(1)找到tomcat的pid,执行shutdown.sh。(如果要优雅关闭,可在这个环节进行必要处理)
(2)将待部署的代码(war,jar)复制到tomcat对应目录。
(3)启动tomcat(应用系统)
(4)检查服务是否成功。(访问某个指定地址,返回200成功,否则失败)
(5)通知Jenkins Job部署结果(成功或失败),通过ssh方式返回,含日志(实时日志)
6、切换流量
如果需要,通过修改nginx配置,将执行部署的Business Server的访问流量切走。
三、重点模块
1、CM工程
CM(Configuration Management )工程是整个自动化上线系统的核心,主要包括两个部分。
(1)script
script是执行自动化上线功能的脚本,核心内容是通过maven打包需要部署的工程,然后执行部署操作。具体脚本为deploy.sh和deploy_tomcat.sh(以在tomcat部署web应用为例)
(2)configurations
configurations是需要自动化上线的业务系统的上线配置信息(有几个需要自动化上线的系统,就有几分对应的数据)。
具体内容包括项目个性化配置信息,以及差分配置规则等(根据实际项目可以有更多的配置信息。类似差分配置一般要求源代码按照一定的规则存放,所有项目可以统一处理)