--纯命令行实现.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构建脚本内容如下:


2 :: 程序打包、版本发布、备份程序
3 :: create&edit by jz_guo 2008-1-8 17:25
4 :: 在windwo2003、iis6.0、framework1.1环境下测试通过
5 :: 功能:1、生成DailyBuild每日版本发布用于测试回归 菜单号 1
6 :: 2、生成ReleaseBuild发布测试版本 菜单号 2
7 :: 3、打包发布版本,包含帮助文件 菜单号 3
8 :: 4、打包发布版本,不包含帮助文件 菜单号 4
9 :: 5、生成ReleaseBuild发布测试版本,并打包含帮助文件 菜单号 5
10 :: 6、生成ReleaseBuild发布测试版本,并打包不含帮助文件 菜单号 6
11
12 mode con lines = 26
13 title 进行程序打包、版本发布、备份程序
14 color 1f
15 cls
16
17 set strCurrent = % cd %
18
19 :: ----------------------检测外部是否输入为空后者是帮助信息--------------------
20 if " %1% " == " /? " goto help :外部输入 / ?则出现DOS的帮助提示
21 if " %1% " == " /h " goto help :同上,输入 / h
22 if " %1% " == " /H " goto help :同上,分别给出了大小写。
23
24 :help
25 rem ----------------------------图形化帮助提示----------------------------
26 echo .
27 echo #########################################################################
28 echo ## 向导 需要帮助请输入?或者h ##
29 echo ## 0 、退出 输入 0 ##
30 echo ## 1 、生成DailyBuild每日版本发布用于测试回归 输入 1 ##
31 echo ## 2 、生成ReleaseBuild 发布测试版本 输入 2 ##
32 echo ## 3 、打包发布版本 , 包含帮助文件 输入 3 ##
33 echo ## 4 、打包发布版本 , 不包含帮助文件 输入 4 ##
34 echo ## 5 、生成ReleaseBuild发布测试版本 , 并打包含帮助文件 输入 5 ##
35 echo ## 6 、生成ReleaseBuild发布测试版本 , 并打包不含帮助文件 输入 6 ##
36 echo #########################################################################
37 echo .
38
39 rem ----------------------------设置参数信息----------------------------
40 :begin
41 rem ---------------------------------------------------------
42 rem 当前文件夹的路径
43 set strBatCurrPath = D: \ JRTJ \ 自动编译脚本 \
44
45 rem 设置日志存放的地址
46 set LogFilePath = D: \ JRTJ \ BuildLogOfAuto \
47
48 rem 大集中项目所在的路径
49 set GetToFolder = E: \ VSS_DB_DJZ \ 综合报送产品改造项目 \ 编码目录 \ 人行集中版 \ PBOCWeb \
50
51 rem VSS相关的信息
52 set path = D: \ Program Files \ Microsoft Visual Studio \ Common \ VSS \ win32
53 set ssdir =\\ 10.168 . 165.40 \ vss_db_djz
54 set ssuser = guojingzhan
55 set sspwd = guojingzhan
56 set PathOfProjInVss =$/ 综合报送产品改造项目 / 编码目录 / 人行集中版 / PBOCWeb
57
58 rem 编译程序所在的路径
59 set DevelopPath = D: \ Program Files \ Microsoft Visual Studio . NET 2003 \ Common7 \ IDE \
60
61 rem 保存文件所在的路径
62 set TargetFolderPath_Daily = D: \ JRTJ \ BuildDaily \
63 set TargetFolderPath_Release = D: \ JRTJ \ BuildRelease \
64
65 rem 设置打包路径
66 set TargetPath = C: \
67 rem ---------------------------------------------------------


