菜鳥瞭解Hudson CI--什麼是CI/Hudson?怎樣安裝?怎樣使用?

兩個或更多的開發人員就一個項目協同工作時會將多個開發人員的代碼集成在一起,如果某個開發人員的代碼有不良的影響或代碼之間發生交互,就可能會出現問題。在“傳統”開發環境下,各個開發人員可能會在較長的時間內獨立完成各自的代碼編寫工作,這些代碼集成問題可能在實際編寫代碼之後很長時間才被發現,與在開發週期早期發現這些問題相比,這樣會加大識別和解決這些集成問題的難度。爲了解決這一滯後問題,應運而生了一種稱爲持續集成(即 CI)的新的開發技術。在 CI 環境下,在開發過程的早期並且常常是在開發過程中即將多個開發人員的代碼集成在一起進行共同測試。這有助於開發人員在開發出代碼後不久即可發現問題,而此時開發人員對導致問題的代碼還記憶猶新,從而可以更加快速地糾正這些問題。此外,及早發現問題可防止問題擴大,防止問題變得更復雜、更難以解決,防止產生更爲高昂的問題診斷和解決成本。

由於構建和測試應用程序的工作會佔用大量資源,因此採用 CI 通常意味着採用一種工具來自動進行應用程序的構建和測試。在互聯網上快速搜索一下即可發現衆多的 CI 服務器,截至本文撰寫之日,有關 CI 的 Wikipedia 文章有不下 35 種服務器示例!CI 服務器的工作原理是:等待某種觸發條件(如定期調度、開發人員請求,或者開發人員向版本控制系統提交代碼),然後執行一次應用程序的完全構建並運行相應的測試。使用此方法的項目組通常會遵循一個過程,該過程要求開發人員至少每天提交一次代碼。如果開發人員提交的代碼導致 CI 構建“中斷”(測試失敗或編譯失敗),通常會向該開發人員分派某項非預期的公共任務令其完成,從而促使其採取措施以避免構建中斷。甚至有一些有點奇特的硬件設備可公開顯示構建狀態,如閃光燈

在這麼多可以使用的 CI 服務器中,您如何進行選擇呢?對於基於 Java 的項目來說,有幾種常見的選擇

  • Cruise Control — 開源、圍繞 Ant 構建。常用,但用戶常反映其難以配置、需要編寫配置文件。Cruise Control 又稱爲用於 Java 的“原始”CI 工具。
  • Apache Continuum — 開源、用於構建 Java 項目。由於它是 Maven 的官方構建工具,往往對基於 Maven 的項目提供最好的支持和體驗。其管理和配置通過一個基於 Web 的界面進行。
  • JetBrains Team City — 一種常用的商業 CI 服務器。Team City 的一個獨有的特性是,它具有針對幾種 IDE 的相應插件,這些插件使開發人員可以在將其更改提交版本控制系統時進行“預測試”提交 — 使用此功能意味着開發人員不可能“中斷程序的構建”。其管理和配置通過一個基於 Web 的界面進行。
  • Hudson — 開源、原先只支持 CVS 和 Subversion,但現在具有許多插件可支持其他版本控制系統。其管理和配置通過一個基於 Web 的界面進行。

對於本文,我之所以選擇使用 Hudson 有以下兩個原因:第一個原因是,它是一個使用非常廣泛的系統,因此,它有着廣大的用戶羣和豐富的插件(在本文稍後,您會看到插件是多麼有用)。第二個原因是,與 Cruise Control(雖然也是廣泛使用)不同,Hudson 的安裝和配置相當容易。

 

下載和安裝 Hudson



Hudson 被公認爲十分易於安裝。Hudson 的下載只是一個 Web 存檔 (WAR) 文件,可從 Hudson 主頁下載(截至本文撰寫之日,最新版本是 1.332)。將該文件存放到一個方便的位置。由於 Hudson 作爲 WAR 文件提供,您可將它部署到一個已有的合適的 servlet 容器中。然而,Hudson 自帶了一個集成的 servlet 容器,因此您只需運行 java –jar Hudson.war 命令即可啓動 Hudson。這一功能使我們可以非常輕鬆地開始運行 Hudson。對於本文,我們不需要特性全面的 servlet 容器可提供的任何安全性或其他特性,因此我們只使用上述命令運行 Hudson。啓動 Hudson 後,即可通過 URL http://<您的主機名>:8080 訪問它。默認安裝不需要用戶登錄,任何人都可以創建、修改或刪除 Hudson 作業,顯然這不適合生產目的。Hudson wiki 有一個頁面描述瞭如何配置安全性,但在本文中,我們將繼續使用默認配置,即不受保護的配置。

