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


本系列文章包含:

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

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

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

 

1、前言                                                                                                       

本文是對用“MSBuild和Jenkins搭建持續集成環境(2)”的解讀,原文中一些設置並不能得到作者所描述的結果,因此下文會結合實際部署對原文稍作修改。

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

但Jenkins其實是一個非常靈活的工具,它可以結合各種版本管理系統和構建工具,用來構建任何類型的項目。在這篇文章中,我們會利用它的靈活性,從Mercurial中pull代碼,用MSbuild構建項目。首先,我們需要下載並安裝Jenkins,然后安裝Git和MSBuild插件。【原文中使用的是Mercurial,由於我經常使用Git,因此這里會更改為對Git的配置】

2、配置Jenkins                                                                                                             

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

1

安裝完畢以后就是裝插件。請點擊“系統管理”鏈接,然后再點擊“插件管理”。

2

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

3

你可以點擊“已安裝”標簽頁,來確保這兩個插件已經被安裝成功了。

在安裝過程中,你可能會看到提示信息說Jenkins需要重啟才能完成安裝,請讓它重啟,等重啟完成后再訪問“已安裝”標簽頁,看看是不是安裝成功。

由於將來使用GitHub,因此只需要知道一個Code的地址即可,配置很方便。回到“系統管理”這一頁上來,點擊“系統設置”,找到“Git”這一部分──如果你找不到“Git”的話,就說明Git插件沒有裝好──點擊“Add Git”按鈕之后,你需要給這個Git實例起個名字(自己用着越方便越好);還需要輸入Git可執行文件的安裝路徑,這里用的是git.exe文件的所在目錄;

4

 

3、創建一個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所執行的每一個命令和對應結果,從中可以分析出構建失敗的原因。

4、觸發構建                                                                                            

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

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

另一種方式是讓Jenkins定時輪詢,看看版本庫中是否有代碼提交。這種方法的缺點是當有了代碼提交以后,Jenkins要等到下一個輪詢周期才能執行構建。當然,你也可以讓Jenkins每分鍾都輪詢一次,盡可能縮短等待時間。但我們還有另一種更優雅的方案──給版本庫中放一個post-commit的鈎子,這樣一旦版本庫接受了新代碼,它都會通知Jenkins,讓它立刻開始構建。【原文是使用Mercurial作為版本管理工具的,因此下面的這種方法,我沒有嘗試,有興趣的朋友可以拜讀原文,嘗試一下】

回到job配置頁面,在“Build Trigger”區域選擇“Poll SCM”,在“Schedule”輸入框中輸入輪詢周期。它采用的語法格式是cron的風格。如果要每5分鍾輪詢一次,就輸入“H/5 * * * *”。你可以點擊輸入框右側的幫助按鈕,查看輪詢周期的語法介紹。

11

 

5、構建流水線                                                                                        

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。如果這一切都運行無誤,我們的持續集成系統就搭好了。

6、結尾                                                                                               

此配置的結果是網站拷貝完畢后,啟動Cassini,指定網站目錄,然后這個job就一直處在等待的狀態,我覺得這就到結果了吧,相當於在Jenkins的進程中開啟了一個Web服務,此時在瀏覽器中輸入http://localhost:9988/main.aspx(這里我是用的自己的webFrom網站)就可以訪問到你的頁面了。

但是,如果不手動結束這個Job,那么就會一直執行下去,當下一次被CIProjectWebDemo1-RunUnitTests運行結束的消息啟動,除非在配置里開啟並發執行,否則將會一直等待上一個進程的執行;而並發執行又會由於端口被占用,導致Cassini無法啟動,並使其崩潰。。感覺好亂。

作者寫這個例子的目的,可能是為了演示Job鏈吧。

后來想到,如果沒有使用Cassini,而是用其他的web服務器來啟動網站,可能就不會存在這種問題了。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM