[獨孤九劍]持續集成實踐(三)- Jenkins安裝與配置(Jenkins+MSBuild+GitHub)

本系列文章包含:html

[獨孤九劍]持續集成實踐(一)- 引子git

[獨孤九劍]持續集成實踐(二)– MSBuild語法入門web

[獨孤九劍]持續集成實踐(三)- Jenkins安裝與配置(Jenkins+MSBuild+GitHub)瀏覽器

 

一、前言                                                                                                       

本文是對用「MSBuild和Jenkins搭建持續集成環境(2)」的解讀,原文中一些設置並不能獲得做者所描述的結果,所以下文會結合實際部署對原文稍做修改。服務器

第一眼看上去,Jenkins像是一個專爲Java項目準備的持續集成工具:有爲Maven項目設計的job,有諸多爲Java項目提供的默認插件,更不要說那些用Java寫的插件了。併發

但Jenkins實際上是一個很是靈活的工具,它能夠結合各類版本管理系統和構建工具,用來構建任何類型的項目。在這篇文章中,咱們會利用它的靈活性,從Mercurial中pull代碼,用MSbuild構建項目。首先,咱們須要下載並安裝Jenkins,而後安裝Git和MSBuild插件。【原文中使用的是Mercurial,因爲我常用Git,所以這裏會更改成對Git的配置】框架

二、配置Jenkins                                                                                                             

官方網站下載安裝程序。它的Windows安裝包很簡單,會把Jenkins安裝成Windows服務。Jenkins的默認的訪問路徑是「localhost:8080」,請確保8080端口不要被其餘應用佔用。工具

1

安裝完畢之後就是裝插件。請點擊「系統管理」連接,而後再點擊「插件管理」。post

2

在「可用插件」標籤頁能夠查看當前可安裝的插件──你須要有一個能上網的環境,才能看到這一頁的內容。用「過濾框」找到Git Plugin、GitHub Plugin和 MSBuild插件,點擊插件名稱前面的複選框,進行安裝【在選擇安裝時,會自動關聯一些必要的插件進行安裝,很方便】單元測試

3

你能夠點擊「已安裝」標籤頁,來確保這兩個插件已經被安裝成功了。

在安裝過程當中,你可能會看到提示信息說Jenkins須要重啓才能完成安裝,請讓它重啓,等重啓完成後再訪問「已安裝」標籤頁,看看是否是安裝成功。

因爲未來使用GitHub,所以只須要知道一個Code的地址便可,配置很方便。回到「系統管理」這一頁上來,點擊「系統設置」,找到「Git」這一部分──若是你找不到「Git」的話,就說明Git插件沒有裝好──點擊「Add Git」按鈕以後,你須要給這個Git實例起個名字(本身用着越方便越好);還須要輸入Git可執行文件的安裝路徑,這裏用的是git.exe文件的所在目錄;

4

 

三、建立一個Jenkins Job                                                                       

點擊Jenkins的logo,回到控制面板上來,而後點擊「新建」連接。你會看到一組job類型,選擇「構建一個自由風格的軟件項目」,給它命名爲「CIProjectWebDemo1-RunUnitTests」,點擊OK。

5

下一步是job配置頁面。這一頁有不少配置項,並且大多數都帶有詳細的描述信息,點擊右側的幫助圖標就能夠看到。

6

咱們如今只配置兩部分,一是代碼庫所在位置,二是如何用MSBuild構建項目。

找到「源碼管理」,選擇Git。在「Repository URL」輸入框中輸入」你本身的GitHub中的代碼地址」。而後在Credentials中選擇證書【若是沒有就建立一個,一直默認就行,最開始我沒有選擇證書,在執行Job時,有時會卡在GitHub的通訊上,可能和這個有關,網上也有說和https協議有關】。最後在Branch中輸入你想跟蹤的分支名,其餘的選項看本身喜愛。

7

接下來到「構建」這部分。點擊「增長構建步驟」按鈕後,下拉框中就會出現一系列的step類型以供選擇,其中便包括「Build a Visual Studio project or solution using MSBuild」,若是你沒看到這個選項,就說明MSBuild插件沒有正確安裝。