Hudson 的使用方案



在本文中,我們將配置 Hudson 執行以下兩種常用方案:
  • 每當開發人員將更改提交至 Subversion 信息庫時,Hudson 會編譯所有代碼,執行 JUnit 測試,然後生成應用程序的 WAR 文件。此過程中任何失敗(編譯錯誤或單元測試失敗)都會導致構建“中斷”。該構建應快速執行,這樣開發人員在將更改提交 Subversion 後幾乎可立即得到反饋;爲此,我們將不對該作業執行 UI 測試。
  • Hudson 將定期(每天一次)執行和上面相同的任務(編譯、測試、生成),將應用程序的 WAR 文件部署到正確配置的 Oracle WebLogic Server,然後運行以前使用 Selenium 創建的 UI 測試(有關如何使用 Selenium 創建 UI 測試的詳細信息,可以參閱本系列中的 Selenium 一文)。和上一種方案一樣,任何失敗(包括 UI 測試失敗)都會導致構建“中斷”。我們還可以手動請求 Hudson 執行此方案,這樣我們就不必等到定期調度時間就可以看到 Hudson 的運行了。

我們將使用本系列較早的文章中開發的 Oracle Application Development Framework (Oracle ADF) 11g 應用程序、單元測試和 UI 測試。如果您沒有跟隨學習本系列文章,可以從這裏下載源代碼:oracle.com/technology/pub/files/adf-development-essentials-sample.zip。對於本文,我還從 VisualSVN Subversion 信息庫中刪除了“everyone”訪問,要求訪問時提供登錄憑證,這樣我們可以看到其工作方式。如果您這麼做,我建議您在 Subversion 服務器中專門爲 Hudson 創建一個用戶,這樣 Hudson 可執行的任何操作(如對一個構建進行標記)將被記錄爲由 Hudson 完成。如果您的信息庫是不受保護的,則可跳過這些提供憑證的相關步驟。

 

初始構建服務器和 Hudson 配置



爲使 Hudson 能夠構建我們的應用程序並對其進行測試,運行 Hudson 的計算機需要安裝一個 Java Development Kit (JDK)(用於對項目進行編譯)、一個 Ant 安裝(安裝了合適的 Ant 庫以便構建 Oracle ADF 11g 應用程序),以及運行於同一計算機上的 Selenium RC 服務器(用於執行 UI 測試)。一般來說,Hudson 服務器不應安裝在開發人員的計算機上,而應安裝在一臺專門用於進行 CI 構建和測試的計算機上。由於我們已將應用程序配置爲可通過 Ant 構建,並且 Subversion 下具備所有需要的庫,因此不必在 CI 服務器中安裝 Oracle JDeveloper 11g 的一個副本了。當然,爲了學習的需要,您可以在一臺計算機上安裝所有組件;然而,就本文而言,我將在另一臺計算機(實際上是一個虛擬機)上安裝 Hudson,目的是向我自己證明 CI 服務器確實不需要安裝 Oracle JDeveloper,並且向您說明新服務器上需要安裝哪些組件。我的環境如下所示:

 

開發人員使用的便攜式計算機 (Windows Vista)
計算機名:jstegema-lap
安裝了 Oracle JDeveloper 11g
安裝了 Oracle Database 11g 和 Visual SVN(用於測試)
CI 服務器(虛擬機)
計算機名:jstegema-lnx
安裝了 OpenSUSE 11.2RC2 和 Hudson

在 CI 服務器上,我們需要的第一個組件是能夠運行 Hudson 的 JDK。我的 CI 服務器上已經安裝了一個 JDK,這對於 Hudson 的運行來說是件好事,但作爲編譯 Oracle ADF 11g 應用程序所使用的 JDK,它稍微有點過時了。儘管 Hudson 能夠自動下載並安裝 JDK 和各種版本的 Ant,但這個過程確實需要進行一點配置。因此,對於本文,我將手動下載並安裝最新的 JDK。而對於 Ant,您可能還記得我們在本系列的 JUnit 一文中講過,需要將一些 JAR 文件從 Oracle JDeveloper 安裝中複製到 Ant 的 library 目錄中,因此我們無法使用自動安裝功能,必須親自安裝 Ant 並複製各個庫。

