zoukankan      html  css  js  c++  java
  • CVS+VS2003+SetupFactory建设每日构建(Daily build)

    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等等;

          打包软件:installsheildsetupfactoryinstallanywhere等等

           构建服务器(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

  • 相关阅读:
    十问5.12汶川大地震
    JZ035数组中的逆序对
    JZ037数字在排序数组中出现的次数
    JZ039平衡二叉树
    JZ033丑数
    JZ040数组中只出现一次的数字
    JZ032把数组排成最小的数
    JZ036两个链表的第一个公共结点
    JZ034第一个只出现一次的字符位置
    JZ031从 1 到 n 整数中 1 出现的次数
  • 原文地址:https://www.cnblogs.com/kevinzhwl/p/1850026.html
Copyright © 2011-2022 走看看