8

點擊「Build a Visual Studio project or solution using MSBuild」以後,在「MSBuild Build File」輸入框中輸入構建腳本的名字:CIProjectWebDemo1.msbuild。咱們想讓Jenkins執行「RunUnitTests」這個Target ,若是你沒有把DefaultTargets屬性設成RunUnitTests的話,能夠在「Command Line Arguments」中輸入「/t:RunUnitTests」,其中/t是/target的簡寫。

9

點擊「Save」或「Apply」保存以後,這個job一旦被觸發,就能夠pull代碼下來,編譯項目,執行單元測試【這裏感受Save的提示很醒目,不知道用的那個UI框架,源碼中有看到引用YUI,沒用過不知是否是這個,有知道的朋友請留言給我,不勝感激】

咱們先來手工觸發一次,看看配置是否正確。先回到「控制面板」,這時能夠在屏幕中央看到咱們的job。點擊job名字,而後在左側的連接中找到「Build Now」連接,點擊它,Jenkins就會開始執行。

10

在這組連接的下方有一個「Build History」列表,它顯示的是這個job的全部構建歷史,當第一次構建開始運行的時候,你會在列表中看到一個進度條,同時還有一個小圓球顯示構建狀態。圓球閃爍表示構建正在進行中,它中止閃爍的時候通常會是紅色或藍色,紅色表示構建失敗,藍色表示成功。

若是這個job可以訪問GitHub版本庫,找到了CIProjectWebDemo1.msbuild腳本,「RunUnitTest」執行成功,這個圓球應該會變藍。這時候你也就順利完成了第一個Jenkins構建。若是構建失敗,請點擊「Build History」對應的編號查看詳細信息,而後點擊「Console Output」,就能夠看到Jenkins所執行的每個命令和對應結果,從中能夠分析出構建失敗的緣由。

四、觸發構建                                                                                            

構建成功之後,下一步要作的就是讓Jenkins檢測版本庫的變化,一旦有代碼提交,Jenkins就要pull代碼並執行構建。有好幾種方法能夠作到這一點。

最簡單的就是讓Jenkins定時構建,可是若是在這一段時間內沒有代碼提交,此次構建反而是浪費。

另外一種方式是讓Jenkins定時輪詢,看看版本庫中是否有代碼提交。這種方法的缺點是當有了代碼提交之後,Jenkins要等到下一個輪詢週期才能執行構建。固然,你也可讓Jenkins每分鐘都輪詢一次,儘量縮短等待時間。但咱們還有另外一種更優雅的方案──給版本庫中放一個post-commit的鉤子,這樣一旦版本庫接受了新代碼,它都會通知Jenkins,讓它馬上開始構建。【原文是使用Mercurial做爲版本管理工具的,所以下面的這種方法,我沒有嘗試,有興趣的朋友能夠拜讀原文,嘗試一下】

回到job配置頁面,在「Build Trigger」區域選擇「Poll SCM」,在「Schedule」輸入框中輸入輪詢週期。它採用的語法格式是cron的風格。若是要每5分鐘輪詢一次,就輸入「H/5 * * * *」。你能夠點擊輸入框右側的幫助按鈕,查看輪詢週期的語法介紹。

11

 

五、構建流水線                                                                                        

Jenkins能夠在某個構建成功結束以後啓動其餘job。因而就有了構建流水線,它的概念就是一個job成功以後觸發其餘job。觸發者叫作上游job,被觸發者被稱做下游job。

構建流水線的應用場景有不少:讓耗時較長的測試在單元測試結束以後執行;運行靜態代碼檢查;把構建結果部署到試機環境(staging)或者產品環境中。咱們下面來演示一下這個功能,讓Jenkins在構建結束後啓動web服務器,運行CIProjectWebDemo1這款應用。

咱們只須要作三件事情:

1. CIProjectWebDemo1-RunUnitTests job成功以後觸發一個新job;

2. 把CIProjectWebDemo1-RunUnitTests的構建結果拷貝出來;

3. 啓動web服務器。