爲了安裝 Ant,只需從 Ant 網站下載,將其解壓縮至 CI 服務器上一個合適的目錄。如 Ant 一文中所述,我們需要從 Oracle JDeveloper 11g 安裝中將 junit.jar 和 ant-weblogic.jar(這些文件在 <安裝目錄>/jdeveloper/ant/lib 下)複製到您已下載並解壓縮的 Ant 的 lib 目錄中。

下一步是告訴 Hudson 我們打算使用的 JDK 和 Ant 安裝。幸運的是,所有 Hudson 配置都通過一個 Web 界面進行並且相當簡單。首先,在瀏覽器中訪問 Hudson URL(默認)並單擊 Manage Hudson 鏈接。然後,在 Manage Hudson 頁面中,單擊 Configure System。在此頁面中,您可以配置 JDK 和 Ant 這兩個安裝。首先,在 JDK 區域中,單擊 Add JDK 按鈕。取消選中 Install Automatically 複選框,提供一個易於記憶的名稱(我建議使用 JDK 的版本作爲名稱)並提供 JDK 的安裝位置。我的系統上的配置如下所示:



圖 1:JDK 配置

接下來,重複上述過程以添加一個 Ant 安裝。下面是我的配置:



圖 2:Ant 配置

單擊 Save 按鈕保存該配置。現在,您創建 Hudson 作業時即可使用已配置的 JDK 和 Ant 安裝了。
創建一個提交觸發構建和測試的作業

我們首先創建一個 Hudson 作業,該作業有以下特點:

  • 觸發:該作業由 Subversion 信息庫中新提交的更改觸發
  • 採取的操作:構建應用程序的 ModelUI 項目,編譯 ModelTests 項目,執行 AllOTNAppModuleTests 測試套件
  • 在構建和測試之後:發佈 JUnit 測試結果

此作業將展示 Hudson 的基本功能。我們建立好該作業之後,將看一下如何使用 Hudson 的插件在該作業中添加更多功能。首先,轉到 Hudson 主頁,該頁面位於 http://www.360doc.com/content/10/0706/16/。我們很容易就可以開始:該 Hudson 頁面中央向您發出這樣的邀請,“please create new jobs to get started”。此時單擊 create new jobs 鏈接。接着,Hudson 讓您指定作業名稱並選擇要創建的作業類型。我們以 Build and Test OTN Trunk 作爲該作業的名稱(我們將從 Subversion 中的“trunk”項目構建),該作業類型爲“free-style software project”(用 Hudson 的術語說)。填入相應信息,然後單擊 OK



圖 3:新作業的信息

在出現的下一個屏幕中,您將進行整個作業自身的配置。如果您願意,在所提供的域中爲該作業提供一個說明。在這裏,我們並不會對作業屏幕上的每個選項的用途都加以解釋,而只是看一看爲了配置該作業至少需要哪些選項。爲了指定運行 Ant 任務時使用哪個 JDK,我們將該構建配置爲 Hudson 中參數化的構建,並添加一個字符串參數以設置 JAVA_HOME 參數的值。爲此,選中 This build is parameterized 複選框,使用下拉列表添加一個名爲 JAVA_HOME 的字符串參數,令其值指向您系統中相應的 JDK,如下所示:



圖 4:設置該構建作業的 JAVA_HOME 參數

我們需要提供的下一項是 Source Code Management (SCM) 信息。由於我們使用 Subversion,因此可單擊 Subversion 單選按鈕查看 Subversion 的相關選項。我們需要提供的唯一一項信息是我們要從其中進行構建的 Subversion URL。提供在您的環境下該應用程序的“trunk”項目的 URL。我這裏是 http://hostname/svn/otn/trunk。



圖 5:該作業的 Subversion URL

從屏幕截圖中可以看出,Hudson 立刻就知道了該 Subversion 信息庫是受保護的。單擊 enter credential 鏈接,提供該信息庫的用戶名和口令。在新打開的窗口中,提供正確信息後單擊 OK。我這裏是這樣的:



圖 6:Subversion 身份驗證

接下來,我們需要設置一個構建觸發器。我們說過我們希望 CI 作業在開發人員向 Subversion 提交更改時運行。對此,Hudson 有一個相應的選項:Poll SCM。單擊 Poll SCM 複選框之後,您就可以指定輪詢調度週期了。以 cron 作業所使用的格式指定該調度週期(有關詳細信息和示例,可單擊該域的 Help 按鈕獲取)。我們讓該作業每分鐘對新的提交進行一次輪詢,這樣我們就不必等很長時間才能看到系統的反應了:



