持續集成是個簡單重復勞動,人來操作費時費力,使用自動化構建工具完成是最好不過的了。最終可以實現的一個效果是,svn提交代碼,服務器端自動編譯並發布。
所使用的版本:windows server 2008 r2,並使用它自帶的iis服務器。
1.機器上安裝好.net framework 4.5及.net framework 4.5 sdk(下載地址:https://msdn.microsoft.com/zh-cn/windows/hardware/hh852363),如果你的機器上已經安裝好了vs,並能夠編譯.net 項目,那可以跳過這一步。
2.下載jenkins到服務器,並安裝。
地址:http://jenkins-ci.org/
你可以看到這樣的界面:

3.點擊左邊的系統管理,選擇插件管理,安裝一個新的插件叫MSBuild Plugin
如下圖,打勾之后點擊直接安裝即可。

4.安裝完成后重啟Jenkins,然后點擊左側的系統管理,進入系統設置中。
5.找到下面的MSBuild節點,並點擊新增MSBuild,然后填寫名稱和MSBuild的路徑,我的配置如下:

6.在系統管理中找到Subversion節點(注:我使用的是svn代碼管理工具,如果你使用其他的,請配置其他節點),選擇為目前使用的版本。
這時候,最基本的環境就配置起來了,不過這時候的Jenkins隨便誰都能進來改配置,自己百度一下,把身份驗證啟用了吧,相信作為高級攻城獅的你,這個不在話下。
環境好了之后,我們來新增一個項目進去。let's go
1.點擊頁面上面的創建一個新任務,選擇構建一個自由風格的軟件項目,並填寫好名稱。

2.告訴Jenkins你的svn賬號,以便它來獲取你當前svn上面的程序。Repository中,填寫好你要自動構建的項目的svn地址,在Credentials這一項中,你需要先點擊add,填寫好您的用戶名和密碼(本文中未說明的項均保持默認即可)。

3.構建觸發器中勾選Poll SCM,日程表中填寫* * * * *,表示每一分鍾它去svn服務器看一次有沒有最新的版本。
4.在構建下面點擊增加構建步驟,並選擇Build a Visual Studio project or solution using MSBuild,在Command Line Arguments這一項中,填寫我下面的這段代碼
/m trunk/xxx.sln /t:Rebuild /p:Configuration=Release /p:DeployOnBuild=true;PublishProfile=xxx /p:TargetFrameworkVersion=v4.5
/m 后面寫你要編譯的sln文件,/p:后面是一個個的參數,Configuration=Release表示release方式的編譯,PublishProfile=xxx指的是你的發布的文件名稱,TargetFrameworkVersion表示你的目標.net framework版本,我用的是4.5,所以就寫4.5就行了。
我的配置如下(網上有人說把/m參數寫到MSBuild Build File那里也行,我嘗試了一下沒有成功):

在此過程中,還遇到了很多的問題,但是有時候真的是稀里糊塗的解決的,大概我給大家說說我遇到的問題:
1.開發機上的MSBuild文件夾需要copy到服務器.Microsoft ASP.NET也需要copy到服務器。
2.服務器上需要安裝.net framework的sdk,你需要編譯哪個版本的項目就裝哪個版本的sdk
從下面額鏈接找到對應的SDK下載:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff851942.aspx
Win8.1 對應 .NET Framework V4.5.1
Win8 對應 V4.5
2.編譯mvc項目廢了很大的勁,過程中走了很多的彎路,最后我發現,服務器上還是少一些SDK(我目前還沒有搞明白這些SDK要從哪里下載)
我把開發機器上C:\Program Files (x86)\Microsoft SDKs\Windows復制到服務器上,並且要把對應的注冊表的項備份了恢復到服務器,最后編譯還是報錯了,說是找不到aspnet_merge這個東西,找了許久,找到了http://stackoverflow.com/questions/16070886/vs-2012-publish-cant-find-the-valid-aspnetmergepath這篇參考文章,然后把C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Transform文件夾下面的Microsoft.Web.Publishing.AspNetCompileMerge文件中其中的一個<PropertyGroup>下面新增了下面的代碼(注:我用的是4.5的FrameWork,所以是v8.0A這個文件夾,4.5.1應該是v8.1A這個文件夾下面)
<TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\</TargetFrameworkSDKToolsDirectory>
它前后的內容如下,大家去找AspnetMergeName去區分就差不多了,服務器上只有記事本,所以無法提供行號。
<PropertyGroup> <GetAspNetMergePathDependsOn> GetFrameworkPaths; </GetAspNetMergePathDependsOn> </PropertyGroup> <Target Name="GetAspNetMergePath" DependsOnTargets="$(GetAspNetMergePathDependsOn)" Condition ="'$(GetAspNetMergePath)' != 'false'"> <PropertyGroup> <TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\</TargetFrameworkSDKToolsDirectory> <AspnetMergeName>aspnet_merge.exe</AspnetMergeName> <AspnetMergePath Condition="Exists('$(TargetFrameworkSDKToolsDirectory)$(AspnetMergeName)')">$(TargetFrameworkSDKToolsDirectory)</AspnetMergePath> </PropertyGroup> <Error Condition="'$(AspnetMergePath)' == '' Or !Exists($(AspnetMergePath))" Text="Can't find the valid AspnetMergePath" /> </Target>
3.如果失敗原因是缺少某個系統的程序集(比如:system.web.mvc),那么你一定要在本地項目中,檢查一下這個程序集的屬性中的復制到本地這一項是否為True,不為True,改為True即可。
4.其實中間還有很多的錯誤,都是慢慢解決掉的,如果你不介意,可以給服務器上安裝一個vs 2012 express for web,也不大,安裝包600M左右,能為你省不少事兒。
5.過程中我遇到一個非常蛋疼的問題,一直提示我找不到system.web.http這個dll,但是我確定我有這個dll,而且是復制到本地=True,但是死活就是編譯不過,提示我沒有這個dll,少命名空間,到現在都沒有搞明白,最后是我安裝了vs 2012 express好像就沒有了,如果哪位大牛知道為啥,請告訴我,萬分感謝。
時間不早了,為編譯通過正在興奮的我該平靜下來去睡覺了。
