编译器: 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%1Xd%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%1Xd%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: