讀古今文學網 > Java程序員修煉之道 > 12.4 Jenkins:滿足CI需求 >

12.4 Jenkins:滿足CI需求

CI的成功要靠管理(開發紀律)和工具相結合。為了讓CI過程達到優秀的標準,Jenkins提供了很多必需的支持,如表12-2所示。

表12-2 衡量CI構建是否優秀的標準及Jenkins如何達成這些標準

標準Jenkins如何達成 自動構建Jenkins會在你需要的任何時間運行構建。它可以通過構建觸發器實現自動構建 一直測試Jenkins能運行任何你想要的目標,包括Maven的test。它有強大的測試失敗趨勢報告,只要有一個測試沒通過,它就會報告構建失敗 定期提交這是開發人員的事 每次提交都構建每次檢測到版本控制庫的新提交時Jenkins都可以執行構建 快速構建這對基於單元測試的構建更加重要,因為你想要它們有更快的往返時間。Jenkins可以把工作發送給從屬節點從而提高速度,但更主要的是開發人員做出精益的、有意義的構建腳本,並配置Jenkins在執行構建時調用恰當的構建週期目標 結果可視化Jenkins有基於Web的儀表板,還有一套發送通知的辦法

所有CI服務器都能輪詢版本控制資源庫,並執行構建週期目標compiletest。讓Jenkins脫穎而出的是它易於使用的UI和可擴展的插件生態系統。

在配置Jenkins和它的插件時,UI的幫助非常大,它經常會在你輸入完成後用Ajax檢查輸入的有效性。它還提供了大量的情景式幫助信息,運行Jenkins根本就不需要專業技能。

Jenkins的插件包羅萬象,幾乎可以輪詢任何版本控制資源庫,並且可以生成一系列非常有價值的代碼報告。

Jenkins和Hudson

在網上和某些書中,這個CI服務器的名字有些混亂。Jenkins實際上是Hudson項目最近出現的一個副本,主流的開發人員和活躍的社區現在都集中在Jenkins上。Hudson本身仍然是一個優秀的CI服務器,但相較而言Jenkins項目更活躍。

Jenkins是自由的開源軟件,其社區充滿活力,對新手幫助很大。

關於如何下載和安裝Jenkins,請參閱附錄D。完成下載和安裝後,馬上回來繼續!

警告 假定你會把Jenkins的WAR文件裝到Web服務器上,那麼Jenkins安裝的根URL是http://localhost:8080/jenkins/。如果是直接運行WAR文件1,根URL應該是http://localhost:8080/。

1 指運行java –jar Jenkins.war。——譯者注

本節會討論Jenkins安裝的基礎配置,然後是如何設置、執行構建任務。我們會以java7developer項目為例,但你可以隨意選用自己喜歡的項目。

為了讓Jenkins監測源碼資源庫並執行構建,需要先配置基礎設置。

12.4.1 基礎配置

我們會從Jenkins的主頁http://localhost:8080/jenkins/開始。要配置Jenkins,請點擊左邊菜單中的Manage Jenkins(管理Jenkins)鏈接(http://localhost:8080/jenkins/manage)。管理頁中列出了很多設置選項。

