1. 程式人生 > >京東持續整合實踐

京東持續整合實踐

                                        京東持續整合實踐

導讀目錄:

1、持續整合簡介

2、持續整合實踐

3、整合環境的部署及自動化測試

      3.1、搭建J-auto系統

      3.2、J-auto系統使用

4、持續整合資料分析

 

1、持續整合簡介


       持續整合不僅僅是一項專案實踐,而是多項專案實踐的總和。在嘗試這些實踐時,不可避免要遇到一個問題:為什麼要持續整合?如果不能很好地理解為什麼,持續整合可能會進入誤區,不能帶來期望的效果。
       質量、進度和成本是軟體專案關注的三大要素,它們互相依賴、互相制約。以前軟體生命週期模型是程式設計師負責編寫不同的模組,在專案完成之前,一次性的把各個模組整合在一起,再進行測試。使用該種方式會為專案引入很多的未知因素和巨大風險--開發工程師往往發現越來越多的Bug 等待他們去修復、許多嚴重問題不能在前期及時發現修正、需求頻繁變更導致專案後期時間嚴重不足等等,這些風險很有可能會威脅到專案的成功。隨著對產品的釋出要求越來越高、越來越頻繁,以前老的方式已經越來越不能滿足要求。持續整合允許程式碼分批提交,程式碼提交後立即測試,測試在開發過程中一直存在,直至開發完完畢,避免程式碼積累很多後集成,造成程式碼質量低下。可以有效地解決專案過程中的許多問題,快速、及時發現系統錯誤,有效地確保系統質量,減小專案的風險,使得團隊從容面對各種各樣的變化。在專案過程中持續整合更能及時呈現各種分析報告,讓專案中各種角色瞭解專案的真實狀況,從而為正確選擇提供了資料基礎。


2、持續整合實踐


       隨著京東業務爆炸式增長,需求迅速增加,這對應用系統及時且保證質量交付產生了極大的挑戰。此時如果沒有良好的管理和高效的工具來幫助測試,整個測試團隊必會處於混亂的狀態,導致無法在短時間內保質保量地完成應用系統的測試任務,那麼整個測試團隊命運必然是被淘汰。在此背景下,交易質量部提出一套高效可行的解決方案——京東持續整合JCI (JD Continuous Integration)。從而節約了時間成本,提高了應用系統質量,增強了專案的可見性,使研發工程師與測試工程師之間的協作更完美。持續整合閉環系統環節如圖25-1所示:

圖25-1 京東持續整合


                                                                                         
持續整合方案如圖25-2所示:

圖25-2 持續整合方案

                                                                                             
京東持續整合包含子系統:

  • J-one:其負責靜態程式碼掃描、程式碼編譯、提交測試併發送提測JMQ訊息等;
  • J-auto:其負責接受提測JMQ訊息、解析JMQ訊息並自動搭建部署測試環境、自動執行測試用例併發送測試詳情報告、儲存測試執行資料等;
  • J-cim:展示各種分析彙總的結果資料等;
  • Source:儲存系統程式碼、測試指令碼等資料等;
  •  

3、整合環境的部署及自動化測試


       測試環境部署是一個重複且費時的工作。隨著需求增加,測試環境部署及應用系統測試的成本顯著增加。為了減少工作成本提高效率,經過測試工程師們積極探索,成功地引入自動化部署及自動化測試。
自動部署及自動化測試方案整體流程圖如下:

圖25-3 自動部署及自動化測試方案整體流程圖

 

流程圖解釋說明如下:
①通過京東J-one系統提交測試時,J-one會產生提測的JMQ訊息:
②J-auto系統接受並解析JMQ訊息,獲得提測的詳細資訊,如:應用名稱、開發工程師、測試工程師、被測程式碼分支、安裝介質下載地址等等;
③獲取應用於任務對映關係,關係包含:應用名稱、部署任務名稱、自動化測試任務名稱、部署目標主機ip、任務是否啟用等資訊;
④呼叫主任務,主任務負責在京東雲下載安裝介質、分發安裝介質及部署指令碼、呼叫部署子任務;
⑤執行部署,部署任務根據對映關係資訊,執行部署指令碼。部署完成後,傳送部署結果反饋。如果成功部署則啟動自動化測試,否則回滾環境;
⑥自動化測試任務,從Source系統獲取測試相關測試指令碼,執行測試指令碼並反饋測試結果等資訊。

 

3.1、搭建J-auto系統


        J-auto系統包含兩部分,Jenkins任務排程模組及Jenkins模組。搭建步驟如下:
        安裝JDK:
        在應用伺服器上的指定目錄下新建目錄,如:/xx/xx/java。將安裝包剪下到java下,並解壓。命令如下:

