天天看點

項目開展CICD的實踐探路

作者:閃念基因

Tech導讀 本文介紹了作者對CICD的了解以及在項目中開展CICD的幾種場景,總結了每種場景實踐的關鍵節點、帶來的收益,以及結合具體項目開展的實際應用。讀者可以借鑒本文中描述的場景,或借鑒文中提到的實踐方式,在項目中開展CICD,為項目在持續內建部署上做具體的支撐。

01

前言

在今年的靈活團隊建設中,我通過Suite執行器實作了一鍵自動化單元測試。Juint除了Suite執行器還有哪些執行器呢?由此我的Runner探索之旅開始了!

本文将基于京東研Bamboo、EOS、以及自搭建的SonarQube平台,在項目中開展CICD持續內建與部署。文章的主要内容包括介紹CICD開展的場景,項目中的實際應用,以及後續規劃等。

02

CICD基礎概念

了解,首先 MCube 會依據模闆緩存狀态判斷是否需要網絡擷取最新模闆,當擷取到模闆後進行模闆加載,加載階段會将産物轉換為視圖樹的結構,轉換完成後将通過表達式引擎解析表達式并取得正确的值,通過事件解析引擎解析使用者自定義事件并完成事件的綁定,完成解析指派以及事件綁定後進行視圖的渲染,最終将目标頁面展示到螢幕。

CICD 是持續內建(Continuous Integration)和持續部署(Continuous Deployment)簡稱。指在研發過程中自動執行一系列腳本來降低開發引入 bug 的機率,在新代碼從開發到部署的過程中,盡量減少人工的介入。

CICD 核心:持續內建、持續部署、持續傳遞。

項目開展CICD的實踐探路

圖1 CI與CD過程的流轉

CI:Continuous Integration,表示持續內建。

指在向遠端倉庫 push 代碼後,在這次送出合并入主分支前進行一系列測試,建構等流程。

假設現在有個應用的代碼存儲在 倉庫上,每天開發都會 push 很多次送出,針對每次 push,你可以建立一系列腳本進行自動測試,降低往應用裡引入錯誤的機率。它可以應用在包括開發分支在内的多個分支上。

持續內建過程中很重視自動化測試驗證結果,以保障所有的送出在合并主線之後的品質問題,對可能出現的一些問題進行預警。

CD:Continuous Delivery,表示持續傳遞。

指在完成CI後可自動将已驗證的代碼釋出到倉庫。

持續傳遞的目标是擁有一個可随時部署到生産環境的代碼庫。

CD:Continuous Deployment,表示持續部署。

指在持續內建的基礎上更進一步,指将推送指倉庫預設分支代碼部署到特定環境。

通過自動化的建構、測試和部署循環來快速傳遞高品質的産品。某種程度上代表了一個開發團隊工程化的程度,任何修改通過了所有已有的工作流就會直接和客戶見面,隻有當一個修改在工作流中建構失敗才能阻止它部署到産品線。

03

CICD的開展場景

了解,首先 MCube 會依據模闆緩存狀态判斷是否需要網絡擷取最新模闆,當擷取到模闆後進行模闆加載,加載階段會将産物轉換為視圖樹的結構,轉換完成後将通過表達式引擎解析表達式并取得正确的值,通過事件解析引擎解析使用者自定義事件并完成事件的綁定,完成解析指派以及事件綁定後進行視圖的渲染,最終将目标頁面展示到螢幕。

3.1 編譯部署

實作代碼送出之後的自動編譯-部署過程,取代j-one上建構-部署手動操作。

項目開展CICD的實踐探路

圖2 編譯部署流程關鍵節點

内容:代碼送出後的自動建構、自動部署、建構部署結果通知;

收益:去除編譯建構中間的等待時間。目前的編譯部署步驟是兩個非連續步驟,彼此分開,中間依賴于人工完成觸發部署。通過流水線,可以實作編譯部署中的無縫對接,去除中間等待時間,并且推送實時消息。

3.2 單元測試

開展基于Junit的單元測試:

項目開展CICD的實踐探路

圖3 單元流程關鍵節點圖

内容:針對後端代碼,基于Junit編寫單元測試腳本,開展單測,擷取單測報告、jacoco代碼覆寫率報告;

