編碼規(guī)范也可以作為非常有效的培訓(xùn)支持和指導(dǎo)活動,尤其對于那些經(jīng)驗不足的開發(fā)人員。CI工具可以提供這些數(shù)據(jù)如何隨著時間的推移而變化的高層次圖片,還可以關(guān)注開發(fā)人員在應(yīng)用他們學(xué)到的技巧時做得有多好。例如,如果一個類只有很低的代碼覆蓋率,甚至沒有,意味著某個新的開發(fā)人員在消化吸收小組培訓(xùn)的測試驅(qū)動開發(fā)和測試實踐上出現(xiàn)了問題。這種方法還可以通過代碼審查和定期的代碼質(zhì)量會議(討論任何新問題或者動向的會議)完成。

  一旦構(gòu)建結(jié)束??自動化部署過程

  構(gòu)建應(yīng)用程序只是開發(fā)生命周期中的一部分。一旦代碼編譯測試后,需要進行其他的活動,例如部署到階段性(staging)環(huán)境、冒煙測試、功能測試和性能測試、準備發(fā)布說明和提醒QA人員新的發(fā)布。

  將新的構(gòu)建結(jié)果自動部署到集成服務(wù)器上是一件相對簡單的事情。而將其部署到階段性環(huán)境或者生產(chǎn)環(huán)境下,則需要涉及一些與常規(guī)構(gòu)建作業(yè)不一樣的工作。一般而言你需要一個更加嚴格,更加正規(guī)且有更多可跟蹤性和問責(zé)的過程。它通常涉及到的任務(wù)如下:

  * 為階段發(fā)布標記源代碼

  * 編譯測試應(yīng)用程序

  * 發(fā)布構(gòu)建產(chǎn)品

  * 將應(yīng)用程序部署到階段性環(huán)境中

  * 運行數(shù)據(jù)庫更新腳本或者其他特定環(huán)境腳本

  * 運行冒煙,功能和性能測試

  * 準備并發(fā)布產(chǎn)品說明

  * 提醒關(guān)于新階段發(fā)布的相關(guān)利益人

  這通常是一個手工任務(wù),但是其中的大部分工作沒有理由不能自動化。事實上,開發(fā)生命周期中的自動化包裝,部署和發(fā)布具有很穩(wěn)固的商業(yè)意義。一方面自動化能夠得到更加可靠的構(gòu)建:計算機不會忘記部署過程中的某一步,也不會在發(fā)生測試失敗后繼續(xù)進行。它還能夠節(jié)約開發(fā)人員的時間:階段性發(fā)布由之前幾小時的 shell腳本編程變?yōu)榱酥灰c擊一下按鈕。它比以前的速度要更快,并且可以在沒有人的情況下完成工作(例如,通宵或者午休時間)。

  像Maven 2這樣的工具也能夠幫助自動化一些步驟。Maven Release插件使得Maven的用戶能夠自動化處理一些如“更新版本號”,“Subversion中新增標簽”,以及“向Maven存儲庫中發(fā)布構(gòu)建產(chǎn)品”的工作。它可以用來管理階段構(gòu)建,并決定在不同的環(huán)境部署不同的發(fā)布產(chǎn)品。盡管如此,一旦產(chǎn)品構(gòu)建結(jié)束并且可以部署到階段性環(huán)境者生產(chǎn)環(huán)境時,這個過程會變得更復(fù)雜。

  千真萬確,現(xiàn)實世界中的部署步驟數(shù)目經(jīng)常要比簡單的用一個WAR文件多。根據(jù)應(yīng)用程序架構(gòu)和產(chǎn)品平臺,你可能需要在階段性環(huán)境者生產(chǎn)環(huán)境下的數(shù)據(jù)庫中運行SQL更新腳本、用一個專用的工具部署web服務(wù)、運行自動化的冒煙測試或者做一定量服務(wù)端的工作。

  CI可以幫助簡化比這些還要復(fù)雜的步驟。例如通過分布式構(gòu)建,你可以設(shè)立階段性環(huán)境或生產(chǎn)環(huán)境上的構(gòu)建代理,并在該機器上直接運行相應(yīng)的任務(wù)。幾乎所有的 現(xiàn)代CI工具都支持相當(dāng)好的安全模型,目的是為了將應(yīng)用和產(chǎn)品環(huán)境限制給一些特定的人,以及跟蹤誰在什么時間運行了什么構(gòu)建。

  這是CI的一個相對較新的應(yīng)用,不同的工具在處理應(yīng)用程序部署時使用的方法也不一樣。有一些,如Hudson,允許在構(gòu)建作業(yè)中定義多個步驟,只有當(dāng)前一 個步驟成功后,才能執(zhí)行后續(xù)步驟。其他的像Cruise和Anthill Pro,都嘗試將部署生命周期中的如階段和生產(chǎn)環(huán)境直接集成到構(gòu)建工具中,盡管有時候這樣會帶來額外的復(fù)雜度開銷。

  還有更多低層次的操作可以和CI服務(wù)器聯(lián)合起來使用。一個選擇是使用諸如Ant或者Maven的構(gòu)建工具。Ant對于這種類型的腳本特別靈活。另一個流行的選擇是古老的Makefile,或者Unix上的shell腳本。它們的缺點是操作系統(tǒng)相關(guān)的,并且對于那些不熟悉shell腳本精髓的Java 開發(fā)人員來說很難掌握。想要與Java更加友好,可以選擇動態(tài)語言諸如Groovy或者Gant(一個使用Groovy而不是XML來制作Ant腳本的工具)。 Groovy在提供所有輕量級的動態(tài)腳本語言中所有的優(yōu)點的同時,也保留了對Java開發(fā)人員的熟悉程度和可讀性。

  總結(jié)

  這些只是使用現(xiàn)代持續(xù)集成環(huán)境完善構(gòu)建過程和增強團隊的幾個方法。持續(xù)集成環(huán)境不僅僅是一個構(gòu)建計劃表,它還可以用來幫助打開隊伍內(nèi)部的溝通渠道、保持構(gòu)建過程平穩(wěn)有效的運行、時刻監(jiān)控代碼質(zhì)量以及自動化發(fā)布和部署過程。