Jenkins部署-概要设计

引言

编写目的

  • 本说明书目的在于明确说明Jenkins部署的实现方式,指导运维人员进行自动化部署。
  • 本说明书的预期读者为:系统运维人员、系统开发人员。

背景

  • 待开发软件系统的名称:XX安全生产共享平台Jenkins部署工程
  • 此软件系统任务提出者:智慧能源事业部徐州工程三部运维小组
  • 此软件系统任务开发者:智慧能源事业部徐州工程三部运维小组
  • 此软件系统任务用户:徐州工程三部运维小组成员、徐州工程三部开发小组成员
  1. 开发人员少且项目工期紧:开发人员时间、地点不固定,每天还要进行旧模块的修改和新功能的提交,每个开发人员的时间都很宝贵。
  2. 项目后期维护人员少但项目多:运维人员每天除了要处理现场工作,还要协助开发人员调试新功能,人员相对较少,但工作量大。
  3. 客户的需求一变再变:功能需求是在项目进展过程中持续变化的,在使用中会不断有新的需求出现,这是不可避免的,唯一确定的是需求是持续变化的。只能建立统一的文档,平时由运维人员收集修改建议,论证后再录入待办任务,由部门领导安排优先级,设置好交付时间,具体责任到开发人员进行修改。
  4. 传统的运维方式费时费力:每个人的开发水平参差不齐,开发人员对自己的代码比较了解,有时只需替换近期修改的文件即可,但大部分运维人员的开发水平相对较弱(甚至没有开发能力),只能全部进行文件的复制替换,不仅费时费力,而且容易出错,遇到网络和服务器的原因还容易导致更新失败。

基线

需求分析:

  1. 自动获取最新源码;
  2. 自动打包成全量包(full)和半增量包(semi);
  3. 自动部署到指定服务器;
  4. 自动进行测试;
  5. 能手动回滚到指定svn版本;
  6. 对js、css、图片、html文件进行压缩;
  7. js和css文件加hash值,cshtml引用这些文件时能自动更新这些文件的版本信息;
  8. 外网访问:在外网也可以使用pc或手机登录到Jenkins平台进行构建,手机上也可查看记录;
  9. 邮件通知:自动推送构建结果到指定开发人员。

特殊名词定义

  • 开发人员:提交代码的人员。
  • 运维人员:进行部署的人员。
  • Jenkins管理员:维护代码分发脚本的运维人员。
  • 全量包:源码编译后输出的所有文件。
  • 增量包:上一个svn版本与新svn版本之间有更改的文件(包括修改和新增)。
  • 半增量包:一段时间内有更改的文件(包括修改和新增)。
  • 持续集成部署服务器:部署Jenkins的服务器。
  • 中转服务器:更新包中转服务器,从持续集成部署服务器获取最新更新包并推送到客户服务器。
  • 客户服务器:待更新代码的服务器。

总体设计

概述

系统环境描述

系统包括的范围:Jenkins持续集成部署系统。

运行环境:

1.软件环境:

  • windows server 2008 r2 x64 或 windows server 2012 r2 x64
  • visual studio 2012
  • IIS 7
  • 要求能连接到外网的svn服务器
  • 要求能连接到外网提供frp内网穿透服务的服务器
  • 要求能连接到外网的腾讯企业邮箱服务器

2.硬件环境:

  • 超融合服务器,8G内存及以上,500G硬盘。

3.开发环境:

  • 服务器软件环境:
  • windows server 2008 r2 x64 或 windows server 2012 r2 x64
  • visual studio 2012
  • IIS 7
  • node.js 10及以上
  • ssh

  • 服务器硬件环境:
  • 超融合服务器,8G内存以上,500G硬盘。

  • 开发机器软件环境:
  • mac os x 10.12.6及以上、win7 、win10
  • IIS 7
  • visual studio 2012
  • node.js 10及以上
  • ssh

  • 开发机器硬件环境:
  • 8G内存及以上,500G硬盘。

系统总体结构设计

1.系统业务层次图

  • 内容描述:Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤:
  • (1)开发
  • (2)提交
  • (3)编译
  • (4)测试
  • (5)发布
  • 有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动化完成的,具体的,当你完成了提交,Jenkins会自动运行你的编译脚本,编译成功后,再运行你的测试脚本,这一步成功后,接着它会帮你把新程序发布出去,特别的,在最后一步,你可以选择手动发布,或自动发布,毕竟发布这件事情,还是需要人为的确认一下比较好。简而言之