圖 7:SCM 輪詢調度

接着,添加我們希望 Hudson 在該構建過程中執行的一些步驟。根據我們對該作業的描述,我們希望讓 Hudson 執行下列 Ant 任務:

  • model.compile(編譯 Model 項目)
  • viewcontroller.compile(編譯 ViewController 項目)
  • ModelTests.allTests(執行 ModelTests 項目的 JUnit 測試套件)

我們來添加第一個構建步驟:單擊 Add build step 列表並選擇 Invoke Ant



圖 8:添加一個基於 Ant 的構建步驟

然後,您可以從列表中指定要使用的 Ant 版本。由於在我們的項目中有多個 Ant build.xml 文件,我們需要單擊 Advanced 按鈕告訴 Hudson 具體使用哪一個。應相對於 Subversion URL 的路徑來指定構建文件。因此,要讓 Hudson 在 Model 項目的 Ant build.xml 中執行 model.compile 任務,填寫如下信息:



圖 9:針對 model.build Ant 任務的構建步驟

接着,您可以按上述過程對另外兩個 Ant 任務再添加兩個構建步驟。對這兩個任務的配置如下:



圖 10:剩餘的構建步驟

配置該作業的最後一步是設置作業的任何構建後操作。通過查看各個選項您可以發現,您可以做很多的事情,如向某人發送電子郵件以讓其知道構建狀況,或者發佈 Javadoc。我們關注的是發佈 JUnit 測試結果。選中相應複選框,將 JUnit 測試結果的存放位置告訴 Hudson(同樣,使用相對於 Subversion URL 的路徑,Hudson 需要該路徑以“trunk”開頭):



圖 11:指定測試結果的位置

現在可單擊 Save 按鈕保存該作業。Hudson 將首次運行該構建作業。您可以單擊右上角的 ENABLE AUTO REFRESH 鏈接來查看構建進度。一旦構建開始,您會看到 Build History 小部件開始呈現動畫效果(如果 Hudson 沒有自動啓動構建,您始終可以單擊 Build Now 鏈接):



圖 12:構建狀態小部件

如果想監視構建詳情,可單擊該構建的鏈接,然後單擊 Console Output 鏈接以查看輸出。該控制檯視圖還非常有助於您理解構建失敗的原因(作業配置錯誤、編譯失敗等等)。例如,在重複進行的一次構建步驟中,我鍵入了錯誤的 Ant 任務,於是在控制檯視圖中看到以下信息:



圖 13:由於構建失敗而產生的控制檯日誌

當我返回 Hudson Dashboard 頁面時,看到我的作業狀態是失敗(以一個大紅球來指示)並且該項目的“天氣狀況”是暴風雨:



圖 14:暴風雨項目

希望您的第一個構建成功進行。一旦您改正了所有可能的錯誤並且構建成功,該信息板就開始呈現一個更妥當的畫面:



圖 15:更妥當的畫面

請注意,由於最近存在構建失敗,該項目的“天氣狀態”不會立即轉爲晴朗。一旦您進行了一連串成功的構建,您的項目就會轉爲晴朗宜人了。您可以單擊 Last Success 或 Last Failure 列中的任何鏈接來查看有關該構建的信息。例如,當我單擊上次成功構建的相關鏈接時,出現了有關該構建的狀態頁面:



圖 16:一個構建狀態頁面

通過該頁面,我可以查看到以下測試結果:



圖 17:測試結果

. . 甚至可以下鑽到各個測試:



圖 18:各個測試結果

要對觸發構建的能力進行測試,您可以在 Oracle JDeveloper 11g 中對應用程序進行一次更改後提交該更改。不久之後,您會在 Hudson 信息板中看到,Hudson 發現了該更改並啓動了構建過程:



圖 19:正在進行構建

一旦構建完成,如果單擊其構建號,可以看到一個說明該構建由某個 SCM 更改觸發的指示、開發人員提供的有關該次提交的註釋,甚至還可以看到一個 detail 鏈接,該鏈接可顯示出提交者和提交者所更改的文件:



圖 20:構建結果顯示出該構建由 SCM 更改啓動

爲了能夠運行 UI 測試,首先須將應用程序打包到一個企業存檔 (EAR) 文件,然後將其安裝到 Oracle WebLogic Server 上以便測試。此外,UITests 項目還需要一個運行 UI 測試的 Ant 腳本。對此過程的逐步詳細說明會使本文變得過長,因此我在此概要介紹一下這些步驟:

