http://einy.bokee.com/4106138.html
CVS+VS2003+SetupFactory建设每日构建(Daily build)
Daily build创始者据说是微软,但是对于项目管理的确很管用,尤其对大型项目来说更是能提高效率;我是在上一个外企公司接触到Daily build得,由于之前在一家国内小公司做软件开发,什么都不是很规范;当到了外企公司接触到他们对产品管理得流程,不得不留神学着点,关于Daily build一直是在纸上谈兵,从来没有实践过。
前一段时间换了个公司,到国内一个新成立得公司,工作了一段时间后,发现公司根本就不规范,更别说Daily build了,本人抽空和他们聊天(实际上是建议)说我们得规范一点,当产品进入测试期,得做Daily build,他们觉得没有必要,甚至说给QA release产品不用专业打包工具,直接给个压缩包(*.zip,*.rar)就可以了;别人不愿意干了,我自己来,我抽空做了一个Dailybuild。无奈公司犯了国内软件公司得通病,不重视QA,我做出来得Daily build即使一天可以出10个版本,QA不提取,也等于0;现将daily build部分总结,和大家分享。
Daily build职能
- 实现自动从版本控制器(CVS/VSS)中提取最新代码;
- 实现自动编译,摆脱编译的手工劳动,提高了效率
- 大系统编译耗时,利用晚上的时间完成(设置schedule),节省时间和节约资源,并且减少工作成本
- 在不断地进行构建、测试中,发现错误及时纠正,保证了每日构建的质量
- 促进软件协作开发的合理策划和分工,提高开发的自觉性和效率,保证进度
- 围绕每日构建必须制定相应的团队规则,有助于建立高效、优秀的团队
- 缩短跟踪 bug 周期,提高效率
- 保证编译版本与源代码的一致,达到软件版本与源代码的真正受控
Daily build需要的资源
版本控制器:CVS ,VSS等(本文以CVS为例)
版本控制器服务器:这是一个文件服务器,存放源代码,在我们这里是VSS/CVS库。开发人员依据一定的团队规则围绕此服务器开展每天的开发工作;Daily build将从这里提取所用的全部源代码;
编译器:VS,C++BUILDER等等;
打包软件:installsheild,setupfactory,installanywhere等等
构建服务器(Build Server):这是Daily Build主机,实现软件产品的自动提取,自动编译、构造过程。这个服务器上需要安装编译器,版本控制器客户端,打包软件;
发布服务器(Release Server):存放软件产品的每次构建版本,测试人员由此提取最新版本进行测试,配置人员再从中提取经过测试的RC版本准备发行。此服务器一般和构建服务器为同一服务器;
Daily build 实现步骤
- 从版本控制器服务器(CVS Server)中提取最新源代码
- 生成项目需要的标识或发布信息(如版本好,构建目录等)
- 在构建服务器(Build Server)上编译、构建,并且制作安装包
- 将安装包发送到发布服务器(Release Server)上
以上主要介绍了一下Dailybuild的基本只是,下面我们通过实例来实现整个过程, (CVS+VS2003+SetupFactory),关于服务器的建立设置就不说了;
从版本控制器服务器(CVS Server)中提取最新源代码
创建一个临时目录,用来存放从服务器上获取的源码
#del the old path
rmdir TempBuild /s /q
md TempBuild
cd TempBuild
cvs 客户端安装后并不会自动设置PATH,需要手动,设置CVS path
set CVS_PATH=D:\Program Files\TortoiseCVS
set path=%path%;%CVS_PATH%
设置cvs环境变量
set CVSROOT=:pserver:lanhuaiyu@192.168.1.81:2401/cvsroot/httpserver
登录CVS
cvs -q login -p lanhuaiyu
列出CVS所有模块
cvs -q ls
从CVS获取模块1
cvs -q checkout Module1
cvs -q checkout Module2
cvs -q checkout Module3
退出登录
cvs logout
生成项目需要的标识或发布信息(如版本好,构建目录等)
生成Setupfactory 所需要的全局变量文件,Setupfactory根据这些变量来打包产品;由于这部分用脚本在Windows下实现起来比较麻烦,在此用C++来实现,编译成一个EXE,有脚本来调用;
#include "stdafx.h"
#include "fileopt.h"
#include
#include
#include
#include
#include
#include
using namespace std;
const char* DEFAULT_BUILDDIR = "C:\\XXX_Release";
const char* DEFAULT_SRCDIR = "../build/release";
const char* PRODUCT_NAME = "XXX";
const char* MAIN_VER = "1.0(Alpha)";
const int MAX_PATH = 160;
int _tmain(int argc, _TCHAR* argv[])
{
struct tm *local;
time_t t;
t = time( NULL );
local = localtime(&t); // get local time
int nRt = 0;
string sSrcPath = DEFAULT_SRCDIR;
string sBuildPath = DEFAULT_BUILDDIR;
cout<<argv[0]<<endl;
if (argc > 1)
{
sSrcPath = argv[1];
cout<<argv[1]<<endl;
}
if (argc > 2)
{
sBuildPath = argv[2];
cout<<argv[2]<<endl;
}
char pzVersion[50];
string sFileName;
char pzSetupName[MAX_PATH];
for (int i = 1; i <= 15; i ++)
{
//setup file name info
sprintf(pzSetupName, "%s_%d%1X%02d%X.exe", PRODUCT_NAME,
local->tm_year - 100, local->tm_mon+1, local->tm_mday, i);
sFileName = DEFAULT_BUILDDIR;
sFileName.append("/");
sFileName.append(pzSetupName);
YLTT_COMM::CFileCmd::FormatPath(sFileName);
if (!YLTT_COMM::CFileCmd::IsExisted(sFileName.c_str()))
{
//version info
sprintf(pzVersion, "%s.%d%1X%02d%X", MAIN_VER,
local->tm_year - 100, local->tm_mon+1, local->tm_mday, i);
break;
}
else
{
cout<<pzSetupName<<" Exist!"<<endl;
}
}
//create build info
ofstream fsBuild;
fsBuild.open("build.ini", ios_base::out | ios_base::trunc);
fsBuild<<"[Constants]"<<endl;
fsBuild<<"#PRODUCT_NAME#=产品名称"<<endl;
fsBuild<<"#OUTPUTDIR#="<<DEFAULT_BUILDDIR<<endl;
fsBuild<<"#SETUPNAME#="<<pzSetupName<<endl;
fsBuild<<"#PRODUCT_VER#="<<pzVersion<<endl;
fsBuild<<"#SRC_PATH#="<<sSrcPath<<endl;
fsBuild.close();
ofstream fsCopy;
fsCopy.open("copy.bat", ios_base::out | ios_base::trunc);
fsCopy<<"copy "<<DEFAULT_BUILDDIR<<"\\"<<pzSetupName<<" "<<sBuildPath<<"\\"<<endl;
fsCopy.close();
return 0;
}
以上代码主要实现一下功能:
1. 根据当前日期和临时发布目录的文件确定目前需要产生的新版本的版本号;
2. 生成Setupfactory 所需要的全局变量文件;
3. 生成一个COPY.bat文件,调用此脚本将生成的新版本COPY到发布服务器上;
自动编译获取的源代码
#setpath
设置SetFactory PATH
set SF7_PATH=D:\Program Files\Setup Factory 7.0
设置编译器PATH
set VC7_PATH=D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE
set AB_PATH=F:\CVSRoot\ECast\autobuild
set path=%path%;%SF7_PATH%;%VC7_PATH%
编译解决方案(或项目)
#compile
devenv TempBuild/solution1/solution1.sln /build release /out release.log
自动制作安装包
生成项目需要的标识或发布信息
PreInstall.exe "TempBuild\build\release" "\\192.168.1.83\ftps\Work_Dir\xxx_release"
调用Setupfactory制作安装包,其中参数build.ini为全局变量文件,关于如何建立Setupfactory工程请参阅其帮助;
SUF70Design.exe /BUILD "ECast_inst.sf7" "/CONST:%AB_PATH%\build.ini" "/LOG:setup.log"
复制产品到发布服务器
copy.bat