收益:通過單元測試,在項目中開展單測,可快速提升測試覆寫率。(測試覆寫率被定義為一種測試技術名額,它表明我們的測試用例是否真正完全覆寫了應用程式代碼中的各種可能以及在運作這些測試用例時執行了多少代碼。測試覆寫可以分為:語句覆寫、分支覆寫、路徑覆寫、條件覆寫、邊界值覆寫;通過jacoco插件,可以衡量單測的代碼覆寫率,得到測試覆寫率結果。

3.3 代碼掃描

實作基于SonarQube的代碼品質檢測:

項目開展CICD的實踐探路

圖4 基于SonarQube的代碼掃描關鍵節點

實作基于EOS的代碼品質檢測

項目開展CICD的實踐探路

圖5 基于EOS的代碼掃描的關鍵節點

内容:

1. 實作基于SonarQube、或公司平台EOS的代碼掃描檢測;

2. 代碼送出自動觸發代碼掃描,最終生成報告、結果通知;

3. 掃描結果計入項目品質,記錄跟蹤問題,直至問題閉環解決。

收益:

1. 代碼品質檢測的手段豐富;

2. 多層次的自動化測試,提升代碼品質;

3. 自動觸發測試執行,縮減測試等待時間,提高效率,實作無人值守;

3.4 自動化測試

實作基于Python、EasyOne、DeepTest、Jmeter 的自動化測試。

項目開展CICD的實踐探路

圖6 自動化流程關鍵節點節點

内容:

1. 實作基于SonarQube的代碼品質檢測;

2. 實作全鍊路各環節的自動化測試;

3. 代碼送出自動觸發測試執行、生成報告、報告通知;

收益:

1. 多層次的自動化測試,提升代碼品質;

2. 自動觸發測試執行,縮減測試等待時間,提高效率,實作無人值守;

3.5 全鍊路測試

将上述單個場景進行組合形成全鍊路測試場景;

代碼送出觸發鍊路自動運作,以及報告生成、郵件發送。

項目開展CICD的實踐探路

圖7 全鍊路測試實踐探索

以代碼送出作為觸發點,在編譯階段,完成代碼掃描、單元測試,并進行自動部署,完成部署之後,觸發單元測試執行、下發測試報告。過程中實時消息推送通知。

以上形成一個較為全面的全鍊路測試。

04

項目實踐

了解,首先 MCube 會依據模闆緩存狀态判斷是否需要網絡擷取最新模闆,當擷取到模闆後進行模闆加載,加載階段會将産物轉換為視圖樹的結構,轉換完成後将通過表達式引擎解析表達式并取得正确的值,通過事件解析引擎解析使用者自定義事件并完成事件的綁定,完成解析指派以及事件綁定後進行視圖的渲染,最終将目

4.1 公司内部平台

4.1.1 Bamboo

Bamboo是京東自研的一套CI/CD流水線解決方案,覆寫軟體開發的完整生命周期。

項目開展CICD的實踐探路

圖8 平台系統結構

平台化+原子化設計,平台提供基礎服務,能力可以通過原子化形式無限擴充,既兼顧了平台的穩定性,又大大減低了現有工具平台的接入成本。

項目開展CICD的實踐探路

圖9 垂直業務平台對接

現有的其他工具平台可獨立對使用者提供服務,也可以通過标準化方式輸出插件化原子能力,作為持續傳遞平台的一環,納入軟體傳遞流程中。

4.2 項目實際應用

4.2.1 編譯-部署

對Jone上高頻建構部署分支進行在Bamboo上搭建流水線,實作:

代碼送出-調用Jone的建構-調用Jone的部署-結果通知

項目開展CICD的實踐探路

圖10 編譯部署流水線運作過程

觸發編譯建構的幾種方式:

1. 手動執行;

2. 代碼送出觸發執行;

3. 定時任務觸發執行;

4. 級聯其他流水線觸發執行;

應用情況:

1. 組内所測試所覆寫都已部署相關流水線;

2. 支撐測試人員在所測項目中部署自動建構流水線,調用次數達數萬次。

4.2.2 單元測試

對後端項目開展單元測試,實作:

代碼送出-maven建構-擷取單測報告-結果通知

項目開展CICD的實踐探路

圖11 Jacoco代碼覆寫率統計

應用效果:

1. 極大簡化了擷取單測報告的過程,通過簡單的過程即可針對項目開展單測、執行單測、并擷取單測結果;

2. 支撐多個項目部署單測流水線,系統單測有效提升率:60%

項目開展接入單測的基本步驟:

後端工程配置 -> 代碼倉庫設定 -> Bamboo流水線編排 -> 流水線觸發設定 -> 其他可選項配置。

其中後端工程配置為較為重要部分,以下做重點介紹:

(1)工程配置檔案pom.xml檔案中配置surefire插件,多子產品工程可将此插件配置在子產品的pom.xml檔案中

【JAVA】
 <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.5</version>
        </plugin>
    </plugins>           

(2)項目目錄中的pom.xml中是否配置跳過單元測試标簽<skipTests>置為false,或删除此标簽(false表示不跳過單元測試,做單元測試需要執行單測腳本,故需設定為false或删除此标簽)

【JAVA】
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <skipTests>false</skipTests>
    </configuration>
</plugin>           

(3)本地執行mvn test指令可生成*/target/surefire-reports/TEST-.xml

【Bash】
mvn clean test -Dmaven.test.failure.ignore=true           

(4)生成代碼覆寫率需要在pom.xml檔案中配置jacoco插件

【JAVA】<!-- 配置jacoco覆寫率的插件 --><plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.2</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <!-- attached to Maven test phase -->
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>           

4.2.3自動化測試

項目部署之後,開展自動化回歸測試,用于項目上線前的回歸測試,實作:

自動化測試-測試報告-測試結果通知

項目開展CICD的實踐探路

圖12 自動化測試覆寫率統計

目前基于Python語言,依托Py第三方子產品,實作腳本編寫,內建到Bamboo平台,執行流水線,擷取報告。

應用效果:

在項目中開展上線前的預發環境的自動回歸測試;

4.2.4 代碼掃描

基于公司搭建的SonarQube、EOS平台,開展代碼掃描,實作:

代碼送出-代碼掃描-掃描報告-問題手工記錄缺陷平台

項目開展CICD的實踐探路

圖13 代碼掃描的關鍵節點

05

後續規劃

了解,首先 MCube 會依據模闆緩存狀态判斷是否需要網絡擷取最新模闆,當擷取到模闆後進行模闆加載,加載階段會将産物轉換為視圖樹的結構,轉換完成後将通過表達式引擎解析表達式并取得正确的值,通過事件解析引擎解析使用者自定義事件并完成事件的綁定,完成解析指派以及事件綁定後進行視圖的渲染,最終将目标頁面展示到螢幕。

(1)使用公司平台DeepTest開展更多項目的自動化測試,并與BamBoo平台做深度內建,提高自動化覆寫率。

(2)項目開展代碼掃描,并在代碼掃描過程中設定品質門禁節點,實作準入準出流水線的自動卡控。

作者:陳維

來源:微信公衆号:京東技術

出處:https://mp.weixin.qq.com/s/k7FizG3DMjbHmIipSD9fOA