mv ./jdk-7u80-linux-x64.tar.gz /xx/xx/java/jdk-7u80-linux-x64.tar.gz

cd /xx/xx/java/

tar –xvf  jdk-7u80-linux-x64.tar.gz

配置JAVA_HOME環境變數,命令是

Export  JAVA_HOME=/xx/xx/java/jdk1.7.0_80

安裝tomcat:
在應用伺服器上的指定目錄下新建目錄,如:/xx/xx/tomcat。將安裝包剪下到tomcat下,並解壓。命令如下:

mv ./apache-tomcat-7.0.30.tar.gz /xx/xx/tomcat/apache-tomcat-7.0.30.tar.gz

cd /xx/xx/tomcat/

tar –xvf  apache-tomcat-7.0.30.tar.gz

將Jenkins任務排程模組部署到tomcat 容器中。
安裝jenkins:
將安裝包剪下到/xx/xx/tomcat/apache-tomcat-7.0.30/webapps/jenkins下並解壓。
命令如下:

mv ./ jenkins.war /xx/xx/tomcat/apache-tomcat-7.0.30/webapps/jenkins/jenkins.war

cd /xx/xx/tomcat/apache-tomcat-7.0.30/webapps/jenkins/

jar –xvf  jenkins.war

啟動jenkins,在tomcat的根目錄下,執行

cd ./bin

./startup.sh

jenkins全域性配置
訪問jenkins系統,註冊使用者並登入後,點選左側的【系統管理】選單,再點選【系統設定】,介面如下:

                                                                               圖25-4 Jenkins系統設定
圖注:

  1. Jenkins主目錄,存放Jenkins任務資料、構建資料等;
  2. 選擇【Role-Based Strategy】搭配【Role-based Authorization Strategy】外掛實現根據角色許可權命名任務;
  3. 郵件配置,包含郵件伺服器,郵件模板等資訊

      角色許可權配置,首先,點選【系統管理】,在點選【Configure Global Security】,啟用及配置安全策略,如下圖25-5所示:

                                                                                  圖25-5 配置安全策略
圖注:

  1. 啟用安全
  2. 安全域選擇【Jenkins專有使用者資料庫】並允許使用者註冊
  3. 授權策略選擇【Role-Based Strategy】

      其次配置角色許可權,如圖25-6所示:

圖25-6 配置角色許可權

                                  
圖注:

  1. 創系統中的全域性角色及賦權
  2. 建立專案角色及賦權
  3. 建機器節點角色及賦權

     最後,為使用者分配角色。點選【系統管理】,點選【Manage and Assign Roles】,點選【Assign Roles】,介面如圖25-7:

圖25-7為使用者分配角色


圖注:

  1. 給使用者關聯全域性角色
  2. 使用者關聯專案角色
  3. 使用者關聯機器節點角色

配置機器節點
       點選頁面左側【系統管理】,點選右側頁面的【管理節點】,點選左側的【新建節點】,節點資訊編輯介面如下:

圖25-8配置機器節點

 

  1. 節點名稱
  2. 設定執行者的數量
  3. Jenkins執行目錄
  4. 機器節點的標籤名
  5. 機器節點的使用方式,選擇【只允許執行繫結到這臺機器的Job】
  6. 機器節點的啟動方法,選擇【Launch slave agents on Unix machines via SSH】
  7. 節點連結啟動時的ip地址
  8. 節點連結啟動時鑑權的賬戶與密碼
  9. 節點機器上的工具配置,支援JDK、maven、ant等

      配置完成後,連結節點。


Jenkins主任務配置
首先建立任務時,選擇【構建一個自由風格的軟體專案】,如圖25-9所示

圖25-9 構建自由風格軟體專案


配置【General】資訊,如圖25-10:

圖25-10  專案常規資訊

 

  1. 任務名稱;
  2. 任務描述;
  3. 歷史構建資訊儲存策略設定;
  4. 設定任務執行時的接受的引數,圖片中只展示部分;
  5. 設定任務支援併發執行;
  6. 設定的任務執行的目標機器節點;

配置【構建環境】,如圖25-11,介紹如下:

圖25-11 配置專案的構建環境

 

  •  勾選【Abort the build if it's stuck】,超時策略選擇【Absolute】,時間閾值25分鐘,此設定保證執行異常時,任務可以中斷,防止影響後續其他任務的執行。

配置【構建】,如圖25-12所示,介紹如下:

圖25-12 構建配置


       增加構建步驟時,選擇【Execute shell】,編寫指令碼。
       配置【構建後操作】,如圖25-13所示,介紹如下:

圖25-13 構建後操作


         點選【增加構建後操作步驟】,選擇【Editable Email Notification】,設定構建後的郵件通知策略。