Jenkins可以帮你在写完代码后,一键完成开发过程中的一系列工作。
  • 使用Jenkins的好处显而易见,它减少了你的重复劳动。更重要的是,一个团队的开发流程一开始是不一致的,不一致往往会带来各种各样的问题,最终体现在软件的质量或开发效率不够高,而Jenkins会帮你规范大家的行为,从而避免一系列的问题。
  • 下图是手动部署的方式图例:
  • https://i.loli.net/2020/01/07/cuVRUoY1vdZlrk3.jpg
  • 下图是自动部署的方式图例:
  • https://i.loli.net/2020/01/07/cN5CM4jvLI6lmOG.jpg
  • 而Jenkins搭建.NET自动编译测试并实现半增量部署的方案是基于Jenkins平台进行脚本配置的,以下简称semi-up方案。
  • **semi-up方案原理:**进行更新文件的筛选,找出最新文件,压缩并上传到服务器。
  • **优化后的流程:**开发人员本地提交源码-自动化服务器定期获取源码并编译-筛查出更新包-同步到其他服务器上进行文件替换。
  • 以持续集成部署服务器A为例,中转到B(B不是必须的),客户端C。A主机每天早上2点自动获取一次最新的代码,在本地编译完成以后生成一个月内待更新的文件压缩包,B主机通过网络共享方式获取压缩包并进行分发,C主机获取上游的压缩包并下载到本地进行解压,通过校验C主机本地版本号与A主机生成的最新版本号是否一致决定是否进行文件替换,若不一致则把所有web目录下指定的文件夹下面的文件替换为最新的文件。
  • 功能简介(类似需求分析):
  • 持续集成部署服务器:获取最新源码(默认获取最新,也可手动指定版本号),编译(msbuild命令行自动编译),sonarqube测试(代码检查),加md5戳(使用gulp命令生成js文件md5映射表,替换cshtml文件中的对应引用文本),压缩静态资源(压缩图片、js、css文件),打包(生成全量包和半增量包),发布(手动或自动发布),邮件通知(通过邮件模板生成邮件并发送给开发人员)。
  • 中转服务器:同步打包服务器的全量包和半增量包,分发到客户端服务器。
  • 客户端服务器:被动更新(打包服务器发送指令执行更新,可实现回滚操作),主动获取(客户端手动获取全量包并更新,解决半增量包更新失败的情况)。

2.系统架构说明

  • 说明整个系统的软硬件架构层次:
  • 架构大致分为三个部分:开发环境、产品服务器环境、持续集成部署环境
  • 开发环境配置项目部署文件。集成发布环境获取最新代码执行代码编辑及代码发布。产品服务器支持远程程序发布及备份。
  • 其中产品服务器需要安装:IIS .NET Framework Web Deploy等工具;集成发布服务器需要安装IIS .NET Framework Web Deploy IIS Source Code Client Java Jenkins等工具。开发环境需要安装Visual Studio.
  • 图例如下:
  • https://i.loli.net/2020/01/07/ycJrh5O23Sv7XdF.jpg
  • 发布流程图:
  • https://i.loli.net/2020/01/07/sKnRlZCVBA29qmY.jpg
  • 适用于发布Web站点,可支持发布失败后回滚,但回滚需要手动指定版本号。

3.关键技术

  • 最新文件筛选:通过使用xcopy命令的d参数,则可筛选出当前日期前2个月内有变化的文件。
  • 版本校验:客户端服务器web目录中也有版本信息,通过对比svn最新的版本信息,判断是否需要更新,若需要更新,则会执行更新脚本。
  • 轮询SCM:可定时检查svn服务器是否有最新源码,若有则会自动更新。
  • ssh远程执行:客户端服务器安装ssh服务,持续集成部署服务器若需要推送更新,则会使用ssh命令远程执行脚本。
  • 回滚:参数化构建,默认为空,若需要回滚,则手动执行工程并录入回滚版本号。

系统功能设计

持续集成部署服务器端

  1. 获取源码:最新或手动指定的版本号;
  2. 自动或手动触发:可定时执行;
  3. 清空缓存;
  4. 编译:输出到指定文件夹下;
  5. 筛选:根据文件修改日期,获取近期修改过的文件;
  6. hash值:使用gulp命令获取js文件的hash值,并写入cshtml文件。若cshtml文件是gb2312格式,需先使用iconv工具转换为utf-8格式;
  7. 压缩静态资源:压缩图片、js、css、html文件;
  8. 检查版本信息:检查各客户端服务器web目录的最新版本信息,判断是否需要更新;更新后再次判断是否更新成功;
  9. 推送:把升级包复制到中转服务器;
  10. 邮件通知:当前的构建信息、svn版本信息、要推送的客户端服务器名称、推送结果、构建过程文档添加到附件。

客户服务器端

  1. ssh-up脚本:下载semi更新包、清空缓存、解压、覆盖文件、上传最新版本信息。
  2. full包恢复:手动下载full更新包,全部覆盖。

尚待解决的问题

  1. 若部署时中断Jenkins工程,则会下一次重新获取源码,费时很长,而且会导致半增量包按日期筛选的条件失效。
  2. js文件压缩后,集团端平台的一些页面会无法打开(如调度ppt),原因未知。
  3. 目前测试只能人工测试。