如何用CruiseControl.Net來進行持續化集成
本文總結了過去一年中使用 CruiseControl.Net來對工作流程進行持續化集成的經驗教訓,詳細地講述安裝,配置,使用CruiseControl.Net的具體步驟,希望通過閱讀本文,能理解和掌握使用CruiseControl.Net的基本使用技巧,用工具來改善工作流程和提高工作效率。
-
什么是持續化集成
首先,我們先搞清楚什么是持續化集成?它對我們的日常工作有什么樣的幫助?在過去幾年中,敏捷已經是一個非常熱門的話題,它高效的工作方式和快速的需求應對能力,贏得了很多中小軟件廠商的關注。那么敏捷除了一些經常談論到編程思維和迭代的開發模式等,其實還部分依賴于好的改善工作流程的工具。持續化集成工具便是服務于敏捷軟件開發的一個系列。它主要將原本分散,無序的工作流程,通過工具軟件有機的組織起來,并且在組織的過程中,參與開發設計測試的各個部門的人員都能從中獲取到自動化方面的優惠。使得團隊的工作效率大大提升。
-
CruiseControl.Net是什么?
上面講解了什么是持續化集成,那 CruiseControl.Net就是一款由ThoughtWorks公司提供給我們的輕量級的持續化集成工具。它能夠將代碼版本控制,單元測試,代碼規范檢查,項目的發布部署等工作步驟有機的組織起來,并且利用其調度性可作自動化處理,它還有強大的日志記錄功能,能將集成結果及時地反饋給項目管理人員和項目開發人員。在下文中凡是用到CruiseControl.Net均用CC.Net來代替。下面是CC.Net的工作流程圖
注:本文屬jillzhang 原創,轉載請注明出處 ,歡迎訪問http://jillzhang.cnblogs.com/來獲取最新更新
-
如何安裝CC.Net
CC.Net是一款開源軟件,它的官方主頁是: http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET
打開它的主頁,便能看出他的官方采用另外一款非常出色的團隊協作平臺:Confluence,用它結合jira Bug管理系統,也能極大限度的提高團隊協作能力,有關他們的介紹請訪問:http://www.jira.com/ 。好了,返回來繼續介紹CC.Net,當前官方已經發布了最新的CruiseControl.NET-1.3.0.2918,在首頁的release欄中,便可以找到下載最新版CC.Net的連接,它是一款開源軟件,你也可以在http://www.sf.net中找到它的源碼和安裝文件。如果你就是想使用CC.Net直接下載exe文件即可。下載后,在本地的安裝過程如下:
-
雙擊CruiseControl.NET-1.3-Setup.exe程序,打開軟件安裝界面,如下:
-
一直點擊Next,選擇軟件安裝路徑,等待軟件安裝完成,界面如下:
-
軟件安裝完成之后,在系統windows服務中將增加名為CruiseControl.Net Server的系統服務,如下:
注意,默認情況該服務是出于未啟動狀態的。
因為CC.Net是一個集成持續工具在部署CC.Net之前,單獨靠它自己是沒有實際意義的,所以在部署配置CC.Net之前,您需要事先準備好并且安裝下述 軟件:
-
代碼版本管理工具如VSS
-
代碼構建工具,如果您是vs.net的用戶,強烈建議不要使用NAnt,配置起來比較麻煩,建議使用MsBuild來做構建工具。MsBuild是隨.Net FrameWork 2.0一起安裝的,所您需要在CC.Net服務器上安裝.Net FrameWork 2.0或者以上版本。
-
代碼規范檢查工具,.Net用戶推薦使用FxCop.exe,下載地址: http://www.microsoft.com/downloads/details.aspx?FamilyID=3389f7e4-0e55-4a4d-bc74-4aeabb17997b&displaylang=en ,很不幸的是,它原來的官方主頁 http://code.msdn.microsoft.com/GotDotNet.aspx 關閉了,在新的站點中,我沒有搜索到它。
-
單元測試工具:Nunit,官方主頁:http://sourceforge.net/projects/nunit
-
發布部署工具,如果是asp.net網站,可以使用ASP.NET 編譯工具 (Aspnet_compiler.exe),但我感覺它不好用,于是我自己實現了一系列的代碼發布,FTP上傳,XCopy安裝等組件,在后面會提到。
除了上述,CC.Net還支持NCover,Simian和Fitness,我沒有具體應用,便不多講。
注:本文屬jillzhang 原創,轉載請注明出處 ,歡迎訪問http://jillzhang.cnblogs.com/來獲取最新更新
-
如何配置和部署
假定上述的幾個工具已經成功安裝,下面就用一個項目來演示一下如何實現自動化構建,單元測試,代碼規范檢測,自動發布部署。并且可以演示項目管理和開發人員通過什么樣的手段能及時了解持續集成化的結果。
在演示制作之前,我們先來看一下當前的持續集成環境。
工具 |
地址和路徑 |
Visual Studio SouceSafe |
本局域網下一臺服務器,IP地址192.168.1.200,共享目錄:VSS,所以其根路徑為: \\192.168.1.200\\VSS ,用戶名user,密碼pwd |
CC.Net |
CC.Net安裝在IP地址為:192.168.1.10的服務器上。 |
單元測試工具NUnit |
和CC.Net安裝在同一主機 |
代碼規范工具FxCop |
和CC.Net安裝在同一主機 |
發布服務器 |
位于公網的一臺服務器,IP假設為200.100.11.15 |
首先,我們創建用于演示的解決方案Jillzhang.DailyBuild,其中包括四個項目:
項目 |
項目描述 |
Jillzhang.DailyBuild.Core |
這個是一個公共類庫項目,目的是測試類似這樣的項目也在構建范圍之內。 |
Jillzhang.DailyBuild.Test |
單元測試項目 |
Jillzhang.DailyBuild.Web |
網站項目一 |
Jillzhang.DailyBuild.Web2 |
網站項目二 |
建立好解決方案之后,將其添加到VSS項目管理器中。層次結構如下:
![]()
下面我讓我們看一下,如何配置CC.Net使其工作起來。
-
在CC.Net服務器上,點擊開始菜單,在所有程序中選擇CruiseControl.Net,打開CruiseControl.NET Config配置文件。
-
CC.Net 支持同時監控和集成多個解決方案,每個解決方案在CC.Net中被稱為1個Project.,在CruiseControl.NET Config中1個Project被一個<project>元素來描述。當然我們還要為每個Project指定名稱和工作目錄和日志存放目錄。閱讀CC.Net的文檔,你可以了解<project>元素的一些屬性和子元素。這里我只講述一些我用到的。
name ,如<project name="Project1">表示1個名稱為Project1的新工程,這個名稱在日后會作為項目的標識顯示給查看報告的用戶。比如顯示在 cctray上或者在網站doashboard上進行顯示。還有一個比較重要的子元素<workingDirectory>這個元素非常類似于WCF配置中的<baseAddress>,用它來指示工程的工作目錄,也就是從版本管理器上下載文件的根目錄。除了這些我們還需要設定子元素<artifactDirectory >它用來指示日志記錄的保存位置。CC.Net為我們提供了幾種版本管理方式,可以用<labeler>
來指定使用哪種類型的版本標簽,如 Date Labeller,Default Labeller等,具體也可以查閱文檔。我們這里使用Date Laberller,所以設置為<labeler type="dateLabeller"/>。下面可以設置源代碼管理器,CC.Net支持目前絕大多數主流的版本控制工具,如 CVS,VSS,Rational ClearCase,VSTS, Alienbrain等十幾種。我們這里使用VSS,根據上文VSS和解決方案的配置,我們這里設置為:
< sourcecontrol type ="vss" autoGetSource ="true" applyLabel ="true" >
< project > $/Jillzhang.DailyBuild.root/Jillzhang.DailyBuild </ project >
< username > user </ username >
< password > pwd </ password >
< ssdir > \\192.168.1.200\vss\ </ ssdir >
< cleanCopy > false </ cleanCopy >
</ sourcecontrol >
![]()
將autoGetSource設置為true,CC.Net會通過監視VSS中代碼的版本變化,自動從版本管理器中獲取源代碼。Project是要使用的解決方案在vss中的路徑,值為如下:
Username 為訪問vss的用戶名,password為訪問vss的密碼。ssdir是 vss代碼庫的共享路徑,我這里為\\192.168.1.200\vss\ 。如果將cleanCopy設置為true,那么CC.Net每次獲取最新文件的時候是否完全覆蓋更新文件。
當前,我們的配置文件為:
< cruisecontrol >
< project name ="TestProject" webURL ="http://127.0.0.1/ccnet/" >
< workingDirectory > E:\DailyBuild </ workingDirectory >
< artifactDirectory > E:\DailyBuild\Log </ artifactDirectory >
< labeller type ="dateLabeller" ></ labeller >
< sourcecontrol type ="vss" autoGetSource ="true" applyLabel ="true" >
< project > $/Jillzhang.DailyBuild.root/Jillzhang.DailyBuild </ project >
< username > user </ username >
< password > pwd </ password >
< ssdir > \\192.168.1.200\vss\ </ ssdir >
< cleanCopy > false </ cleanCopy >
</ sourcecontrol >
</ project >
</ cruisecontrol >
![]()
設置好VSS后,我們可以啟動CC.Net了,方法如下,打開Services.Msc,找到CruismControl.Net Server服務,在啟動之前,需要先解決一下可能最影響情緒的問題:我們知道windows services默認情況下是用本地系統賬戶運行的,可一般情況下我們會在當前操作用戶下設置對vss共享目錄的訪問權限,比如當前windows運行賬戶為administrator,那么我們在administrator中通過net use設置對\\192.168.1.200\vss\的訪問,也可以通過Source Safe Client打開該代碼庫,可這往往是一個煙霧彈,當我們在CC.Net中試圖用服務來訪問\\192.168.1.200\vss\ 的時候,系統服務賬戶并沒有與該共享目錄建立會話,所以會拒絕訪問\\192.168.1.200\vss\,連訪問權限都沒有,更不用說獲取代碼了。所以首先要注意的是啟動前,先設置服務的運行賬戶:
只有這樣,我們才能進行下面的工作:
啟動CruismControl.Net Server服務,重新簽出,嵌入一下解決方案,稍等一段時間,我們便會在工作目錄E:\DailyBuild中看到自動獲取過來的文件。還要值得注意的一點是在log目錄中最好事先創建好buildlogs,如果您在啟動CrusimControl.Net Server服務的時候有錯誤出現,比如在啟動的時候總是出現:
很可能得情況就是上面的配置有錯誤,您可以通過下面兩種方式來確定服務到底出現了什么樣的問題:
-
按照提示,在事件查看器中查看錯誤,如:
-
您還可以到CrusimControl.Net Server的應用程序目錄查找名為ccnet.log的文件,里面有CC.Net詳細的操作步驟。
如果沒有啟動錯誤并且在ccnet.log中沒有明顯的異常,可以打開監視網站來查看集成結果,監視網站的地址是在<project>元素上通過設置webURL屬性來完成的,我們打開這個網址,如圖:
當Last Build Status為Success的時候表示項目集成成功,此時點擊項目名,可以查看具體的集成結果:
如果調用MsBuild來對代碼進行生成,調用FxCop進行代碼規范檢查,和調用NUnit進行單元測試集成,還需要對CC.Net進行下一步的配置。
代碼規范檢側工具FxCop不能被CC.Net直接使用,它必須附加到MsBuild.Exe的命令行中,有關如何使用MSBuild,可以參考msdn, 不做具體介紹。為此我們創建一個用于生成并檢查代碼規范的任務,CC.Net支持自定義任務,方法是:使用Task中的Executable Task。
首先在工作目錄,創建一個用于msbuild參數的DailyBuild.msbuild文件,文件內容如下:
< Project DefaultTargets ="Build" xmlns ="http://schemas.microsoft.com/developer/msbuild/2003" >
< Target Name ="Build" >
<!-- Clean, then rebuild entire solution -->
< MSBuild Projects ="Jillzhang.DailyBuild.sln" Targets ="Clean;Rebuild" />
<!-- Run FxCop analysis -->
< Exec Command ="exeu.bat" />
</ Target >
</ Project >
![]()
這個MsBuild選項會使得msbuild.exe在生成完成之后調用工作目錄中的exeu.bat文件,exeu.bat中是關于使用FxCop方法的,內容如下:
cd D:\Program Files\Microsoft FxCop 1.36
d:
FxCopCmd /project:E:\DailyBuild\Jillzhang.DailyBuild.FxCop /out:E:\DailyBuild\log\DailyBuild.FxCop.xml
![]()
目的就是通過調用FxCop安裝目錄下的FxCopCmd命令行工具,對指定的程序集進行規范性檢查,上述代碼中,E:\DailyBuild\Jillzhang.DailyBuild.FxCop是事先生成好的FxCop項目文件,生成辦法是打開FxCop 可視化界面,添加target,并保存到此為位置即可,如圖:
并保存到E:\DailyBuild\Jillzhang.DailyBuild.FxCop
添加能生成代碼并且檢測代碼規范性的配置如下:
< tasks >
< exec > < executable > D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe </ executable > < baseDirectory > E:\DailyBuild </ baseDirectory >
< buildArgs > DailyBuild.msbuild /p:Configuration=Release </ buildArgs >
< buildTimeoutSeconds > 1200 </ buildTimeoutSeconds >
</ exec >
< merge >
< files >
< file > E:\DailyBuild\log\Build.FxCop.xml </ file >
</ files >
</ merge >
</ tasks >
![]()
注意,buildTimeoutSeconds是生成操作的超時時間,還有最好設置/p:Configuration=Release,因為這樣有利于以后發布。而Merge是將上面各個任務中生成的日志進行合并。
下面重新簽出嵌入,觀察集成結果:
![]()
可以看到,已經release成功。
下面就看一下生成的DailyBuild.FxCop.xml,
打開看里面的內容便可以發現代碼檢測結果。
注:本文屬jillzhang 原創,轉載請注明出處 ,歡迎訪問http://jillzhang.cnblogs.com/來獲取最新更新