2 :begin
3 rem ---------------------------------------------------------
4 rem 当前文件夹的路径
5 set strBatCurrPath = D: \ JRTJ \ 自动编译脚本 \
6
7 rem 设置日志存放的地址
8 set LogFilePath = D: \ JRTJ \ BuildLogOfAuto \
9
10 rem 大集中项目所在的路径
11 set GetToFolder = E: \ VSS_DB_DJZ \ 综合报送产品改造项目 \ 编码目录 \ 人行集中版 \ PBOCWeb \
12
13 rem VSS相关的信息
14 set path = D: \ Program Files \ Microsoft Visual Studio \ Common \ VSS \ win32
15 set ssdir =\\ 10.168 . 165.40 \ vss_db_djz
16 set ssuser = guojingzhan
17 set sspwd = guojingzhan
18 set PathOfProjInVss =$/ 综合报送产品改造项目 / 编码目录 / 人行集中版 / PBOCWeb
19
20 rem 编译程序所在的路径
21 set DevelopPath = D: \ Program Files \ Microsoft Visual Studio . NET 2003 \ Common7 \ IDE \
22
23 rem 保存文件所在的路径
24 set TargetFolderPath_Daily = D: \ JRTJ \ BuildDaily \
25 set TargetFolderPath_Release = D: \ JRTJ \ BuildRelease \
26
27 rem 设置打包路径
28 set TargetPath = C: \
29 rem ---------------------------------------------------------


2 rem --------------------------------------------------------------------
3 echo 步骤一 :从VSS获取最新的文件到编译文件夹下
4 echo 设置日志存放的地址
5 set LogFile = %LogFilePath%% date :~ 0 , 4 %% date :~ 5 , 2 %% date :~ 8 , 2 % \
6 md %LogFile%
7
8 echo 删除编译文件夹下所有的文件
9 rmdir / s / q %GetToFolder%
10 md %GetToFolder%
11
12 echo 从VSS目录中获取最新的版本到编译目录下
13 ss get %PathOfProjInVss% -y%ssuser% , %sspwd% -I-Y -R -GL%GetToFolder% -O@%LogFile%codebuild . log
14
15
16 echo 步骤二 :对最新的程序进行编译
17 echo 遍历设置DLL文件夹中文件为非只读
18 cd " %strBatCurrPath% "
19 xcopy " %GetToFolder%PBOCWeb\PBOC.Web\Dll " " %GetToFolder%PBOCWeb\PBOC.Web\Dll1\" /s /e /h
20 rmdir /s /q " %GetToFolder%PBOCWeb \ PBOC . Web \ Dll \ "
21 xcopy " %GetToFolder%PBOCWeb \ PBOC . Web \ Dll1 " " %GetToFolder%PBOCWeb \ PBOC . Web \ Dll \ " /s /e /h
22 rmdir /s /q " %GetToFolder%PBOCWeb \ PBOC . Web \ Dll1 \ "
23
24 echo 版本号的重新设定
25 version version.txt
26
27 echo 程序编译
28 " %DevelopPath%devenv " /rebuild debug " %GetToFolder%PBOCWeb \ PBOCWeb . sln " /out " %LogFile%compiler . log "
29
30 echo 步骤三:进行版本的发布
31 echo 从编译文件夹复制到发布文件夹
32 setlocal enabledelayedexpansion
33 set var=
34 for /f %%i in (version.txt) do set var=!var!%%i
35 set filename=%var%
36 set Publisfolder=%TargetFolderPath%%filename%\
37 cd " %strBatCurrPath% "
38 xcopy " %GetToFolder:~ 0 , - 1 % " " %Publisfolder% " /s /e /h /y > " %LogFile% xcopy . log "
39
40 echo 发布应用
41 cscript iisvdir.vbs /create " 默认网站 " " PBOC . Web_D_%filename% " " %Publisfolder%PBOCWeb \ PBOC . Web "
42
43 echo 修改文件的配置文件
44 " %strBatCurrPath% replace " %TargetFolderPath%%filename%\PBOCWeb\PBOC.Web\Config\PBOC.NEW.config %TargetFolderPath%%filename%\ %GetToFolder%
45 " %strBatCurrPath% replace " %TargetFolderPath%%filename%\PBOCWeb\PBOC.Web\web.config %TargetFolderPath%%filename%\ %GetToFolder%
46
47 set SourcePath=%TargetFolderPath%%filename%\PBOCWeb\PBOC.Web
48 if " %source% " == " 5 " goto Pack
49 if " %source% " == " 6 " goto Pack
50 goto begin
51 rem --------------------------------------------------------------------


