专栏首页普通程序员JAVA自动化上线系统到底是怎么实现的?

JAVA自动化上线系统到底是怎么实现的?

这篇文章描述的系统,是由质量保障部宋伟达设计并实施。感谢伟达的支持!

整个系统以在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是需要自动化上线的业务系统的上线配置信息(有几个需要自动化上线的系统,就有几分对应的数据)。

具体内容包括项目个性化配置信息,以及差分配置规则等(根据实际项目可以有更多的配置信息。类似差分配置一般要求源代码按照一定的规则存放,所有项目可以统一处理)

本文分享自微信公众号 - 普通程序员(farmerbrag),作者:封宇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 警惕ThreadLocal和ThreadPoolExecutor同时使用

    项目中有一个水平分库读写数据的场景,采用了Spring支持的分库策略AbstractRoutingDataSource,数据源名称采用了ThreadLocal来...

    普通程序员
  • 怎么做开放API的签名认证

    项目中有一套restful接口需要暴露在公网环境中,需要确保调用安全。包括以下三个方面

    普通程序员
  • 任务都是”按时“完成——帕金森琐碎定律(Parkinson's Law of Triviality)

    帕金森琐碎定理(英语:Parkinson's Law of Triviality),又译为帕金森氏凡俗法则,或称芝麻蒜皮定律、芝麻绿豆定律。由英国历史学者与政治...

    普通程序员
  • 有了 Jenkins,为啥还需要一个独立的部署系统?

    DevOps时代
  • 使用now.sh部署前端项目

    now.sh是ZEIT推出的一款全球化实时部署服务。ZEIT现在已经改名为Vercel。 网站地址:vercel.com Vercel 是一个云平台静态站点和无...

    不作声
  • 如何在SAP CRM WebClient UI的弹出窗口里绘制附件(Attachment)控件

    you can see attachment UI everywhere in SAP CRM UI but most of them appear withi...

    Jerry Wang
  • 2018 年 Java,Web 和移动开发需要学习的 12 个框架

    IT派 - {技术青年圈} 持续关注互联网、区块链、人工智能领域 新的一年已经开始,不知道大家有没有定好小目标。如果2018年还没有决定学什么,那么你来对地...

    IT派
  • JavaWeb项目部署到Linux云服务器「视频教程」

    我们在本地开发了一个Javaweb项目,如何把这个项目部署到Linux云服务器上呢?本期的视频教程就是手把手教大家在云服务器上部署自己的Web项目,视频教程分为...

    用户1093975
  • winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式

    单线程操作在执行耗时任务时会造成界面假死,带来非常差劲的用户体验,有时候甚至会影响到正常的业务执行,使用多线程做相关操作实属不得已之举。

    FreeTimeWorker
  • spring-boot-route(二十)Spring Task实现简单定时任务

    Spring Task是Spring 3.0自带的定时任务,可以将它看作成一个轻量级的Quartz,功能虽然没有Quartz那样强大,但是使用起来非常简单,无需...

    Java旅途

扫码关注云+社区

领取腾讯云代金券