現在,選擇Configure System(系統配置)鏈接(http://localhost:8080/jenkins/configure)。你應該能進入類似於圖12-2的界面中。

圖12-2 Jenkins配置頁

從界面的頂部可以看到Jenkins的home目錄的位置。如果需要在UI之外進行配置,可以到這個目錄中去。

提示 如果你是為團隊安裝Jenkins,並且需要考慮安全性,應該選中Enable Security(安全保護)和Prevent Cross Site Request Forgery Exploits(阻止跨域攻擊請求)多選框,並進行相應的配置。對初學者來說,用Jenkins自身的數據庫最容易。以後你可以隨時切換到企業LDAP上,或基於Active Directory(活動目錄)進行認證和授權。

為了執行構建,Jenkins需要知道構建工具放在哪裡。這還要在配置頁中設置,找到單詞「Maven」。

1. 構建工具配置

Jenkins內置了對Ant和Maven(可以用插件支持其他構建工具)的支持。在java7developer項目中,我們用的是Maven(在Windows上),所以對Jenkins的配置如圖12-3所示。

圖12-3 設置構建工具Maven

注意,Jenkins有一個自動安裝Maven的選項,在沒裝Maven的機器上,這個選項還是挺方便的。

現在Maven配置好了,需要告訴Jenkins你用什麼版本控制資源庫。這在配置頁的下面。找到單詞SVN。

2. 版本控制配置

Jenkins內置了對CVS和Subversion(SVN)的支持。像Git和Mercurial這樣的版本控制系統也有插件。java7developer項目用SVN 1.6,配置如圖12-4所示。

圖12-4 SVN版本控制配置

在設置好這些配置後,點擊屏幕底部的Save按鈕,以確保這些配置會被保存下來。

現在Jenkins的基礎設置已經做好了,可以創建你的第一個任務了。

12.4.2 設置任務

要設置新任務,請回到儀表板中並點擊左手菜單的New Job(新任務)鏈接,進入任務設置頁面(http://localhost:8080/jenkins/view/All/newJob)。這裡有很多選項可供選擇。

要設置一個任務來構建java7developer項目,先要給任務確定一個標題(java7developer),選擇Build a Maven 2/3 Project(構建一個Maven 2/3項目)選項並點擊OK按鈕繼續。你應該會進入一個類似圖12-5的配置界面。這裡有一些輸入項要填,但下面這些應該是你先填好的內容:

  • 源碼管理;
  • 構建觸發器;
  • 構建。

圖12-5 Maven 2/3任務配置頁面

我們從源碼管理的配置開始。

1. 源碼管理

源碼管理主要設置要構建的源碼來自版本控制的哪個分支、標記或標籤。隨著你的團隊向版本控制系統中穩步添加源碼,它就是持續集成中的「集成」。對於java7developer項目,我們用SVN構建主幹中的源碼。設置如圖12-6所示。

圖12-6 java7developer源碼管理配置

一旦告訴Jenkins從哪裡獲取源碼,接下來要配置的就是Jenkins應該隔多長時間構建一次,這是通過構建觸發器完成的。

2. 構建觸發器

構建觸發器把「持續」引入了持續集成。你可以要求Jenkins在源碼控制庫每次有新提交時就進行構建,或者採用更悠閒的方式,設為每日構建一次。

我們對java7developer項目的設置,只是要求Jenkins每隔15分鐘輪詢SVN一次,如圖12-7所示。

圖12-7 java7developer構建觸發器配置

你可以點擊輸入項旁邊的幫助圖標(表示為?)查看幫助信息。在這個例子中,編寫類似cron的表達式來指定輪詢週期時你可能需要幫助。

到這個階段,Jenkins已經知道了到哪裡去找源碼,隔多長時間構建一次。接下來就該告訴Jenkins應該執行哪個構建階段(構建腳本中的目標或目的)。

3. 構建

用Jenkins可以設置很多任務來執行構建週期的不同階段。你可能想要一個每晚執行一次完整的系統集成測試的任務。但更多情況下,你可能想要執行頻率更高的任務,在每次有新的源碼提交到版本控制系統時編譯源碼並運行單元測試。

對於java7developer項目,我們要求Jenkins執行Maven的cleaninstall目標,如圖12-8所示。

圖12-8 Java7developer任務中要執行的Maven構建目標(cleaninstall

Jenkins現在有java7developer項目的所有信息了,它可以每隔15分鐘輪詢一次SVN代碼庫的主幹,執行Maven的cleaninstall目標。不要忘了點擊Save按鈕把任務存下來!

現在可以回到儀表板,在那裡看看你的任務,它應該非常像圖12-9。

圖12-9 有java7developer任務的儀表板

在Last Success (S)一欄(最近一次成功),圓形圖標表示任務最後一次構建的狀態。在Weather (W)(天氣)一欄,天氣圖標表示項目的總體健康狀況,它是由構建失敗的頻率、測試是否通過,還有一系列其他可能情況(取決於你配置的插件)決定的。要進一步瞭解這些圖標的含義,請點擊儀表板中的Legend(圖例)鏈接(http://localhost:8080/jenkins/legend)。

現在任務已經準備好了,你可能想看看它運行起來是什麼樣!你可以等15分鐘後的第一次輪詢,也可以強制執行一次構建。

12.4.3 執行任務

要檢查新配置,強迫任務執行是個好辦法。對於java7developer任務,只要到儀表板中,點擊Schedule a Build(調度構建)按鈕(在Last Duration旁邊帶綠色箭頭的鐘錶圖標)。然後你就能刷新頁面去看看構建的執行結果了。

提示 點擊儀表板右上角的Enable Auto Refresh(允許自動刷新),可以讓儀表板自動刷新。這樣你就可以及時看到當前構建的狀態了。

在構建執行時,java7developer任務的第一個圖標會閃,表明構建正在處理中。在頁面左側還能看到Build Executor Status(構建執行器狀態)。構建一完成,Last Success (S)(最近一次成功)一欄那個圓形圖標就變成了紅色,表明構建失敗了。

這個失敗是因為漏掉了build.properties文件。如果你閱讀12.2節時沒按照書中的指示做,現在也可以很快解決掉這個問題,找到build.properties文件樣本,編輯它,以便能找到要用到的Java 7 JDK。下面是在Unix上執行這些操作的例子:

cd $USER/.jenkins/jobs/java7developer/workspace/java7developer
cp sample_build_unix.properties build.properties
  

現在你可以回到儀表板中,再次手工運行構建。這次構建應該能成功,並且儀表板中java7developer任務的Last Success(最近一次成功)一欄應該是個藍色圖標,表示構建成功了。

你還可以馬上去看一下構建的測試報告,因為Jenkins知道如何讀取Maven產生的輸出。要看測試結果,可以點擊java7developer任務Last Success一欄的鏈接(http://localhost:8080/jenkins/job/java7developer/lastSuccessfulBuild/)。該鏈接會將你帶入Latest Test Result(最新測試結果)頁面,其界面如圖12-10所示。

圖12-10 java7developer成功構建的測試結果

測試全部通過,非常棒!如果有任何一個失敗,你可以深入瞭解每個測試的細節。

我們對運行失敗和成功構建的基礎都進行了總結。對於java7developer項目來說,Jenkins會繼續輪詢SVN並在發現新提交時執行新構建。

你已經見過Jenkins如何運行構建,構建因不同原因失敗時如何在界面上發出警告,如何檢查測試成功或失敗。但Jenkins可以做得不止這些,它還能給出一系列實用的代碼指標,讓你對代碼的質量有更深入的認識。