CruiseControl.Net持續集成平臺搭建總結

原文地址:http://www.cnblogs.com/qiuliang/archive/2011/05/04/2036557.html


最近公司準備啓動一個新的項目,預計會投入20-30個開發人員,應該還算一個不小的項目,爲了更加科學化的管理,在這個項目裏面,打算採用一些XP和敏捷開發的理念,同時也會結合自身的實際情況。爲此,我受命着手研究持續集成相關的工具,通過幾天的努力,整個持續集成平臺初步搭建起來,基本上能夠實現自動獲取最新代碼、自動構建、自動測試以及自動發送報告。此篇文章作爲最近幾天的一個學習總結,某些地方不一定正確,請大家不吝賜教,將來也許隨着應用的深入,我也會持續更新相關的內容。

一、什麼是持續集成

  1. 什麼是持續集成(Continuous Integration)
     作爲極限編程的十二個實踐之一,可以讓團隊在持續的基礎上收到反饋並進行改進,不必等到開發週期後期才尋找和修復缺陷。通俗一點說,就是指對於開發人員的每一次代碼提交,都自動把代碼庫中所有代碼Check Out到一個目錄,並自動進行編譯,和部署,並且自動運行所有的Test case,以及一些諸如代碼檢查、測試覆蓋率等自動化任務,如果成功則接受這次提交,否則告訴所有人,這是一個失敗的revision。 
  2. 相關工具
    CruiseControl、Anthill、Bamboo、TeamCity
    CruiseControl作爲業界最具知名度和口碑的集成工具而被廣泛使用,而在.Net環境下也有CruiseControl.Net版本 ,本文以CruiseControl.Net作爲持續集成平臺,簡稱CC.Net。
  3. 示意圖
     

二、爲什麼要持續集成

  1. 持續集成的價值
     減小風險、減少手動過程、生成構建結果、安全感 
  2. 持續集成的自動化
    自動化運行測試、自動產生可部署的成品、自動將成品部署到近似環境、自動運行迴歸測試、自動生成度量報告

三、如何部署

首先確定安裝CC.NET的服務器,一般位於局域網內,然後安裝以下工具。當然CC.NET的能力也不限於此,應該是可以擴展很多其他的功能。

  1. CC.Net 1.6
    由ThoughtWorks開發並開源,目前最新的版本是1.6,本次實驗也是以此版本爲基礎,其他版本未經過驗證。
    下載地址:http://confluence.public.thoughtworks.org/display/CCNET/Download
  2. 版本管理工具
    本次選用SVN,同時CC.NET也支持VSS、TFS、CVS等。注意:如果CC.NET Server和SVN Server不在一臺機器上,也需要在CC.NET Server上安裝SVN的程序文件。
  3. 代碼構建工具
    MSBUILD,如果安裝了.Net Framework,就會自帶這個工具。
  4. 單元測試工具
    NUnit 2.6,大名鼎鼎的XUnit家族成員,順便提一下TestDriven.Net (plug-in for IDE) ,這個在CC.NET SERVER上不是必須,但作爲IDE的插件,非常適合開發人員使用。
  5. 代碼檢查工具
    FxCop,由微軟開發,CC.NET不能直接支持FxCop,需要使用task下的exec來調用bat文件。
  6. 代碼覆蓋率分析工具
    NCover 3.1,個人版本是免費的,其餘已經商業化,可以使用task下的exec來調用bat文件,看官方文檔好像也支持直接在config文件裏面配置<ncoverProfile />,但未實驗成功。

以上工具的安裝無須多言,關鍵在於CC.NET的配置,是一個比較複雜的事情,而CruiseControl.Net的中文資料也不是很多(在這點上,JAVA的CruiseControl情況好很多),很多東西都是參考官方網站的英文文檔,因本人水平有限,很多配置也許不是最佳實踐。

下面就以我最終的一個配置文件爲例,來說明具體的配置過程:

複製代碼
<cruisecontrol xmlns:cb="urn:ccnet.config.builder">
<project name="CruiseControlDemo" queue="Q1" queuePriority="1">

<triggers>
<!--自動運行build任務的間隔時間,單位:秒-->
<intervalTrigger seconds="30"/>
</triggers>

