技术开发 频道

配置管理每日构建(一)

【IT168 技术文章】

    1. 引言

    1.1. 名词解释

    先了解一些名词,有的是我自创的:

    Nightly Build

    字面直译为:每晚编译。实现了自动编译,摆脱了编译的手工劳动; 对于大型系统,编译耗时,在晚间完成则节约了工作成本; 实现版本号的自动管理(Build号,每次编译自增);

    milestone 版本

    里程碑版本。在编译时,使用里程碑的代码。例如定义为 RELEASE 的里程碑,可以在每次重新将代码提升为 RELEASE 时,删除上一次建立的 RELEASE 的LABEL/TAG,再重新为新代码打上 LABEL/TAG。但更好的方法是将稳定的 LABEL 记录在一个文件(如:PROMOTION)中,这个文件的最新内容即为里程碑代码的标签(TAG/LABEL),删除 LABEL/TAG 的危险动作换成了新建 LABEL/TAG 和 Checkin 文件。

    sticky 版本

    固定版本。有时想要编译某一固定状态(指定的LABEL/TAG)代码,可将这个 LABEL/TAG 传给编译系统,进行编译,这种编译方式称为 sticky 版本的编译。

    nightly 版本

    使用最新的代码进行编译。如果代码自上次编译以来没有更改,则无需编译。

    版本号

    版本号的格式为:a.b.c.d。其中 a - 主版本号(Major version), b - 副版本号(Minor version), c - 发布号(Release), d - 编译号(build)。主版本号和副版本号在项目计划中便已经指定,标志着重要的功能变动。Release版本号 c,用于体现小的功能变更或用来管理项目的分支。build号则在每次编译时自动加1。

    PROMOTION

    版本提升。某一里程碑(LABEL/TAG标记)代码,随着开发周期的继续,如果能够顺利通过各级测试,并最终发布。则其对应的产品必然经历 daily build版本、alpha测试版本、beta测试版本、release版本。
Starteam 版本控制系统,有专门的 LABEL 管理这种事件,叫做 PROMOTION。对于其它版本控制系统,我们可以很容易的使用文件记录LABEL的方式相对应。

    Starteam 的 PROMOTION 请参见我的一篇文章《Starteam Howto》。

    版本控制系统

    版本控制系统,如:CVS、STARTEAM、PVCS、VSS等,是自动编译系统的基础。熟练掌握其名利行工具的使用是关键。推荐使用CVS作为版本控制系统,因为其命令行功能最强大。

    1.2. 建立系统的命令行编译过程

    如果没有命令行的编译过程,想要构建自动化的编译系统,简直是天方夜谭。
    对于 UNIX 的系统,支持命令行编译自然不再话下。简单至一个 Makefile,到复杂的 SHELL 脚本、automake+autoconf 系统。
    对于 Windows 上的项目,比如说 VC,其实也有命令行支持。从 VC5.0的 NMAKE 到 VC6.0 的 MSDEV 命令。但是 Windows 平台的 shell 实在功能有限。查一下 Windows 的关于 batchfile 的帮助吧,只有可怜的半页,DOS时代的古董。我们需要使用扩充的命令行工具来扩展。可以的选择有 JAVA、PERL、PYTHON、CYGWIN。我选择了 Cygwin ,是因为我只会 Unix bash。 8-)

    1.3. 关于版本号自增

    实现 BUILD 号自增,其实只要将版本号写入文件,并版本控制。每次编译成功后,版本号+1,再重新 Checkin 即可。
    对于只需要一个版本号的系统,非常简单。对于复杂的系统,比如说一个 Windows 平台的程序,可能每一个 dll, exe 都需要不同的版本。也可以把这些相关信息写入一个文件,每次编译更新完毕代码后,在将一个文件控制的众多版本信息分别写到其它独立的版本控制文件中(如 VC中的 *.rc 文件中的 FileVersion, ProductVersion 等)。

    版本号的格式,参见:版本号说明。

    1.4. 关于代码更新检查

    如果代码没有更改,自动编译系统还要去编译,去使版本号递增,实在太傻,浪费时间,也会使开发、测试陷入混乱。
    可以将上一次编译的时间记录在一个文件中,再次编译时,先比较自从上次编译以来,到现在为止是否有代码改动,如果有代码改动则版本号自增,并触发编译系统。这看起来有点不可思议,其实一个命令就够了:
    $ cvs -q diff --brief -D "上一次编译日期"


    1.5. 关于软件包签名和下载

    认为编译完成就完事大吉,是错误的。如果不进行进一步的处理,下次编译将会冲掉上次编译的结果。因此需要把生成的软件包,按照规则重新命名,例如加上版本号和编译日期。如果软件包不便于访问,也不利于工作的开展。在编译/发布机提供 FTP 服务是最理想的。还要说说软件签名。不但是为了防止黑客的恶意篡改,也是协助下载用户对软件包进行完整性检查的方法。参见我的一篇文档:《PGP/GPG HOWTO》。

    1.6. 软件开发周期和版本号演进示意图(图略)
 

0
相关文章