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

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

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

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

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

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

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

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

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

  * 運(yùn)行冒煙,功能和性能測(cè)試

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

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

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

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

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

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

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

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

  總結(jié)

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