2 :PackRelease_Source
3 set SourcePath = enter
4 set / p SourcePath = 请输入需要打包项目 ( PBOC . Web ) 路径:
5 set " SourcePath=%SourcePath: " = % "
6 if " %SourcePath% " == " enter " goto RePackRelease_Source
7 goto PackRelease_Target
8
9 :RePackRelease_Source
10 set ReSourcePath=enter
11 set /p ReSourcePath=你输入的路径为空,请重新输入需要打包项目(PBOC.Web)路径:
12 set " ReSourcePath = %ReSourcePath: " =% "
13 if " %ReSourcePath% " == " enter " goto RePackRelease_Source
14 goto PackRelease_Target
15
16 :PackRelease_Target
17 set TargetPath = enter
18 set / p TargetPath = 请输入存放打包路径:
19 set " TargetPath=%TargetPath: " = % "
20 if " %SourcePath% " == " enter " goto RePackRelease_Target
21 goto Pack
22
23 :RePackRelease_Target
24 set ReTargetPath=enter
25 set /p ReTargetPath=你输入的路径为空,请重新输入请输入存放打包路径:
26 set " ReTargetPath = %ReTargetPath: " =% "
27 if " %ReTargetPath% " == " enter " goto RePackRelease_Target
28 goto Pack
29
30 :Pack
31 echo 步骤* :版本打包
32 echo 复制文件夹到临时目录
33 rmdir %TargetPath%PBOC . Web
34 md %TargetPath%PBOC . Web
35 " %strBatCurrPath%xcopy " " %SourcePath% " " %TargetPath%PBOC.Web " / s / e / h / y
36 set delPath = %TargetPath%PBOC . Web \
37 if " %source% " == " 3 " goto Del_IncludeHelp
38 if " %source% " == " 4 " goto Del_NoIncludeHelp
39 if " %source% " == " 5 " goto Del_IncludeHelp
40 if " %source% " == " 6 " goto Del_NoIncludeHelp
41 echo 打包出现异常,请检查!
42 goto begin
43
44 :Del_IncludeHelp
45 echo 删除指定类型文件,压缩程序包
46 del / s / q / f %delPath%Web . config
47 del / s / q / f %delPath%* . cs %delPath%* . resx %delPath%* . pdb %delPath%* . scc %delPath%* . sln %delPath%* . vssscc %delPath%* . suo %delPath%* . vspscc %delPath%* . webinfo %delPath%* . csproj
48 rd / s / q %delPath%config %delPath%Data %delPath%fckeditor %delPath%MenuXML %delPath%OfficeModel %delPath%Services %delPath%webctrl_client
49 " %strBatCurrPath%rar.exe " -y a " %TargetPath%PBOC.Web.rar " %TargetPath%PBOC . Web
50 echo 打包成功
51 echo .
52 goto begin
53
54 :Del_NoIncludeHelp
55 echo 删除指定类型文件,压缩程序包
56 del / s / q / f %delPath%Web . config
57 del / s / q / f %delPath%* . cs %delPath%* . resx %delPath%* . pdb %delPath%* . scc %delPath%* . sln %delPath%* . vssscc %delPath%* . suo %delPath%* . vspscc %delPath%* . webinfo %delPath%* . csproj
58 rd / s / q %delPath%config %delPath%Data %delPath%fckeditor %delPath%MenuXML %delPath%OfficeModel %delPath%Services %delPath%webctrl_client
59 del / s / q / f %delPath%Pages \ SysManager \ SysHelp \ help . mht
60 del / s / q / f %delPath%Pages \ SysManager \ SysHelp \ 金融统计标准集中版帮助1 . 0 . chm
61 " %strBatCurrPath%\rar.exe " -y a " %TargetPath%PBOC.Web.rar " %TargetPath%PBOC . Web
62 echo 打包成功
63 echo .
64 goto begin
65
66 rem ----------------------------输入错误提示----------------------------
67 :warng
68 echo 您选择的操作有误,请重新输入!
69 echo .
70 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、 降低了项目集成风险,通过每日构建能够在更短的时间内发现代码的冲突,减少了解决这种问题时间。
存在不足:
虽然该构建工具中实现了构建完全自动化,但不足的是未引入自动化测试工具,不能够自动获得有效报告和共享构建信息,在后面的文章中,我们将介绍一些工具实现。
出處http://www.cnblogs.com/shishanyuan/archive/2011/08/25/2153384.html