-
本文的目的:
本文總結了過去一年中使用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,
打開看裏面的內容便可以發現代碼檢測結果。