創建一個構建和 UI 測試調度作業



如果您有一個進行相應配置的 Oracle WebLogic Server 可以使用,您還可以使用這些方法來使用 Ant 和 Hudson 將應用程序部署到您的 Oracle WebLogic Server 上並使用 Selenium RC 執行 UI 測試。由於設置和執行 UI 測試可能會花費較長時間,多數人都不會在每次提交到版本控制系統後就調度執行此類作業,而是每天日或定期執行這類作業。本文將介紹如何創建和配置 Ant 腳本和 Hudson 作業以構建該應用程序、將其部署於當前運行的 Oracle WebLogic Server 並通過 Selenium RC 執行 UI 測試。本文不介紹如何配置 Oracle WebLogic Server,但假定您已使用 Oracle ADF 庫正確配置了一個域。爲了順利完成本文的學習,您應自我測試一下,看是否能將該應用程序部署到 Oracle WebLogic Server 中並通過 Web 瀏覽器訪問它。對於我的測試來說,我在自己的 Linux 虛擬機上安裝了 Oracle WebLogic Server 和所需的 Oracle ADF 庫。

 

  • 創建一個名爲 build 的新項目以存放所有應用程序級的構建構件。
  • 爲該構建項目創建一個 Ant 構建腳本。
  • 在該 Ant 構建腳本中添加一個 build.ear 目標以生成應用程序的 EAR 文件。使用對 WAR 文件所使用的技術(用 Oracle JDeveloper 生成並解壓縮以發現其結構)。
  • 在該 Ant 構建腳本中添加一個 build.deploy 目標以獲取該 EAR 文件並將其部署到 Oracle WebLogic Server。Oracle WebLogic Server 包含一個名爲 wldeploy 的 Ant 任務(有助於完成此任務),另外,此博客文章還介紹了一個無需首先運行 Oracle WebLogic Server 環境腳本即可使用此任務的方法。
  • 爲 UITests 項目創建一個 Ant 構建腳本。添加一個執行 UI 測試的任務(正確關聯到 build.deploy 目標)。
  • 將所有更改的代碼提交給 Subversion,以便 Hudson 可以訪問。

完成上述準備步驟後,您就可以創建該 Hudson 作業了。對該 Hudson 作業的配置十分類似於對您創建的第一個作業的配置,只是有以下不同:

  • 應調度該作業定期地,例如每天一次地執行,或者根據需要調度執行,而不是輪詢 SCM。

         

            圖 21:每天午夜時分執行該作業

  • 該作業包含一個構建步驟(執行 UI 測試)。

                   

  圖 22:針對 UI 測試的構建步驟

  • 該 JUnit 測試的結果將保存在另一個目錄中。

                   

  圖 23:發佈 UI 測試結果

創建該作業之後,確保 Oracle WebLogic Server 和 Selenium RC 啓動(如果願意,可以在 Ant 任務中添加步驟以啓動它們),然後執行該作業。如果您觀察構建服務器,最終會看到一個瀏覽器窗口彈出(這是 Selenium RC 所爲)並執行 UI 測試。如果一切正常,您會看到在 Hudson 信息板中出現了兩個“晴朗的”項目:



圖 24:兩個“晴朗的”項目!

總結

現在,您已具備了所有相應工具,能夠以團隊的形式有效地開發 Oracle ADF 應用程序,能夠使項目構建通過 Ant 自動進行、使單元測試通過 JUnit 自動進行、使 UI 測試通過 Selenium 自動進行,並能夠通過 Hudson 對您的應用程序進行持續的集成和測試了。希望您覺得這些文章對您有所幫助。

致謝

特別感謝 Timo Hahn 的幫助。起先我的應用程序在 Oracle JDeveloper 環境中運行良好但在獨立 Oracle WebLogic Server 上不能運行,他通過 OTN JDeveloper 和 ADF 論壇(很棒的論壇)幫助我進行調試,找出了其中的原因。請您記住,OTN JDeveloper 和 ADF 論壇是一個很棒的論壇,在那裏,您既可以尋求幫助(記住首先要搜索一下)又可以幫助他人。

John Stegeman (http://stegemanoracle.wordpress.com/) 是 Cambridge Solutions(一家跨國 BPO 和 IT 服務公司)的 EMEA 地區的 Oracle ACE 總監(Oracle 融合中間件)兼首席架構師。他從 1990 年開始就使用 Oracle 產品工作,從版本 3 開始就使用 Oracle JDeveloper 了。

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