在開始以前,你還須要安裝Copy Artifacts插件。回到Manage Plugins頁面,參考以前安裝Mercurial插件的方法安裝Copy Artifacts。在看到重啓的提示信息時重啓Jenkins【這一階段要鏈接的源有些是國外的,頗有可能被Q,致使安裝失敗,到時自行FQ便可】

12

建立新job以前,咱們須要告訴CIProjectWebDemo1-RunUnitTests job,讓它把構建產物保存下來,以供新job使用。回到CIProjectWebDemo1-RunUnitTests job的配置界面,找到「增長構建後操做步驟」,選中「Archive the artifacts」,頁面上就會出現一個文本框:「用於存檔的文件」。

13

咱們要存檔的目錄有兩份,一份是BuildArtifacts目錄,一份是packages目錄,後者是爲了讓咱們可以訪問NuGet package。若是要指定某個目錄以及目錄下全部內容,就須要在目錄後面跟一個斜槓和兩個星號。不一樣的目錄或文件之間用逗號分割。在這裏咱們輸入的是「BuildArtifacts/**」。

14

如今建立一個新job,起名叫「CIProjectWebDemo1-StartWebServer」【選擇「構建一個自由風格的軟件項目」】。在配置頁面上「構建觸發器」那一節裏選中「Build after other projects are built」,把以前那個job配置成要觸發當前job的項目。

15

接下來給job添加一個build step,讓這個job所作的第一件事情就是拷貝以前job所保存的構建產物。這裏要用到「Copy artifacts from another project」這個step(它是由Copy Artifacts插件提供的)。咱們只須要填入CIProjectWebDemo1-RunUnitTests job的名字就能夠。

16

 

17

最後還要添加一個build step,讓它啓動web server。這裏用的是「Execute Windows batch command」,咱們用Visual Studio提供的Cassini來運行應用。

Cassini能夠在「C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.EXE」找到【我是全盤搜索找到的】。運行Cassini很簡單,把web應用存放的路徑做爲參數傳給它就行,若是沒有指定端口號的話,它就會使用默認的端口號80。

「Execute Windows batch command」step須要一個能夠在BuildArtifacts和packages拷貝後的目錄下執行的命令。咱們把下面這個命令複製到「Command」輸入框中:

"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.EXE" /port:9988 /vpath:"BuildArtifacts\_PublishedWebsites\CIProjectWebDemo1"

【上面的命令是我本身測試出來的,原文中的命令沒法執行,多是Cassini版本不同】

這個命令能夠啓動Cassini,把它指向拷貝過來的應用,而後在9988端口啓動服務器。

全部的配置都已就緒。試着修改一下代碼而後提交。Jenkins應該可以監聽到變化,運行CIProjectWebDemo1-RunUnitTests。若是代碼編譯成功,全部測試均以經過,Jenkins應該開始運行CIProjectWebDemo1-StartWebServer job,把CIProjectWebDemo1-RunUnitTests的構建產物拷貝過來,在9988端口啓動Cassini。若是這一切都運行無誤,咱們的持續集成系統就搭好了。

六、結尾                                                                                               

此配置的結果是網站拷貝完畢後,啓動Cassini,指定網站目錄,而後這個job就一直處在等待的狀態,我以爲這就到結果了吧,至關於在Jenkins的進程中開啓了一個Web服務,此時在瀏覽器中輸入http://localhost:9988/main.aspx(這裏我是用的本身的webFrom網站)就能夠訪問到你的頁面了。

可是,若是不手動結束這個Job,那麼就會一直執行下去,當下一次被CIProjectWebDemo1-RunUnitTests運行結束的消息啓動,除非在配置裏開啓併發執行,不然將會一直等待上一個進程的執行;而併發執行又會因爲端口被佔用,致使Cassini沒法啓動,並使其崩潰。。感受好亂。

做者寫這個例子的目的,多是爲了演示Job鏈吧。

後來想到,若是沒有使用Cassini,而是用其餘的web服務器來啓動網站,可能就不會存在這種問題了。

 

各位看官,請繼續閱讀  [獨孤九劍]持續集成實踐 - 引子

相關文章
相關標籤/搜索