一直在构建版本_自动化构建

网络平台软件如何定期更新?

如何快速上线?

dee0815424f012b4bca1393eb52b0646.png

自动化构建属于持续集成Continuous integration(CI)范畴,是产品开发的保障手段。当前网络公司流行的每周上线就是建立在自动化构建基础上。

开发过程如下:开发人员每天下班之前将代码上传配置库,构建程序凌晨执行日构建,并执行所有测试用例的回归测试,系统测试通过,则部署到指定服务器。翌日,测试人员编写测试用例,对新版本中变更的功能进行测试,将经过验证的测试用例上传配置库。每日重复操作。周五上线,需要将之前的冻结的代码(一般是提前2天冻结),构建程序,完成自动化回归测试,并部署和测试后。产品经理确认之后,发布上线。当然,实际发布的过程复杂很多,有些还要包括:红黑部署、灰度发布/金丝雀、滚动发布。

在进一步介绍原理之前,先简单介绍概念,概念清晰了,沟通起来就有统一的口径。

上线(ship)

从源码管理库中获取服务代码某个版本的快照,提供客户使用的过程。整个上线过程由四个不同的专门的小流程组成:构建(build)、测试、部署和发布。

部署(deploy)

在生产环境的基础设置中安装新版本程序的过程。

发布(release)

将之前提供服务的程序切换为部署的程序。

回滚(rollback)

将线上服务退回到某个已知状态的过

程,通常是重新发布最近的版本。

cfa18d68a74897a94bbb7dc1867b1577.png

先进行软件测试:单元测试、系统测试、回归测试等。合格后进行配置、构建和部署三个技术环节,简单示意图如下。

7d05f6f6d7185c4ebdf934fac36dd123.png

图1:构建环境

配置管理(configuration)

1e726e3ac51d45c386fa21629ec65275.png

基础知识

f2cbfd960a3d5740a5eb1e6f668f749a.png

配置管理(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

1e726e3ac51d45c386fa21629ec65275.png

常用工具

f2cbfd960a3d5740a5eb1e6f668f749a.png

互联网兴起之后,商业版本的配置管理工具渐渐式微,开源的配置管理工具不断出现,git出现以后,商业软件基本就退出了市场。

开源的配置服务平台中,github和gitee是两个主要玩家,但对于非商业用户,都有用户数限制,项目组中最多3个人。另外很多云平台集成了配置管理软件,这些平台集成了IDE、设计、测试等工具。

常见的开发中用到的工具都支持git,如google公司提供的Android的配置管理工具repo,就是用python封装的git,国内用的较多的coding,也是使用的git repo。

以下两幅图说明了git的基本操作和实际工作中的git流程。引用自“江召伟”:https://www.cnblogs.com/jiangzhaowei/p/7879916.html。

4c96ea58aed65803d1600b7ff4058d66.png

图2:Git基本操作

75149b688c30019509761035d2e84164.png

图三: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上的源码。

1e726e3ac51d45c386fa21629ec65275.png

开发建议

f2cbfd960a3d5740a5eb1e6f668f749a.png

我们使用免费的版本开发,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)

1e726e3ac51d45c386fa21629ec65275.png

基础知识

f2cbfd960a3d5740a5eb1e6f668f749a.png

构建的目标把从配置库下载的源代码编译成可执行文件。在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文件。

1e726e3ac51d45c386fa21629ec65275.png

常用工具

f2cbfd960a3d5740a5eb1e6f668f749a.png

当前常用的构建工具是Jenkins,前身是Hudson,在Hudson被收购后,主力开发人员离开,开发了开源软件Jenkins,比前者性能好。原来用户,很多迁移过来。

Jenkins是一个持续构建的平台,能够支持配置、构建、测试和部署的全过程。

Jenkins的构建原理与前面一致,有一本《Jenkins权威指南》的书,有详细的使用说明。从实际使用来看,如其在Jenkins中写脚本,不如用python写脚本,来得更直观。

1e726e3ac51d45c386fa21629ec65275.png

开发建议

f2cbfd960a3d5740a5eb1e6f668f749a.png

构建的输入是配置表,开发部分/业务部门根据用户的需求,建立配置表,其中包含各个配置项的版本号。构建之前要把配置表的信息保存数据库中。

根据配置表(所有模块默认最新版本)要求,从云端(coding)把源代码checkout出来。为方便开发人员处理,将版本信息放入到注释中,构建的时候从注释中找版本信息。没有采用传统的打标签的方式(tag)。

下载完成后要进行检查,文件目录以及该目录下的文件数量是否和配置库一致。还要考虑开发人员,可能把不需要的文件上传到配置库,要过滤掉二进制文件。(需检查是不是文本文件,不要下载已编译好的二进制文件)。

实际情况复杂,也可能搭建的时候需要将框架所需要的库和包都预先下载好,直接下载必要的源代码文件。

Jenkins作为一个持续构建的平台,提供了Restful API和Client的API来实现自动化操作。有一个《Python-Jenkins》文档,包含RESTful API和Example(Jenkins官网很慢)。

直接连接开发库的数据库,导出数据库,再导入本地搭建的数据库,并导入测试数据。

部署(deployment)

部署就是将编译和打包好的程序,部署到测试环境,供测试人员使用。需要把数据库的初始化部分加入进来。当前没有考虑分布式的问题,分布式的部署与单机部署差距很大,另外说明。

1e726e3ac51d45c386fa21629ec65275.png

基础知识

f2cbfd960a3d5740a5eb1e6f668f749a.png

部署就是将编译和打包好的程序,部署到运行环境,或者是供测试人员使用,或者是客户使用等。需要把数据库的初始化加入进来,并提供初始化的外部接口,以帮助被封原来数目库中的信息。

实际运行环境一般是linux。

linux

  /etc   配置文件

  /var/log  日志文件

  /usr/bin  启动文件

  /usr/libs  库文件

环境变量设置 系统级别的profile、或者个人目录下的.bashrc、/ect/ini.d 或者 /etc/rc.local。

windows

主要是:环境变量、注册表和安装目录

1e726e3ac51d45c386fa21629ec65275.png

常用工具

f2cbfd960a3d5740a5eb1e6f668f749a.png

部署本质上是对文件进行操作,在linux环境下,除通过Jenkins操作外,ssh登录后使用ftp工具复制文件是当前最常用的。Putty、pftp、pscp、XShell、SecureCRT等软件,MobaXterm作为一个安全开源的SSH工具获得大家的青睐。

1e726e3ac51d45c386fa21629ec65275.png

开发建议

f2cbfd960a3d5740a5eb1e6f668f749a.png

不用修改的模块使用ftp的脚本来上传,然后驱动前后台程序。或者用Python开发,直接将文件移动到对应目录。路径、配置文件和初始化需要编写程序,如修改profile文件,如果没有加入本应用,需要加入进来。在对linux系统的配置文件做修改的时候,要做好备份。万一出错,能够恢复系统正常使用。

作者已经使用python开发了一个独立的自动化构建小工具(未借助第三方产品),有兴趣可以通过测控视界联系作者。

1f419b09038612cfed193c247a15c140.gif

b2ba353fcd0ec184e9937160f73503ac.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值