Windows下客户端软件的自动化构建

这是自己06年写的东西,在翻看以前邮件的时候看到了。

 

目的:提高开发效率,减少软件的打包过程中因为人为因素引起的错误。

一个项目大了以后,每次需要重新编译,打包,都会变得非常复杂而且重复,而在这工程中也容易发生错误,这就需要一种方式来批量的自动化完成这个工程。在java中有ant这种工具可以完成这一系列工作,而在C++的客户端开发中,还没有相应的工具来完成,但是因为有makefile文件,所以可以通过编写批处理文件,调用版本控制系统中的相应命令来实现这个过程。

为了实现这种自动化构建方式,需要的条件是:

1.首先要有一个版本控制系统(VSS),并且在VSS上创建一个只有读权限的用户。

2.每个工程要有对应得makefile文件,这个在VC中可以直接导出makefile文件。

3.每次在提交测试,打包前,要给提交到VSS上的代码打上标签(可以是当前构建的版本号),标签的好处在于,当测试发现问题后,可以很容易的回滚到上一版本。

4.最后就是根据这些条件按照打包的要求生成一个批处理文件,从而实现一定程度上的软件自动化构建。

一个批处理的文件中的基本步骤是:

l  把本机的VSS的路径设置到path环境变量中。

l  设置相应的VSS路径,源码目录和打包目录。

l  从版本控制系统中(VSS)中取得对应标签的代码。

l  在源码目录,根据makefile文件编译生成可执行文件。

       把可执行文件和相应的其他文件和目录拷贝到打包目录下,并邮件通知相关人员(测试、产品经理等)。

也谈自动化构建及部署

之所以谈到这个问题,源于跟公司QA同事谈到了项目管理中流程管理,流程管理里面很重要的一个环节就是实现测试部署的自动化,提高产品的整体研发效率。下面就简单谈谈我自己的经历过和理解的自动化构建及部署。

04年在一家台湾公司的时候,第一次接触了自动化构建,当时公司做的是客户端软件,使用的版本控制工具是VSS,开发工具是VC6,之所以会提出软件的自动化构建,是基于测试部提出,由于原来的测试包都是由开发人员在自己机器上编译后再提交给测试,但是经常会出现的问题是,测试人员发现开发人员提交的测试包根本无法测试,然后查到的原因,往往是因为开发人员自己的机器环境跟测试机环境不一样导致,比如开发人员本机安装了某个类库,他使用的某个方法恰恰又依赖这个库,但是他自己又 不知道,或者忘了把这个库也打包进去,所以才出现了测试人员无法测试的情况。为了改善这种状况,当时提出了写一个批处理,实现自动化构建,当时自己承担了这个任务,当时实现的只是一个简单的自动构建,基本原理是,在一台build机器上首先按照lable,从vss库checkout代码,然后运行nmake命令编译代码,这里面需要利用vc6生成mak文件并上传到vss,如果编译成功,则把编译生成的包拷贝到指定的测试机的目录,目录名按照产品名+日期来命名。如果编译错误,则需要上build机器查看输出的错误。这部分都写成了一个批处理,批处理接受参数,参数由要构建的产品名(vss上的名一致),要构建产品的lable,每次完成一个测试版本开发后,开发人员把该上传的都上传到vss,并打上lable,然后邮件通知测试人员,邮件内容主要是测试的产品名称和lable,测试人员根据邮件,运行build机器上的批处理程序,然后根据测试机器上是否正确生成了测试包来判断本次构建是否成功,如果没成功通知相应开发人员进行检查,下面是该批处理的部分代码

这个自动化构建还需要完善的是增加一个构建结果的邮件通知机制。

其后05年进入了一家互联网公司,在这里有幸接触了互联网应用的自动化部署,其中当时自己负责的一个会员管理后台,采用的是.net开发,vss进行版本控制,部署在IIS上,同时公司另外一个业务是java开发,cvs进行版本控制,部署到apache,这部分我虽然不负责,但是也接触到了相关脚本的构建。这里面的基本部署原来,也是跟之前的类似,稍有不同的是,这里面的自动化脚本可以分别生成内网测试包和外网测试包,分别用于进行内网测试验证和外网测试验证,同样这部分也是由测试人员控制,开发人员在完成一个测试版本开发后,邮件通知测试人员即可。

这里写这么多关于自动构建和部署,要说明的一点就是,我们要提高效率,改善流程,很大程度就是把人做的工作交给机器来做,人可能会因为各种原因犯错误,比如今天心情不好了,或者今天心情太好了,多可能会使自己在部署过程中产生错误,而如果是由脚本来完成,如果脚本本身没有问题,那这种犯错误的几率接近于零。曾经看过一篇文章,讲到了twitter全球几千台机器的部署只需要短短几分钟就能完成,都是有赖于他们的自动化部署,这里面需要我们参考的就是如何改进和提高这种自动化部署,使其也能在最短时间内完成部署并且实现零错误。自动化构建或者部署,因采用的开发语言不通,版本控制软件不同会略有区别,比如java本身就带有ant,而linux下的c或者c++服务程序则可以通过cmake,而所有的版本控制无论vss、cvs、svn、git都有命令行方式,因此自动化部署的基本原理类似,只需要我们之前多花点时间把这个部署脚本构建好,那就是一劳永逸的。