图解持续集成
--纯命令行实现.Net项目每日构建(升级版本)
在《纯命令行实现.Net项目每日构建》实现了完全自动化、可重复的构建工作,但随着时间的推移,新的问题暴露了:由于所在公司是一家 产品开发+现场实施 型的软件企业,十个人的研发团队并发支持四、五十个项目,每天除了完成客户个性化开发需求和沟通解决现场各种怪异问题之外,还要进行每日构建、版本发布(我们通常是一周对外发布一次版本,甚至临时版本)、甚至提供不同形式的源代码。在进度比较松的情况还能够勉强应付,但在进度较为紧张的时候,花较大精力去做这种事情,团队人员叫苦不迭。
针对这种情况,我们对第一个构建版本进行了改造,加入了主界面,在界面上可以进行不同操作的选择,如下图所示:
0、退出:返回到命令行主程序
1、生成DailyBuild每日版本发布用于测试回归:该选项包括获取源代码、编译及发布,作为BVT和每日测试回归版本,该操作频度一般为日频度;
2、生成ReleaseBuild发布测试版本:该选项包括获取源代码、编译及发布,为BVT和每周版本发布版本,该操作频度一般为周频度;
3、打包发布版本,包含帮助文件:打包指定版本程序包,包含帮助文件;
4、打包发布版本,不包含帮助文件:打包指定版本程序包,不包含帮助文件;
5、生成ReleaseBuild发布测试版本,并打包含帮助文件:在选项2基础上,打包程序包,并包含帮助文件;
6、生成ReleaseBuild发布测试版本,并打包不含帮助文件:在选项2基础上,打包程序包,并不包含帮助文件;
演示说明:
由于选项1、2较为类似,将以选项1作为例子;选项3、4较为类型,将以选项4为实例;选项5、6较为类似,将以选项5为示例。
1. 准备工作
在D:\JRTJ目录下建立如下文件夹:
-
BuildDaily:用于存放构建版本
-
BuildRelease:
-
BuildLogOfAuto:用户存放构建日志
-
自动编译脚本:存放每日构建脚本及辅助脚本
-
attrib.exe:文件属性修改程序
-
cscript.exe:Win32控制台脚本宿主引擎
-
iisvdir.vbs:IIS6.0中用户创建虚拟目录脚本
-
main.bat:构建主程序
-
replace.exe:运行在Framework1.1下,用于替换关键字的执行程序
-
version.exe:运行在Framework1.1下,用于版本号设置,加入当前时间并且每次自增1
-
version.txt:用于记录当前版本号,具体格式参见构建流程中对版本号说明
-
xcopy.exe:复制文件使用执行程序
2. 脚本解读
其中main.bat构建脚本内容如下:
@echo off
:: 程序打包、版本发布、备份程序
:: create&edit by jz_guo 2008-1-8 17:25
:: 在windwo2003、iis6.0、framework1.1环境下测试通过
:: 功能:1、生成DailyBuild每日版本发布用于测试回归 菜单号 1
:: 2、生成ReleaseBuild发布测试版本 菜单号 2
:: 3、打包发布版本,包含帮助文件 菜单号 3
:: 4、打包发布版本,不包含帮助文件 菜单号 4
:: 5、生成ReleaseBuild发布测试版本,并打包含帮助文件 菜单号 5
:: 6、生成ReleaseBuild发布测试版本,并打包不含帮助文件 菜单号 6
mode con lines=26
title 进行程序打包、版本发布、备份程序
color 1f
cls
set strCurrent=%cd%
:: ----------------------检测外部是否输入为空后者是帮助信息--------------------
if "%1%"=="/?" goto help :外部输入/?则出现DOS的帮助提示
if "%1%"=="/h" goto help :同上,输入/h
if "%1%"=="/H" goto help :同上,分别给出了大小写。
:help
rem ----------------------------图形化帮助提示----------------------------
echo.
echo #########################################################################
echo ## 向导 需要帮助请输入?或者h ##
echo ## 0、退出 输入 0 ##
echo ## 1、生成DailyBuild每日版本发布用于测试回归 输入 1 ##
echo ## 2、生成ReleaseBuild 发布测试版本 输入 2 ##
echo ## 3、打包发布版本,包含帮助文件 输入 3 ##
echo ## 4、打包发布版本,不包含帮助文件 输入 4 ##
echo ## 5、生成ReleaseBuild发布测试版本,并打包含帮助文件 输入 5 ##
echo ## 6、生成ReleaseBuild发布测试版本,并打包不含帮助文件 输入 6 ##
echo #########################################################################
echo.
rem ----------------------------设置参数信息----------------------------
:begin
rem ---------------------------------------------------------
rem 当前文件夹的路径
set strBatCurrPath=D:\JRTJ\自动编译脚本\
rem 设置日志存放的地址
set LogFilePath=D:\JRTJ\BuildLogOfAuto\
rem 大集中项目所在的路径
set GetToFolder=E:\VSS_DB_DJZ\综合报送产品改造项目\编码目录\人行集中版\PBOCWeb\
rem VSS相关的信息
set path=D:\Program Files\Microsoft Visual Studio\Common\VSS\win32
set ssdir=\\10.168.165.40\vss_db_djz
set ssuser=guojingzhan
set sspwd=guojingzhan
set PathOfProjInVss=$/综合报送产品改造项目/编码目录/人行集中版/PBOCWeb
rem 编译程序所在的路径
set DevelopPath=D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\
rem 保存文件所在的路径
set TargetFolderPath_Daily=D:\JRTJ\BuildDaily\
set TargetFolderPath_Release=D:\JRTJ\BuildRelease\
rem 设置打包路径
set TargetPath=C:\
rem ---------------------------------------------------------
rem ----------------------------设置参数信息----------------------------
:begin
rem ---------------------------------------------------------
rem 当前文件夹的路径
set strBatCurrPath=D:\JRTJ\自动编译脚本\
rem 设置日志存放的地址
set LogFilePath=D:\JRTJ\BuildLogOfAuto\
rem 大集中项目所在的路径
set GetToFolder=E:\VSS_DB_DJZ\综合报送产品改造项目\编码目录\人行集中版\PBOCWeb\
rem VSS相关的信息
set path=D:\Program Files\Microsoft Visual Studio\Common\VSS\win32
set ssdir=\\10.168.165.40\vss_db_djz
set ssuser=guojingzhan
set sspwd=guojingzhan
set PathOfProjInVss=$/综合报送产品改造项目/编码目录/人行集中版/PBOCWeb
rem 编译程序所在的路径
set DevelopPath=D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\
rem 保存文件所在的路径
set TargetFolderPath_Daily=D:\JRTJ\BuildDaily\
set TargetFolderPath_Release=D:\JRTJ\BuildRelease\
rem 设置打包路径
set TargetPath=C:\
rem ---------------------------------------------------------
第三部分
:CodeBuildContent
rem --------------------------------------------------------------------
echo 步骤一:从VSS获取最新的文件到编译文件夹下
echo 设置日志存放的地址
set LogFile=%LogFilePath%%date:~0,4%%date:~5,2%%date:~8,2%\
md %LogFile%
echo 删除编译文件夹下所有的文件
rmdir /s /q %GetToFolder%
md %GetToFolder%
echo 从VSS目录中获取最新的版本到编译目录下
ss get %PathOfProjInVss% -y%ssuser%,%sspwd% -I-Y -R -GL%GetToFolder% -O@%LogFile%codebuild.log
echo 步骤二:对最新的程序进行编译
echo 遍历设置DLL文件夹中文件为非只读
cd "%strBatCurrPath%"
xcopy "%GetToFolder%PBOCWeb\PBOC.Web\Dll" "%GetToFolder%PBOCWeb\PBOC.Web\Dll1\" /s /e /h
rmdir /s /q "%GetToFolder%PBOCWeb\PBOC.Web\Dll\"
xcopy "%GetToFolder%PBOCWeb\PBOC.Web\Dll1" "%GetToFolder%PBOCWeb\PBOC.Web\Dll\" /s /e /h
rmdir /s /q "%GetToFolder%PBOCWeb\PBOC.Web\Dll1\"
echo 版本号的重新设定
version version.txt
echo 程序编译
"%DevelopPath%devenv" /rebuild debug "%GetToFolder%PBOCWeb\PBOCWeb.sln" /out "%LogFile%compiler.log"
echo 步骤三:进行版本的发布
echo 从编译文件夹复制到发布文件夹
setlocal enabledelayedexpansion
set var=
for /f %%i in (version.txt) do set var=!var!%%i
set filename=%var%
set Publisfolder=%TargetFolderPath%%filename%\
cd "%strBatCurrPath%"
xcopy "%GetToFolder:~0,-1%" "%Publisfolder%" /s /e /h /y >"%LogFile%xcopy.log"
echo 发布应用
cscript iisvdir.vbs /create "默认网站" "PBOC.Web_D_%filename%" "%Publisfolder%PBOCWeb\PBOC.Web"
echo 修改文件的配置文件
"%strBatCurrPath%replace" %TargetFolderPath%%filename%\PBOCWeb\PBOC.Web\Config\PBOC.NEW.config %TargetFolderPath%%filename%\ %GetToFolder%
"%strBatCurrPath%replace" %TargetFolderPath%%filename%\PBOCWeb\PBOC.Web\web.config %TargetFolderPath%%filename%\ %GetToFolder%
set SourcePath=%TargetFolderPath%%filename%\PBOCWeb\PBOC.Web
if "%source%"=="5" goto Pack
if "%source%"=="6" goto Pack
goto begin
rem --------------------------------------------------------------------
第四部分
rem ----------------------------打包发布版本----------------------------
:PackRelease_Source
set SourcePath=enter
set /p SourcePath=请输入需要打包项目(PBOC.Web)路径:
set "SourcePath=%SourcePath:"=%"
if "%SourcePath%"=="enter" goto RePackRelease_Source
goto PackRelease_Target
:RePackRelease_Source
set ReSourcePath=enter
set /p ReSourcePath=你输入的路径为空,请重新输入需要打包项目(PBOC.Web)路径:
set "ReSourcePath=%ReSourcePath:"=%"
if "%ReSourcePath%"=="enter" goto RePackRelease_Source
goto PackRelease_Target
:PackRelease_Target
set TargetPath=enter
set /p TargetPath=请输入存放打包路径:
set "TargetPath=%TargetPath:"=%"
if "%SourcePath%"=="enter" goto RePackRelease_Target
goto Pack
:RePackRelease_Target
set ReTargetPath=enter
set /p ReTargetPath=你输入的路径为空,请重新输入请输入存放打包路径:
set "ReTargetPath=%ReTargetPath:"=%"
if "%ReTargetPath%"=="enter" goto RePackRelease_Target
goto Pack
:Pack
echo 步骤*:版本打包
echo 复制文件夹到临时目录
rmdir %TargetPath%PBOC.Web
md %TargetPath%PBOC.Web
"%strBatCurrPath%xcopy" "%SourcePath%" "%TargetPath%PBOC.Web" /s /e /h /y
set delPath=%TargetPath%PBOC.Web\
if "%source%"=="3" goto Del_IncludeHelp
if "%source%"=="4" goto Del_NoIncludeHelp
if "%source%"=="5" goto Del_IncludeHelp
if "%source%"=="6" goto Del_NoIncludeHelp
echo 打包出现异常,请检查!
goto begin
:Del_IncludeHelp
echo 删除指定类型文件,压缩程序包
del /s /q /f %delPath%Web.config
del /s /q /f %delPath%*.cs %delPath%*.resx %delPath%*.pdb %delPath%*.scc %delPath%*.sln %delPath%*.vssscc %delPath%*.suo %delPath%*.vspscc %delPath%*.webinfo %delPath%*.csproj
rd /s /q %delPath%config %delPath%Data %delPath%fckeditor %delPath%MenuXML %delPath%OfficeModel %delPath%Services %delPath%webctrl_client
"%strBatCurrPath%rar.exe" -y a "%TargetPath%PBOC.Web.rar" %TargetPath%PBOC.Web
echo 打包成功
echo.
goto begin
:Del_NoIncludeHelp
echo 删除指定类型文件,压缩程序包
del /s /q /f %delPath%Web.config
del /s /q /f %delPath%*.cs %delPath%*.resx %delPath%*.pdb %delPath%*.scc %delPath%*.sln %delPath%*.vssscc %delPath%*.suo %delPath%*.vspscc %delPath%*.webinfo %delPath%*.csproj
rd /s /q %delPath%config %delPath%Data %delPath%fckeditor %delPath%MenuXML %delPath%OfficeModel %delPath%Services %delPath%webctrl_client
del /s /q /f %delPath%Pages\SysManager\SysHelp\help.mht
del /s /q /f %delPath%Pages\SysManager\SysHelp\金融统计标准集中版帮助1.0.chm
"%strBatCurrPath%\rar.exe" -y a "%TargetPath%PBOC.Web.rar" %TargetPath%PBOC.Web
echo 打包成功
echo.
goto begin
rem ----------------------------输入错误提示----------------------------
:warng
echo 您选择的操作有误,请重新输入!
echo.
goto begin
3. 构建执行过程
3.1. 启动构建程序
双击或者在命令行中调用main.bat批处理主运行脚本
3.2.1. 步骤一从VSS服务器获取最新版本选择操作1回车,显示如下操作
-
设置日志存放的地址
-
删除编译文件夹下所有的文件
-
从VSS获取最新的文件到编译文件夹下
3.2.2. 步骤二编译程序
从VSS获取最新版本后,进行如下操作:
-
遍历设置DLL文件夹中文件为非只读(该步骤该项目个性化需要,不是必须)
-
版本号的重新设定
-
程序编译
3.2.3. 步骤三进行版本发布
编译通过以后,进行如下操作:
从编译文件夹复制到发布文件夹
发布应用
修改配置文件
日志信息
发布程序
该操作前三步骤与 3.2生成DailyBuild每日版本发布用于测试回归(选项1) 相同,只是在此之上增加了版本打包,如下图所示:
在打包路径可以看到打包文件夹PBOC.Web和压缩包PBOC.Web.rar
通过选项4可以对任意版本继续打包,其中选项3包含帮助文件,4不包含帮助文件。选择选项4可以需要输入打包项目(PBOC.Web)的路径和输入存放打包路径,如下图所示:
4. 总结
通过该工具构建好处:
1、 减少了人力投入到这种重复、无味的工作中,执行构建命令后可以一边喝茶一边等待结果,也可以把宝贵的时间投入到产品开发中;
2、 降低了项目集成风险,通过每日构建能够在更短的时间内发现代码的冲突,减少了解决这种问题时间。
存在不足:
虽然该构建工具中实现了构建完全自动化,但不足的是未引入自动化测试工具,不能够自动获得有效报告和共享构建信息,在后面的文章中,我们将介绍一些工具实现。