网络平台软件如何定期更新?
如何快速上线?
自动化构建属于持续集成Continuous integration(CI)范畴,是产品开发的保障手段。当前网络公司流行的每周上线就是建立在自动化构建基础上。
开发过程如下:开发人员每天下班之前将代码上传配置库,构建程序凌晨执行日构建,并执行所有测试用例的回归测试,系统测试通过,则部署到指定服务器。翌日,测试人员编写测试用例,对新版本中变更的功能进行测试,将经过验证的测试用例上传配置库。每日重复操作。周五上线,需要将之前的冻结的代码(一般是提前2天冻结),构建程序,完成自动化回归测试,并部署和测试后。产品经理确认之后,发布上线。当然,实际发布的过程复杂很多,有些还要包括:红黑部署、灰度发布/金丝雀、滚动发布。
在进一步介绍原理之前,先简单介绍概念,概念清晰了,沟通起来就有统一的口径。
上线(ship):
从源码管理库中获取服务代码某个版本的快照,提供客户使用的过程。整个上线过程由四个不同的专门的小流程组成:构建(build)、测试、部署和发布。
部署(deploy):
在生产环境的基础设置中安装新版本程序的过程。
发布(release):
将之前提供服务的程序切换为部署的程序。
回滚(rollback):
将线上服务退回到某个已知状态的过
程,通常是重新发布最近的版本。
先进行软件测试:单元测试、系统测试、回归测试等。合格后进行配置、构建和部署三个技术环节,简单示意图如下。
图1:构建环境
配置管理(configuration)
基础知识
配置管理(SCM)管理软件的源代码,是团队合作开发的基础。Linux内核开发者Linus Torvalds,为提升团队合作的效率,在紧张工作之余开发了git,可见配置管理对于开发之重要。
源代码管理主要是管理代码变更,每次经过验证的代码变更都要上传到服务器,服务于其他人,只有大家都按照制定的进度进行,才能够保证团队合作的有效性。个人只能上传自己的代码。如果出现冲突的情况,要积极处理,确保不能影响到别人的代码。常用的操作有:add、commit、push、fetch和pull等。
代码变更只能是针对文本文件,任何的文本文件。二进制文件不适合放入配置管理,因为每个版本都需要传入全量,这点需要慎重考虑。文本文件被压缩后是不能管理的,但office新的文件是可以加入配置管理(文件名后缀带X的文档是XML格式)。
当前常用的代码托管(配置服务器)有GitHub、Gitee,各大云平台都有自己的配置服务器,如果购买云服务,能够同时得到配置服务。考虑各个平台的壁垒和避免被他们绑定,自己搭建配置服务器就非常有必要。GitLab是常用的配置服务器。
配置服务器一般都提供2种开发接口,一种是脚本命令,一种是API。由于Git已经是配置管理的实际标准,Git的命令行基本被所有平台支持,可以直接调用命令行脚本来读取需要的文件。被腾讯收购的coding,就是基于git内核开发的。另外一种是Restful API,可以Get出来配置库中的文件,需要学习的开发语音的API文档。
常用概念:
配置管理:configuration Management
配置:Configuration
配置项:Configuration item
工作空间管理:Workspace management
基线:Baseline
版本控制:Version control
变更控制:Change control
状态报告:status report
配置审计:configuration audit
配置控制委员会:Configuration Control Board,CCB
配置管理员:Configuration Management Officer,CMO
常用工具
互联网兴起之后,商业版本的配置管理工具渐渐式微,开源的配置管理工具不断出现,git出现以后,商业软件基本就退出了市场。
开源的配置服务平台中,github和gitee是两个主要玩家,但对于非商业用户,都有用户数限制,项目组中最多3个人。另外很多云平台集成了配置管理软件,这些平台集成了IDE、设计、测试等工具。
常见的开发中用到的工具都支持git,如google公司提供的Android的配置管理工具repo,就是用python封装的git,国内用的较多的coding,也是使用的git repo。
以下两幅图说明了git的基本操作和实际工作中的git流程。引用自“江召伟”:https://www.cnblogs.com/jiangzhaowei/p/7879916.html。
图2:Git基本操作
图三:Git工作流程
Git内核的学习,可以参考git-scm的介绍,不仅仅讲解了git的基本使用方法,也简单介绍了git的内部实现原理,参加Pro git https://git-scm.com/book/en/v2/Git-Internals-Git-Objects。也有中文介绍文章,Git 详解 https://blog.csdn.net/yeruby/article/details/38612355。
更多的内容请参考git在github上的源码。
开发建议
我们使用免费的版本开发,github和gitee都有用户数限制,最后选择了没有用户数限制的coding。需要了解coding的开发接口,考虑如何使用python来实现下载源代码。
在开发之前,我们需要了解coding的架构,以及coding使用的git的repository的机制,也可以参考google封装git而做的repo这个产品。
coding架构介绍参见 https://blog.coding.net/blog/coding-optimization
有2种开发方法。
1、通过git脚本命令来获取配置表中定义版本的模块。(需要在在配置表中明确开发主干和每个文件的版本号,来提取需要的版本的文件)。
2、通过API来获取相关数据。有些平台没有提供Restful接口,但只要提供了浏览器界面。对于程序员来说,这样就等于有了API,可以分析这些html文件的URL来获得API,这样就能够为我所用。开源的代码托管平台,非商业用户只有用户名和密码进行登录,不需要验证码。
构建(build)
基础知识
构建的目标把从配置库下载的源代码编译成可执行文件。在IDE开发中,开发环境会为我们构建程序,帮我们启动容器server(Tomcat),导致很多Windows环境下的程序员,如C#程序员,不知道构建为何物。
如果深入了解IDE环境,就会发现每种常用编译语言都带了命令行构建命令,如:Delphi的make, Visual C++的nmake等。IDE工具在Run/Debug之前也是调用这些命令来构建。
常用概念:
编译:把高级语言所书写的代码转换成机器可识别的指令,此时还不能够被执行,编译器通过检查高级语言的语法,函数和变量的声明是否正确!如果正确则产生中间目标文件。
链接:将多目标文件,或者目标文件和库文件链接成为可被操作系统执行的可执行程序
静态库:又称为文档文件(Archive File)。多个目标文件的集合。
共享库:也是多个目标文件的集合,但是这些目标文件时有编译器按照一种特殊的方式生成(共享库已经具备了可执行条件)。
在linux环境,常用make来构建可执行文件。一般经过3个步骤:
1、./configure 是用来检测你的安装平台的是否配置妥当。比如它会检测是否有指定版本的GCC,或者libz库是否已经安装,是个shell脚本。
2、make 是linux带的一个外部命令,从运行目录中的Makefile中读取指令,然后编译。
3、make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
这个是C++语言的标准编译过程,那么Java代码在Linux下如何编译?
首先,我们可以和C++语言一样,写一个makefile文件,调用Javac来编译,但随着使用的包的依赖不断复杂,构建过程越来越复杂,尤其是spring boot将Java的开发配置工作简化,但对于手工编译来说,就变麻烦了——找不到需要的包,分析spring boot做的工作,下载了哪些、哪种版本的包。所有的包都是从maven repository中下载的。这种方法最可靠,也是最快的,但会麻烦一点,需要一直跟踪和分析Spring Boot的变化。
其次,我们可以借助于maven工具来编译,这个当前的主流方法。在pom.xml目录下,执行以下3个步骤:
1、mvn compile 进行编译
2、mvn test 进行测试
3、mvn package 打包
这个是在任何操作系统上都可行的通用方法,主要是要在不同的OS上,部署Maven的编译环境。
Java代码编译之后,还需要给前端代码打包,方法与Java类似,也有2种方法,这里简单说明一下第2种方法。
需要改变的是,pom.xml改为package.json,通过npm来下载所有需要的插件,mvn改为webpack,执行后读取webpack.config.js文件内容进行打包。一般打包后的结果为index.html,bundle.js,style.css三个文件。
是否可以在Windows环境下完成编译和打包,部署到linux环境下来运行?还是一定要在linux环境下来编译和打包。由于采用Java、ES6和Python,我们完全可以在Windows下构建好,再部署到linux环境,考虑到整个过程中有些组件是放在linux环境下,所以会优先考虑在linux下去编译和打包。
为保证系统能够正常运行,构建还需要准备初始化的部分工作,将数据库的结构也构建出来。常用的方法是将开发数据库导出来,采用navicat的转储功能,将库的结构和数据都导出为SQL文件。
常用工具
当前常用的构建工具是Jenkins,前身是Hudson,在Hudson被收购后,主力开发人员离开,开发了开源软件Jenkins,比前者性能好。原来用户,很多迁移过来。
Jenkins是一个持续构建的平台,能够支持配置、构建、测试和部署的全过程。
Jenkins的构建原理与前面一致,有一本《Jenkins权威指南》的书,有详细的使用说明。从实际使用来看,如其在Jenkins中写脚本,不如用python写脚本,来得更直观。
开发建议
构建的输入是配置表,开发部分/业务部门根据用户的需求,建立配置表,其中包含各个配置项的版本号。构建之前要把配置表的信息保存数据库中。
根据配置表(所有模块默认最新版本)要求,从云端(coding)把源代码checkout出来。为方便开发人员处理,将版本信息放入到注释中,构建的时候从注释中找版本信息。没有采用传统的打标签的方式(tag)。
下载完成后要进行检查,文件目录以及该目录下的文件数量是否和配置库一致。还要考虑开发人员,可能把不需要的文件上传到配置库,要过滤掉二进制文件。(需检查是不是文本文件,不要下载已编译好的二进制文件)。
实际情况复杂,也可能搭建的时候需要将框架所需要的库和包都预先下载好,直接下载必要的源代码文件。
Jenkins作为一个持续构建的平台,提供了Restful API和Client的API来实现自动化操作。有一个《Python-Jenkins》文档,包含RESTful API和Example(Jenkins官网很慢)。
直接连接开发库的数据库,导出数据库,再导入本地搭建的数据库,并导入测试数据。
部署(deployment)
部署就是将编译和打包好的程序,部署到测试环境,供测试人员使用。需要把数据库的初始化部分加入进来。当前没有考虑分布式的问题,分布式的部署与单机部署差距很大,另外说明。
基础知识
部署就是将编译和打包好的程序,部署到运行环境,或者是供测试人员使用,或者是客户使用等。需要把数据库的初始化加入进来,并提供初始化的外部接口,以帮助被封原来数目库中的信息。
实际运行环境一般是linux。
linux
/etc 配置文件
/var/log 日志文件
/usr/bin 启动文件
/usr/libs 库文件
环境变量设置 系统级别的profile、或者个人目录下的.bashrc、/ect/ini.d 或者 /etc/rc.local。
windows
主要是:环境变量、注册表和安装目录
常用工具
部署本质上是对文件进行操作,在linux环境下,除通过Jenkins操作外,ssh登录后使用ftp工具复制文件是当前最常用的。Putty、pftp、pscp、XShell、SecureCRT等软件,MobaXterm作为一个安全开源的SSH工具获得大家的青睐。
开发建议
不用修改的模块使用ftp的脚本来上传,然后驱动前后台程序。或者用Python开发,直接将文件移动到对应目录。路径、配置文件和初始化需要编写程序,如修改profile文件,如果没有加入本应用,需要加入进来。在对linux系统的配置文件做修改的时候,要做好备份。万一出错,能够恢复系统正常使用。
作者已经使用python开发了一个独立的自动化构建小工具(未借助第三方产品),有兴趣可以通过测控视界联系作者。