<workingDirectory>D:\QiuliangTest\DailyBuild</workingDirectory>
<artifactDirectory>D:\QiuliangTest\DailyBuild\log</artifactDirectory>
<!--Web Dashboard的URL-->
<webURL>http://172.16.82.176:8080/ViewFarmReport.aspx</webURL>
<modificationDelaySeconds>2</modificationDelaySeconds>
<maxSourceControlRetries>5</maxSourceControlRetries>
<initialState>Stopped</initialState>
<startupMode>UseInitialState</startupMode>

<!--版本控制的配置,以SVN爲例,其他版本控制工具請參考官網-->
<sourcecontrol type="svn">
<trunkUrl>https://172.16.82.178:444/svn/Wanda-Phase2/CCDemo</trunkUrl>
<executable>C:\Program Files (x86)\VisualSVN Server\bin/svn.exe</executable>
<workingDirectory>D:\QiuliangTest\src</workingDirectory>
<username>qiuliang</username>
<password>qiuliang</password>
</sourcecontrol>


<tasks>
<!--自動構建工具配置,以MSBUILD爲例,其他自動構建工具(例如NAnt)請參考官網-->
<msbuild>
<executable>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable>
<workingDirectory>D:\QiuliangTest\src</workingDirectory>
<projectFile>CCDemo.sln</projectFile>
<buildArgs>/p:Configuration=Debug /v:diag</buildArgs>
<targets>Build</targets>
<timeout>900</timeout>
<logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
<!--單元測試配置-->
<nunit>
<path>C:\Program Files (x86)\NUnit 2.6\bin\nunit-console.exe</path>
<assemblies>
<assembly>D:\QiuliangTest\src\CC.Test\bin\Debug\CC.Test.dll</assembly>
</assemblies>
<excludedCategories>
<excludedCategory>LongRunning</excludedCategory>
</excludedCategories>
<outputfile>D:\QiuliangTest\DailyBuild\nunit\nunit-results.xml</outputfile>
</nunit>
<!--NCover配置,其中bat文件需要自己寫-->
<exec executable="D:\QiuliangTest\ncover.bat" />
<!--FxCop配置,其中bat文件需要自己寫-->
<exec executable="D:\QiuliangTest\fxcop.bat" />

<!--將相關的報告合併-->
<merge>
<files>
<file>D:\QiuliangTest\DailyBuild\fxcop\*.xml</file>
<file>D:\QiuliangTest\DailyBuild\ncover\output\coverage.xml</file>
<!-- Other files to merge for your build would also be included here -->
</files>
</merge>
</tasks>
<publishers>
<statistics />
<xmllogger />
<email mailport="25" includeDetails="TRUE" mailhostUsername="userName" mailhostPassword="password" useSSL="FALSE">
<from>[email protected]</from>
<mailhost>smtp.email.com</mailhost>
<users>
<user name="qiuliang" group="buildmaster" address="[email protected]" />
</users>

<groups>
<group name="developers">
<notifications>
<notificationType>Failed</notificationType>
<notificationType>Fixed</notificationType>
</notifications>
</group>
<group name="buildmaster">
<notifications>
<notificationType>Always</notificationType>
</notifications>
</group>
</groups>

<converters>
<regexConverter find="$" replace="@TheCompany.com" />
</converters>

<!--失敗的郵件標題-->
<subjectSettings>
<subject buildResult="StillBroken" value="Build is still broken for {CCNetProject}" />
</subjectSettings>

</email>
</publishers>



</project>
</cruisecontrol>
複製代碼

fxcop的bat文件:

cd C:\Program Files (x86)\Microsoft FxCop 1.36
c:
FxCopCmd /project:D:\QiuliangTest\FxCop\default.FxCop /out:D:\QiuliangTest\DailyBuild\FxCop\DailyBuild.FxCop.xml /q /gac

ncover的bat文件:

cd C:\Program Files\NCover

ncover.console.exe "C:\Program Files (x86)\NUnit 2.6\bin\nunit-console.exe" /noshadow "D:\QiuliangTest\src\CC.Test\bin\Debug\CC.Test.dll" //at ncover\output\Trends.trend  //p "CCDemo-NCover" //x ncover\output\coverage.xml

目前只是初步完成了CC.NET的搭建,使用的效果如何,還有很多其他需要考慮的因素,總的來說,我感覺CC.NET是一款不錯的持續集成工具,如果在接下來的項目中能很好的利用起來,相信能爲提高整體的管理水平和生產力帶來一些幫助,如果有對這方面很熟悉的朋友,也希望能交流交流。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章