使用 Hudson 進行持續整合

來源:互聯網
上載者:User
使用 Hudson 進行持續整合

安裝和配置 Hudson 持續整合引擎以持續構建和測試 Oracle ADF 應用程式的基礎知識。

作者:John Stegeman

2010 年 3 月發布

 

兩個或更多的開發人員就一個項目協同工作時會將多個開發人員的代碼整合在一起,如果某個開發人員的代碼有不良的影響或代碼之間發生互動,就可
能會出現問題。在“傳統”開發環境下,各個開發人員可能會在較長的時間內獨立完成各自的代碼編寫工作,這些代碼整合問題可能在實際編寫代碼之後很長時間才
被發現,與在開發週期早期發現這些問題相比,這樣會加大識別和解決這些整合問題的難度。為瞭解決這一滯後問題,應運而生了一種稱為持續整合(即
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 資訊庫中新提交的更改觸發
  • 採取的操作:構建應用程式的 Model
    UI
    項目,編譯 ModelTests
    項目,執行 AllOTNAppModuleTests 測試套件
  • 在構建和測試之後:發布 JUnit 測試結果

此作業將展示 Hudson 的準系統。我們建立好該作業之後,將看一下如何使用 Hudson 的外掛程式在該作業中添加更多功能。首先,轉到 Hudson 首頁,該頁面位於 http://<您的主機名稱>:8080
。我們很容易就可以開始:該 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 中並通過
網頁瀏覽器訪問它。對於我的測試來說,我在自己的 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 論壇是一個很棒的論壇,在那裡,您既可以尋求協助(記住首先要搜尋一下)又可以協助他人。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.