圖解持續集成--純命令行實現.Net項目每日構建(升級版本)
圖解持續集成
--純命令行實現.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、 降低了項目集成風險,通過每日構建能夠在更短的時間內發現代碼的沖突,減少了解決這種問題時間。
存在不足:
雖然該構建工具中實現了構建完全自動化,但不足的是未引入自動化測試工具,不能夠自動獲得有效報告和共享構建信息,在后面的文章中,我們將介紹一些工具實現。


浙公網安備 33010602011771號