每日编译的入门实践<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
(作者:Jackey,网址:www.kuihua.net)
1 引言:
有关每日编译(Daily-Build、Night-Build)的讨论在网上已经很多,但大多都是停留在形式上或纯粹是一种谈资,很少看到一些真正有用的、可操作的东西。不过,网上倒是有很多开源的每日编译系统,ANT、NANT等,感觉都是针对.net或java开发的,对常规的应用程序开发好像有点不是太适合,而且系统过于庞大,需要很多外围软件的支持。
鉴于此,本人利用BAT和Perl脚本实现了一个入门级的每日编译系统。
2 本文需要建立的工作环境:
2.1 系统运行环境:
l 开发环境:Visual C++ 6.0
l 打包环境:Install Shield 6.1
l 脚本环境:Active Perl 5.6.1
l 操作系统:Win2000/WinXP
l CVS环境:WinCVS(1.3.13.1)、CVSNT(2.0.4)
l CVS设置::pserver:jackey@server:D:/KHBuild
l CVS2CL:变更日志工具,是个Perl脚本,下载地址:http://www.red-bean.com/cvs2cl
l 环境变量:需要为Install Shield手工建立Path系统变量,其它工具会在安装时自动添加。
2.2 目录环境与例子工程设置:
l 测试工程在cvs中目录结构:
\TestProject\Source // 测试工程源代码目录
\TestProject\Install// 测试工程安装代码目录
l 每日编译目录环境设置:
D:\CVSBuild // 临时编译目录
D:\DailyBuild // 每日编译目录
\Product // 所有产品目录
\TestProject // 测试产品目录
\2004-9-1 // 2004.9.1的产品
\2004-9-2 // 2004.9.2的产品
\2004-9-3 // 2004.9.3的产品
\BuildLog // 所有产品的日志
\TestProject // 测试产品的日志
\ChangeLog.txt // 测试产品的代码变更日志
\2004-9-1 // 2004.9.1的编译日志
\2004-9-2 // 2004.9.2的编译日志
\2004-9-3 // 2004.9.3的编译日志
\sys.log// 系统日志
\cvs.log // cvs代码下载日志
\vc6.log // vc6代码编译日志
\install.log // 打包程序编译日志
\Script
\cvs2cl.pl // 产生ChangeLog的Perl脚本
\FilePath.pl // 修改Install Shield的绝对路径的Perl脚本
\LoadTest.bat// 用于Windows自动任务调用的批处理
\BuildTest.bat// 被LoadTest.bat调用的实际自动编译脚本
3 BuildTest.bat的实现思路:
l 参数说明:
1. 指定编译中间过程存放的盘符。 (如:D: )
2. 指定每日编译存放的盘符,可以是网络盘。 (如:E: )
3. 指定cvs所需要的代码仓库信息。
l 具体实现步骤:
1. 判断输入参数的合法性;
2. 得到当前日期,通常的格式为:2004-9-5
3. 设置环境变量,方便进一步的操作;
4. 进入脚本所在目录;
5. 删除当天编译过的目录,保证只留一份当天的产品;
6. 创建当天产品的存放目录;
7. 将当前的系统环境状态写入sys.log日志文件中;
8. 从cvsnt中下载TestProjet的源代码和安装代码;
9. 使用cvs2cl.pl为下载后的代码产生代码变更日志(ChangeLog.txt)
10. 使用FilePath.pl修改安装代码里的绝对路径;
11. 使用msdev.exe编译TestProject工程;
12. 使用isbuild.exe编译TestProject的安装代码;
13. 将编译后的安装程序拷贝到指定的每日编译目录;
14. 删除一些不需要的临时目录;
15. 编译结束。
l 为了实现每日编译的自动化,需要建立一个Windows系统任务,让它在每天午夜的时候自动调用LoadTest.bat,实现真正意义上的Daily-Build或Night-Build。
4 仅供参考的实现脚本:
4.1 LoadTest.bat实现参考:
BuildTest.bat D: D: jackey@server:D:/KHBuild
4.2 BuildTest.bat实现参考:
@echo off
REM ------- Check the input Param is validate! --------
if "%1"=="" goto :Usage
if "%2"=="" goto :Usage
if "%3"=="" goto :Usage
echo Starting daily-build for TestProject product...
date /t > date.inf
for /F "tokens=1* delims=, " %%I in (date.inf) do set DATE=%%I
del date.inf
set PROJECT=TestProject
set BUILD_PATH=%1\CVSBuild
set SCRIPT_PATH=%2\DailyBuild\Script
set PRODUCT_PATH=%2\DailyBuild\Product\TestProject\%DATE%
set LOG_PATH=%2\DailyBuild\BuildLog\TestProject\%DATE%
set CVSROOT=-d:pserver:%3
set CODE_PATH=%BUILD_PATH%\TestProject
set SYS_LOG=%LOG_PATH%\sys.log
set CVS_LOG=%LOG_PATH%\cvs.log
set VC6_LOG=%LOG_PATH%\vc6.log
set INSTALL_LOG=%LOG_PATH%\install.log
set CHANGE_LOG=%2\DailyBuild\BuildLog\TestProject\ChangeLog.txt
cd /d %SCRIPT_PATH%
rd /s /q %PRODUCT_PATH%
rd /s /q %LOG_PATH%
md %BUILD_PATH%
md %PRODUCT_PATH%
md %LOG_PATH%
time /t >> %SYS_LOG%
date /t >> %SYS_LOG%
echo 工程名称 = %PROJECT% >> %SYS_LOG%
echo 产品路径 = %PRODUCT_PATH%>> %SYS_LOG%
echo 编译路径 = %BUILD_PATH%>> %SYS_LOG%
echo 代码路径 = %CODE_PATH% >> %SYS_LOG%
echo 日志路径 = %LOG_PATH% >> %SYS_LOG%
echo CVS参数 = %CVSROOT% >> %SYS_LOG%
echo CVS日志 = %CVS_LOG% >> %SYS_LOG%
echo VC6日志 = %VC6_LOG% >> %SYS_LOG%
echo 系统日志 = %SYS_LOG% >> %SYS_LOG%
echo 安装日志 = %INSTALL_LOG% >> %SYS_LOG%
echo 更新日志 = %CHANGE_LOG% >> %SYS_LOG%
echo [...Checkout Source Code...] >> %CVS_LOG%
cvs %CVSROOT% checkout -d %BUILD_PATH%\Source TestProject\Source >> %CVS_LOG%
echo [...Checkout Install Code...]>> %CVS_LOG%
cvs %CVSROOT% checkout -d %BUILD_PATH%\Install TestProject\Install >> %CVS_LOG%
echo [...Building ChangeLog for this version...]
cd /d %CODE_PATH%
%SCRIPT_PATH%\cvs2cl.pl --hide-filenames -P -f ChangeLog.txt
copy /Y ChangeLog.txt %CHANGE_LOG%
del ChangeLog.txt
cd /d %SCRIPT_PATH%
echo [...Building TestProject...]
msdev %CODE_PATH%\Source\TestProject.dsw /MAKE "TestProject - Win32 Release" /REBUILD >> %VC6_LOG%
echo [...Building Installshield code...]
FilePath.pl %PROJECT% %CODE_PATH% %CODE_PATH%\Install\ >> %INSTALL_LOG%
isbuild -m"Default" -p"%CODE_PATH%\Install\TestProject.ipr" -b"%BUILD_PATH%\Test" -r >> %INSTALL_LOG%
echo [Copy Install files to daily-build Repository...]
xcopy /Y %BUILD_PATH%\Test\DiskIm~1\Disk1\*.* %PRODUCT_PATH%
echo [Now, delete the temporary build-path...]
rd /s /q %BUILD_PATH%
goto :EOF
REM ------- Print the usage for this .bat file --------
:Usage
echo ---------------------------------------------------------------------------------------------
echo +
echo + %0 [Temp disk volume] [Dest disk volume] [user@server:path]
echo +
echo + [ Example ] : %0 D: E: administrator@localhost:D:/KHBuild
echo + [Temp disk volume] : 指定编译中间过程存放的盘符。 (如:D: )
echo + [Desk disk volume] : 指定每日编译存放的盘符,可以是网络盘。(如:E: )
echo + [user@server:path] : 指定cvs所需要的代码仓库信息。
echo +
echo ---------------------------------------------------------------------------------------------
:EOF
4.3 FilePath.pl实现参考:
#!/user/bin/perl -w
my $search = "=.*$ARGV[0]"; # Search value
my $replace = "=$ARGV[1]"; # Replace value
my $dirname = "$ARGV[2]File Groups"; # Search directory
print "\r\n";
print "Search is \"$search\"\r\n";
print "Replace is \"$replace\"\r\n";
print "Directory is \"$dirname\"\r\n";
print "\r\n";
opendir DIR, $dirname or die "Cannot open $dirname: $!"; # Open directory
foreach my $filename (readdir DIR)# Enumerate directory file
{
next if $filename =~ /^\./; # Skip . and ..
next if $filename =~ /CVS/;
next if $filename =~ /\.fdf/;
$filename = "$dirname\\$filename"; # Append directory path
open(INFILE, "$filename") || die "cannot open $filename: $!";
open(OUTFILE, ">$filename"."_bak") || die "$!";# Open and create file
print "[ Processing file is \"$filename\"... ]\r\n\r\n";
while( <INFILE> )# Enumerate all lines
{
s/$search/$replace/g;# Search and replace in global
print $_;# Print the replace result
print OUTFILE $_; # Save in new file
}
close INFILE; # Close in_file
close OUTFILE; # Close out_file
rename $filename . "_bak", $filename; # Rename out_file to in_file
}
closedir DIR; # Close the directory
5 每日编译的应用探讨:
5.1 建立核心链条思想:
源代码管理工具 => Bug追踪工具 => 每日编译工具
WinCVS/CVSNT => Bugzilla => BAT和Perl脚本
5.2 如何运用这些工具:
l 必须建立源代码的版本控制系统,就是cvs,基本的代码提交原则:
1. 程序员尽量每天只在下班前提交一次;
2. 提交的代码必须是在自己的机器上是正常运行的;
3. 每次提交都必须用简短的话说明自己提交代码的功能描述。
l 建立错误追踪系统,用Bugzilla就很好,配置好邮件系统,使Bugzilla成为测试人员与开发人员沟通的桥梁。
l 用BAT和Perl脚本,以cvs中的源代码为核心实现简单的每日编译工具,将这个自己写的自动化工具放到一台专门的编译机器上,在每天的半夜开始自动下载代码,自动编译代码,自动打包安装程序,自动记录各种编译日志,自动将安装程序放置到一个固定的以日期为目录名的公共区。(用cvs2cl.pl得到程序员上传的代码更新日志,以便测试人员参考)
l 测试人员的第二天,应该到公共区取得头天的最新版本,并根据ChangeLog进行新版本的测试。并将测试中发现的Bug,通过Bugzilla反馈给程序员。程序员可以根据自己的情况,或公司的规定来决定修改这些Bug的时间。并将这些Bug的修改情况,在代码提交时,写入代码日志。
l 开发人员的第二天,应该到公共区查看编译日志,看看自己的模块是否正常编译,及时更正,看看自己的邮箱有没有Bug报告,及时修改。
l 管理人员的第二天,在综合项目需求与头天版本进度的基础上,可以判断产品的发展方向,如果有偏航或理解错误或有新需求时,可以根据当前情况及时调整。
l 这样,通过 cvs => bugzilla => daily-build,就能将程序员与测试员,进行互动,各施其责。减少沟通与人为的麻烦。对于管理层,也能做到心中有数:因为每天都有新版本,随时掌握产品的走向。。。等等。
5.3 本人写的相关工具的文档:
l WinCVS/CVSNT的简明手则:
http://blog.csdn.net/ycw/archive/2003/12/29/4183.aspx
http://blog.csdn.net/ycw/archive/2003/07/18/4184.aspx
http://blog.csdn.net/ycw/archive/2003/07/18/4185.aspx
http://blog.csdn.net/ycw/archive/2003/07/18/4186.aspx
l Bugzilla的安装实录:
http://blog.csdn.net/ycw/archive/2004/02/07/4187.aspx
http://blog.csdn.net/ycw/archive/2004/02/07/4188.aspx
http://blog.csdn.net/ycw/archive/2004/02/07/4189.aspx
http://blog.csdn.net/ycw/archive/2004/09/05/95076.aspx
相关推荐
SCM(Spatial Channel Model,空间信道模型)是通信系统中用于模拟多径传播和空间多工(MIMO,Multiple-Input Multiple-Output)技术的一种重要工具。在无线通信领域,尤其是在3GPP(Third Generation Partnership ...
python源码安装包setuptools_scm-3.3.3.tar, 解压后python setup.py install 进行安装.
SCM550 SAP SCM SCM550 SAP SCM SCM550 SAP SCM
构建自动化也是SCM的重要部分,它涉及到编译、测试和打包等流程的自动化。在SCM演示程序中,用户可以学习如何设置和触发自动构建,以及在构建失败时如何排查问题。 此外,SCM促进团队协作。例如,代码审查是SCM的一...
- **bin** 目录可能包含编译好的可执行程序,即HM编码器和解码器的二进制文件。 - **cfg** 目录可能包含各种配置文件,用户可以调整这些文件以改变编码参数,如比特率、分辨率和编码质量。 - **doc** 目录可能包含...
9. **最佳实践**:文档可能还会包含一些SCM的最佳实践,比如定期拉取最新代码、保持分支同步、合理命名分支等,以提升团队的工作效率。 "传智播客SCM手把手开发文档.doc"这个文件,作为一份完整的教学资料,会详尽...
SCM(Software Configuration Management,软件配置管理)是IT行业中一项至关重要的实践,它涉及软件开发过程中对变更的控制和管理,以确保项目的一致性、可追溯性和版本控制。配置管理的目标是通过有序的方式来管理...
它们通常是由特定的编程语言编写,比如Lisp或C,然后被编译成二进制格式,以便于快速执行。在游戏开发中,SCM文件常用于游戏的剧本、音乐或音效管理,因为它允许开发者灵活地控制游戏中的音频和视觉效果。 为了播放...
本项目名为“小型编译器”,是针对编译原理课程设计的一个实践任务,旨在让学生深入理解编译器的工作原理和实现过程。 一、编译器的基本概念与工作流程 1.1 编译器的定义:编译器是一种特殊的程序,它接收用高级...
在Linux世界中,掌握内核源码编译是一项高级技能,尤其对于系统管理员和开发者而言。下面将详细讲解Linux内核源码编译的过程、...然而,这也需要一定的专业知识和实践经验。希望以上信息能帮助你顺利进行内核编译工作。
SCM600 Sales and Distribution Processes 2006 Q2 SCM605 Sales SCM610 Delivery Processes 2006 Q2 SCM615 Billing SCM620 Pricing in Sales Order Management 2006 Q2 ">我是新手SD 网上找资料比较痛苦 积分见...
在Android开发领域,掌握源码下载和编译过程是至关重要的技能,特别是在研究系统底层机制或者定制个性化系统时。本文将详细介绍如何下载Android 4.2的源码...在实践中不断学习和探索,你将成为Android系统开发的专家。
scm视频文件的解码器,安装后用Rplayer播放
3. **开发环境**:熟悉IDE(集成开发环境),如Keil、IAR等,以及如何使用它们进行代码编写、编译、调试。 4. **电路设计**:学习基本电路知识,如电源电路、复位电路、时钟电路等,以及如何连接外部元器件,如LED...
SCM Manager 是一款同时支持Git、Subversion、Mercurial的源代码管理服务器,基于Java构建。 中文版由木鱼制作,除了进行全面的中文化以外,还提供了配置脚本、预置了插件并进行了插件的中文化,以及安装说明。 SCM...
SCM(Software Configuration Management,软件配置管理)是IT行业中一种重要的实践,用于管理和跟踪软件项目的变更。在"SCM.rar_scm_visual c"这个压缩包中,我们可以看到它与使用Visual C++进行SCM管理有关。这个...
### SCM630_Warehouse Management – SAP MM 课程解析 #### 一、课程概述 **SCM630_Warehouse Management** 是一个专注于仓库管理的专业培训课程,属于 **mySAP Supply Chain Management (SCM)** 的一部分。此课程...
scm-play scm文件的播放器!可播放scm文件的!
SCM(供应链管理)供应链系统仿真原型是一种模拟实际供应链流程的工具,用于理解...总的来说,SCM供应链系统仿真原型是理解和优化供应链管理的有效手段,它结合了理论与实践,为教育、研究和企业应用提供了宝贵的平台。