轉自:http://www.ibm.com/developerworks/cn/java/j-lo-jenkinsintegrate/
Jenkins 是一種易於使用的持續集成系統,它可以使開發者從繁雜的集成過程中解脫出來,專注於更為重要的業務邏輯實現。同時 Jenkins 能實施監控集成中存在的錯誤,提供詳細的日志文件和提醒功能,還能用圖表的形式形象地展示項目構建的趨勢和穩定性。本文主要介紹了傳統開發中的存在的一些問題及 Jenkins 在開發流程中的優勢,並用實例為大家詳細介紹了自動化持續集成的開發步驟。
傳統開發流程存在的一些問題
開發團隊在日常工作中,主要是圍繞着需求、編碼、代碼提交、打 build、分配環境、安裝 build、BVT(Build Verification Test)、發現 defect、修復並提交新代碼,然后重復進行打 build 到 BVT 測試的工作,在這個過程中,大部分工作的串連還是需要人工進行操作,且軟件開發周期比較漫長。
對於以上存在的問題,分析起來主要有以下幾個原因:
首先,傳統的開發團隊中需要一個專門從事 build 構建的人員,負責整個開發團隊的代碼集成,並打包成應用程序,再進行 BVT。這個過程非常耗時,重復性高,周期長。因為 build 構建的人員需要等待所有開發人員完成代碼的交付后才可以進行這部分的工作,而在實際開發過程中,往往在代碼交付前還存在一些問題,不但使得 build 構建的工作需要加班或者延期,且這樣等待完成的 build 再拿到測試部門進行測試,開發人員再進行缺陷修復,再到產品交付,整個軟件開發周期會耗用更多時間。
其次,每次構建 build 的過程中,雖然構建 build 本身是可以實現代碼自動化的,但是在做完 build 后需要上傳到一個公共的地址,再分配環境進行安裝。安裝完成后的 BVT,需要在每次 build 構建后反復的一次次進行,這些過程包含了太多流程重復及人工資源占用。
面對以上存在問題,我們使用 Jenkins 持續集成卻可以實現整個流程的自動化,即自動構建 build,上傳到指定地址,再下載安裝包到指定的環境中進行安裝,並進行 BVT 測試。這個流程可以設置每日定時進行,這樣就可以加快整個開發過程,使得每個開發人員更好的掌握和控制開發流程。
Jenkins 是什么?
簡單的說,Jenkins 是一種基於 Java 開發的持續集成工具,前身稱作Hudson,它是一個開源軟件項目,提供了用於監控持續重復工作的軟件平台。Jenkins 發布和運行的形式都很簡單,您可以去 Jenkins 官網下載安裝包后,只需一個“java -jar jenkins.war”命令就能將其運行起來。
Jenkins 持續集成在開發流程中的優勢
持續集成開發的流程相對於傳統方法有很多不同,在軟件開發流程中有很多優勢:
第一,快速迭代。
由於 Jenkins 集成開發開發過程中,整個流程能實現自動化,每日可以自行生成新的 build,在軟件項目被分成多個子項目后,這些子項目可能是一些獨立運行的小項目,也可能是互相聯系的。由於每個功能可以一點點的加在 build 中,那么這樣就能保證每次的新 build 可以交付新的功能,保障測試人員能一直有最新的 build 進行測試,從而使產品的缺陷能夠在更早的時間里被發現,開發人員修復起來也更加容易,甚至可以在修復產品的過程中避免后續可能隨之產生的問題,確保產品在整個的開發過程中更加積極、有效。同時,通過快速迭代,開發人員可以對產品的用戶和市場趨勢保持較強敏感度,且產品也在不斷的迭代中愈加成熟,可以使用戶持續保持最好體驗感;
第二,適應變化。
由於持續集成開發過程中代碼是每日集成生成 build, 產品功能是逐步增加的,這樣使得開發人員可以積極應對軟件需求的多變性。根據用戶的需求可以隨時增加新的功能而不會對整個項目產生過多的影響,根據用戶的反饋情況及時調整開發方向,降低項目風險,保證市場競爭力。這樣,通過用戶的評價和反饋來更好的完善、適應市場變化而生產出的產品才是最有生命力的產品,Jenkins 持續集成開發流程,無疑給實驗室的開發人員提供了不少的見解與幫助;
第三,建立團隊信心和提高開發人員的創新能力。
傳統的開發流程需要在項目經理的管理下,嚴格地按照計划進行,長期過程中,這種模式會限制開發成員的創新能力。Jenkins 集成開發可以持續不斷的發現問題,測試和驗證功能模塊的開發程度,增強開發人員對整個開發過程的了解和信心,同時還能快速實現開發人員的創新想法,及時在用戶那里得到反饋,並且還可以在迭代的過程中不斷優化。這些都可以帶給開發人員更多的機會嘗試和信心鼓勵,對於產品的最終完成起着非常重要的作用。
綜上所述,這些優勢給整個軟件開發團隊帶來的好處是不可小覷的。那么如何將 Jenkins 自動化持續集成應用到開發流程的實際工作中呢?下面我們通過一個示例來演示具體的操作步驟。
Jenkins 自動化持續集成開發的步驟
安裝 Jenkins
關於如何下載並安裝的內容在上文介紹 Jenkins 部分已經有交代過,在此不再重復闡述。然而,需要注意的是,在安裝前,需要檢查機器的 JRE 版本是否在 1.6 或以上,若不是,需要升級或下載新版本后才能保證 Jenkins 的正常運行。
啟動 Jenkins
通過命令行進入安裝包所在的目錄,運行“java - jar jenkins.war”命令來啟動 Jenkins。成功啟動后的界面狀態如下圖所示。
圖 1. Jenkins 成功啟動
訪問 Jenkins
訪問 Jenkins 的方式分為兩種:第一種是在安裝 Jenkins 的機器上訪問,即 master 上直接訪問,使用的地址為:http://localhost:8080;第二種是在其它任何一台機器上遠程訪問,使用的地址為:http://IP:8080,這里的 IP 是指 Jenkins 安裝所在的機器 IP 地址。在實際應用中,用戶可以根據需要任意選擇一種訪問方式,而且,多個不同的用戶可以同時訪問一個共同地址互不干擾地進行自己的操作,可以說 Jenkins 提供的這種訪問方式給用戶帶來了很大的便捷。
建立 Jenkins 自動化持續集成項目
建議開發部門可以選用一台固定的物理機或者虛擬機作為安裝 Jenkins 的機器,機器需要有連接外網的功能,這樣方便下載和更新一些需要使用的插件。
安裝插件
一般情況下,常使用到如下這些插件:
vSphere Plugin:針對那些使用了 vSphere 虛擬化的基礎設施,這個插件提供了實現“雲”功能的工具。
SSH Plugin:這個插件使用 SSH 協議執行遠程 shell 命令。
RTC Plugin:這個插件集成了 IBM 的 Rational Team Concert(RTC) 與 Hudson。
Team Concert Plugin:集成了 Rational Team Concert。
Multijob Plugin:這個插件是一個將多個項目連接在一起的插件。
建立項目一:Request Build
即從統一代碼庫下載最新代碼,自動構建應用程序包,上傳到統一的地址。
構建程序包有兩種方法,一種是使用 RTC Plugin 和 Team Concert Plugin 來連接開發人員代碼所在的統一代碼庫。我們可以創建一個 Job,選擇 Job 類型是 Build a free-style software project,將 Project name 命名為 Request Build,並選擇在 master 上執行這個 Job。采取這種方式的時候,需要在 Job 進行配置之前,進入 Configure System 配置系統信息,如下圖所示:
圖 2. 系統配置中 RTC 的信息
系統信息配置完成后,再對 Request Build Job 進行設置。Source Code Management 配置的信息如下圖所示:
圖 3. 項目 Request Build 中 Source Code Management 的配置
這種方式中的代碼資源管理是通過開發人員使用自己的賬戶連接到 RTC,從 RTC 抓取最新代碼到 master 上的 Jenkins 目錄中,Jenkins 會創建一個 workspace 來存放這些代碼。
接下來,再將抓取的代碼在 master 上自動構建成應用程序包,需要使用到 build XML 文件和相關的屬性信息。然后,繼續在 Request Build Job 的 Build 選項中進行設置,如下圖所示:
圖 4. 項目 Request Build 中 Ant 相關的配置
上圖中設置的 Properties 信息只是一個示例,讀者需要根據 build 過程中使用的具體值來進行修改。
到這里,項目一設置完成,保存后點擊 Build now 按鈕就可以 kick off Build 了。至此,我們講的都是采用第一種方式來完成項目一的任務。然而對於第二種方式,簡單來說,就是將 Jenkins 代碼管理的工作用命令來實現,這涉及到構建程序包的開發人員的工作內容,不是本文的重點,故而不詳細敘述如何來寫這樣的命令,讀者有興趣可以自行研究。
由於第二種是利用已經完成的,包含着能實現代碼管理和構建程序包命令的文件來實現自動下載代碼和構建程序包的工作,所以先假設這個文件名為 requestBuild.bat 或者 requestBuild.sh。同樣,我們在 Jenkins 上創建一個叫 Request Build 的 Job,選擇在 master 上執行任務的話,本文中的 master 是 windows 機器,所以文件為 requestBuild.bat。在 Build 選項中選擇 Execute Windows batch command,填入執行 requestBuild.bat 的 bat command,保存 Job 后點擊 Build now 就可以進行代碼下載和構建程序包的過程了。
這樣項目一的任務就完成了。讀到這兒您可能會有疑問,打好的安裝包是怎么上傳到特定的地址呢?關於這個問題,是 kick off Build 的內容,在 build XML 文件和圖 4 Properties 中有設置。
建立項目二:Download build to install server(Specific build)&Install build
即 download Build 到需要安裝的環境上,自動安裝軟件。
這個任務分為兩個 Job 來實現,第一個 Job 命名為 Download build to install server(Specific build),主要是從上文中提到的特定地址下載需要的文件到安裝環境上。同樣,這里指定這個 Job 在 master 上執行。為了提升下載過程中的靈活性,可以給 Job 設置 build with Parameters,這樣在執行這個 Job 的時候能選擇下載哪些內容。如下圖所示:
圖 5. 項目 Download build to install server(Specific build) 的參數配置
上圖中設置的信息,例如,FileList 是需要下載的文件的文件名稱,buildTag 是下載的 build version。這些是使用 String Parameters。Password 是使用 Password Parameters。
除了設置參數以外,Job 的內容是為了實現下載 Build 到指定的安裝環境中。在 Build 選項中點擊 Add build step 選擇 Execute shell script on remote host using ssh,在 SSH site 中填寫的機器上執行 Command 中的命令,將 build 下載到 install server 這台 Linux 機器的環境上。下圖列出了如何配置的信息:
圖 6. 項目 Download build to install server(Specific build) 的 Command 配置
完成配置后保存,點擊 build with Parameters,填上需要下載 build 的版本和文件名,就可以將 build 下載到 install Server 這套環境上。
然后,下載完成后要進行安裝的操作,這時候,需要建立第二個 Job,命名為 Install build,也是在 master 上執行這個任務。這個 Job 通過 Command 中添加安裝的 shell 命令來執行自動安裝的過程。如下面圖 7 給出了詳細的信息。
圖 7. 項目 Install build 的 Command 配置
運行這個 Jenkins Job 的時候,還可以在 Job 的 Console Output 中查看運行日志,監控軟件安裝的狀態。這樣,就實現了軟件安裝的過程了。
在兩個 Job 按順序執行完成后,下一步需要做的是對安裝好的軟件進行 BVT 測試。
建立項目三:Run BVT Automation case
即調用批處理文件,自動進行 BVT 測試。
創建一個 Job,project name 命名為 Run BVT Automation case。本文例子中的測試機的類型是 windows 機器,於是選擇 Add build step 中的 Execute Windows batch command 選項,通過在測試機器上運行 bat 命令來實現測試用例的運行。配置信息很簡單,如下圖所示:
圖 8. 項目 Run BVT Automation case 的 Windows command 配置
在這里需要注意的是,仍然要選擇執行 Job 的位置是在 master 上還是 slave 上。如果測試用例的代碼不在 master 上,可以選擇測試機器作為 Jenkins 的 slave 節點。在 Manage Jenkins 選項中點擊 Manage nodes 來創建 slave 節點,命名為 Test_node,創建完成后便可以在 Run BVT Automation case Job 中選擇執行的地方是 Test_node 的 slave 節點。
配置信息完成后,保存並運行 Job,Jenkins 就會通過上圖中的 DDtest.bat 來運行測試用例。同理,為了追蹤測試用例執行的情況,可以從 Job 的 Console Output 中查看運行日志。當然,這個任務是否能夠順利執行,還需要提前准備好測試代碼。本例中的測試代碼是一個獨立的 Java 工程,bat 文件可以在測試機器上手工運行,進行 BVT 測試。Jenkins 只是將這個手工操作包裝了一下。
在上述三個項目完成后,我們會思考怎么將這幾個流程串連起來呢?
如何將不同的項目聯系起來?
文章前面提到的 Multijob Plugin 插件就是來解決這個問題的,安裝 Multijob Plugin 插件后,就可以建立 Multijob Project。這里建立一個名為 Jenkins automation for development 的項目,並選擇在 master 上執行這個 project,在 project 中配置需要串連起來的 Job 名稱,在運行這個 project 的時候,就會順序地將幾個不同的 Job 一個個執行起來。
做點錦上添花的事情
在整個 Jenkins 持續集成的自動化流程中,仍然有很多需要改進的地方,筆者也在不停探索,先列出下面幾點以供參考:
- 設置 Email Notification
使用 MultiJob Project 后,Jenkins 就可以自動運行整個流程,那么如果能夠在執行結束后自動給用戶發一個通知的信息就再好不過了。這就需要在 Jenkins E-mail Notification 中配置,Reply-To Address 中填上收件人的郵箱,Charset 的內容為 UTF-8,並通過 Test configuration 按鈕來測試是否成功發送到郵箱。
- 准備環境
在開發和測試過程中都需要准備環境,我們可以通過使用 Jenkins 的 vSphere Plugin 來實現虛擬機環境的回滾,不過,這里仍然需要在 VMware 查看 Snapshot Name。首先需要在系統配置中設置 vSphere Cloud 的信息。例如,vSphere Host、為這個 vSphere Cloud 命名、登陸的用戶名、密碼等。然后,再創建准備環境的 Job,在 Build 中設置 vSphere Build Step 各個選項中的值。其中,Server 信息就是剛剛 vSphere Cloud 的名稱,vSphere Action 是回滾環境的話就選擇 Revert to Snapshot,Snapshot Name 可以從 VMware 中獲得。這些關鍵信息完成后,運行 Job 就可以為安裝 build 和測試提供可執行的環境了。
- 參數的使用
這里的參數和平常說到的變量很類似,也有局部和全局的概念。全局的意思即在系統配置中可以設置 Global Choice Parameter,而在具體 Job 中設置的 Parameter 應用范圍只在當前 Job 中。參數的種類也有很多,在這里便不再闡述,讀者可以在實際使用中視情況選擇。
結束語
Jenkins 持續集成給開發團隊帶來了很多便利,在這里我們只是初步的總結,為了讓 Jenkins 持續集成的功能更加完善,還需要不停的實踐和探索。希望通過本文的介紹讓更多的軟件開發人員和測試團隊了解持續集成的平台所帶來的好處。在當今軟件產業迅速發展的趨勢下,軟件開發團隊也正在經歷着相應的發展和改變,作為程序員的我們,不僅要開發出一個個新的軟件,也要利用已經存在的軟件工具來提高我們的工作效率,從容應對瞬息萬變的市場。