3.2、J-auto系統使用


       J-auto系統搭建完成後,下面就是應用J-auto系統進行自動部署和自動化測試了。首先,需要在Jenkins中新建一個自動化測試任務,與主任務不同,在建立任務時選擇【構建一個maven專案】,如下圖所示:

圖25-14 構建maven專案


       【原始碼管理】配置中,①處配置測試指令碼原始碼地址及鑑權賬號和密碼;②處設定測試指令碼的分支名稱。

圖25-15 設定程式碼分支和鑑權


      【Build】環節設定

圖25-16 build環節設定


①配置Maven的.pom檔案

  • 置Maven的執行命令

        然後新建一個自動部署任務,其與主任務配置類似。需要注意此任務存在shell指令碼呼叫shell指令碼的情況,【構建】環節編寫shell指令碼時,需要加BUILD_ID=[DoNotKillMe]。防止外層指令碼執行完成,但是內層指令碼仍在執行時,內層shell指令碼被終止,如圖25-17所示。

圖25-17 自動部署任務的構建


       另外【構建後操作】除了傳送反饋郵件配置,增加【Trigger parameterized build on other projects】步驟,用來關聯上一步建立的自動化測試任務,啟動自動化測試任務進行測試。

圖25-18 自動部署任務構建後操作

 

  1. 需要啟動的自動化測試任務名稱。
  2. 設定啟動後續任務策略。圖中配置是部署成功後啟動後續任務。
  3. 勾選後,啟動後續任務不使用引數。

        對映關係配置,是整個系統執行起來的關鍵環節。指明瞭那個應用系統部署在那臺機器及應用部署的目錄、應用的域名等資訊,連結提測到自動部署自動化測試環節,如圖6-19所示。

圖25-19 連結自動化部署


        此時研發通過J-one系統提交測試,J-auto接受提測的JMQ訊息,就可以觸發後續的自動部署、自動化測試、及各環節反饋,如圖25-20。

圖25-20 提測介面
圖25-21 自動部署結果反饋

 

圖25-22 自動化測試結果反饋

 

4、持續整合資料分析


       持續整合過程中,我們可以從編譯、部署、測試等環節中拿到許多相關資料。通過對這些資料分析和資料探勘,可以幫助我們後續質量評估分析、質量趨勢分析、質量可回溯分析等,有效地規範專案流程,發出專案風險預警。下面單從應用缺陷方面進行分析。
       應用缺陷資料分析,是持續整合資料分析中一部分,顧名思義就是對測試過程中發現的各種缺陷的彙總分析。既然是資料分析就得有資料模型,應用缺陷資料分析的模型如下:   

指標

指標說明

所屬專案

被測應用歸屬的專案

所屬模組

產生缺陷的功能模組

發現階段

發現缺陷的時間,如:需求評審、設計評審、編碼開發、單元測試、功能測試等

研發工程師

編寫相關模組及解決該問題的人員

缺陷級別

缺陷的嚴重性,如:建議、輕微、一般、嚴重等

                                                                    表25-1 缺陷資料分析模型


       通過構造缺陷在軟體生命週期的各環節的屬性進行分析,從不同維度得到各類缺陷的缺陷個數和缺陷比例,積累得到各類缺陷的基準值,用於評估測試活動,指導測試改進和整個生命週期流程的改進。比如,按模組進行單維度分析,可以得出各個功能模組的缺陷密度,從而瞭解各個功能模組的質量狀況;還有按發現階段分類分析,按模組加驗證程度分類分析等等;

圖25-23 按照專案統計bug數


        再有通過已有專案歷史資料進行缺陷趨勢分析,缺陷趨勢可以通過每日新建bug、每日關閉bug、累計未解決的bug,累計關閉bug、bug總數等指標進性分析,通過缺陷增長和減少的趨勢,瞭解測試的效率和開發修復bug的效率、測試瓶頸等。可以通過每日新建bug趨勢來了解測試的效率,正常來說提測中前期每日新增bug指標應該逐漸增加並達到一個峰值,然後呈下降趨勢,最後趨向於0。符合這個趨勢說明測試效率和測試質量較高,且開發修復bug新引入bug的概率是比較小的。每日關閉bug指標反映了研發工程師的處理響應速度。每日關閉bug數大說明研發修復bug效率高。如果新建的bug數越來越小,但是關閉的bug數量一直小於累計未解決的bug數,則說明研發同學效率低,是專案的瓶頸。bug總數曲線和累計關閉bug數應該大體一致並且最後重合。

圖25-24 bug趨勢圖

 

 

文末備註:

此文書寫實踐是一期摸索實踐,寫了很久沒有時間釋出分享給大家,最近才有時間整體出來,這並不是最佳實踐,只是記錄實踐探索,希望能給大家帶來思路和借鑑,我的二次摸索實踐在進行中,希望後續有機會能給大家分享最佳實踐;