1. Jacoco+docker+ant環境搭建
背景: Web多個服務在docker中啟動,服務之間存在依賴關系,啟動端口号以及依賴的鏡像關系都配置在docker-compse.yml檔案中。需要借助代碼覆寫率工具,對後端Java代碼進行覆寫率統計。
環境搭建理想目标是,開啟覆寫率統計工具後,進行API、Web GUI、手工測試和單元測試,都可以統計到覆寫率,且生成直覺的報告,可随時檢視代碼覆寫率進度,清晰解析每行代碼覆寫情況。
調研各代碼覆寫率工具後,最終標明Jacoco進行代碼覆寫率統計,理由如下:
1.Jacoco功能滿足上述代碼覆寫率環境的終極目标;
2.可與jenkins內建;
3.新版本的Jacoco也支援kotlin的代碼統計;
4.目前工具在持續更新中。
1.1 Jacoco環境搭建血淚史
與其他覆寫率工具相比,Jacoco環境搭建較複雜,且依賴源碼。網絡查詢jacoco工具大多與tomcat結合在一起,并且在tomcat中啟動javaagent, 是以最先選擇的也是Jacoco+tomcat的方式,發現流程可通,但覆寫率始終為0,此後先後嘗試了如下三種方案。

1.2 搭建步驟
1.2.1 工具安裝
首先伺服器需要安裝jacoco+ant工具,ant用來生成覆寫率報告,ant有遠端的功能,因想與jenkins內建,本文選擇jacoco、ant、jenkins、docker都配置在同一台伺服器上。
工具安裝具體步驟見如下連結:
1.下載下傳Jacoco到伺服器:
https://www.eclemma.org/jacoco/index.html2.linux上安裝ant:
https://www.cnblogs.com/sell/archive/2013/07/24/3210198.html注:若是環境中使用tomcat容器,Jacoco安裝和與tomcat內建可參見:
https://www.jianshu.com/p/16a8ce689d601.2.2 修改docker配置
網絡查詢到的docker修改大多需要修改docker鏡像,此處隻需要在docker配置檔案docker-compse.yml中添加啟動javaagent,以某一服務為例,新增點如下:
圖-1
将jacocoagent.jar拷貝到指定地點,且java啟動Javaagent和服務,Javaagent端口号随意,沒有被占用即可,其他服務修改同上,但是端口号不能相同。
Docker中重新開機修改的服務:1. docker-compose stop 具體服務2. docker-compose up –d 具體服務,使用docker-compose ps檢視服務狀态為UP,且帶有javaagent的程序,具體見圖2。
圖-2
注意:
- 執行啟動服務指令需要小心,一定要加up –d 具體服務,docker-compose up會重新開機所有服務,而有些服務是不可重新開機的,或者說啟動比較複雜。
2.重新開機服務時,依次各重新開機,不要為了省事,全部down掉,服務間存在依賴,或導緻某些服務啟動報錯。
1.2.3 與jenkins內建
與Jenkins內建的詳細步驟見如下連結:
https://www.jianshu.com/p/e7fc806ea0e0Jenkins中帶有jacoco分析的插件,可配置後直接生成直覺的覆寫率報告,适用于統計單個項目覆寫率,但是Web存在多個服務場景,如何生成覆寫率報告,此處有兩種方案:
1.2.4 本地生成覆寫率報告
本文選擇的是本地生成覆寫率報告的方式,需要修改配置檔案,修改build.xml檔案地方如下:
圖-3
- 指定Jaococant.jar的路徑。
- 指定覆寫率生成的.exec檔案和生成統計報告的路徑,路徑随意,建立檔案夾指定路徑即可。
- Ant支援遠端生成報告,此處是本地生成,填寫127.0.0.1,若是遠端添加遠端伺服器的位址。
- 配置javaagent的端口,此處端口與1.2.2步驟中docker-compse.yml的javaagent端口号一緻。
圖-4
5.指定源代碼的路徑,源碼必須與生成.jar包的源碼完全一緻。
6.指定class檔案的路徑。
圖-5
- dump指令配置,此處注意append參數的配置說明,目前選擇是true。
merge代碼是合并所有項目的.exec檔案,生成總的代碼覆寫率報告。
圖-6
- 生成覆寫率報告代碼部分,添加所有項目的資訊,具體圖-6中test1項目。
進入build_jacoco.xml檔案所在目錄,執行ant –f build_jacoco.xml,顯示BUILD SUCCESFUL後,進入生成報告路徑檢視生成的報告,打開index.html有統計資訊即成功。
圖-7
- 進入具體項目連結,即可觀察每行代碼的覆寫情況,分析未覆寫的代碼增加相應的測試case。
2. 可能遇見的問題
1.若Web服務為叢集環境,需要将其他服務down掉,使所有請求都發往部署jacoco的伺服器上。
2.啟動服務後,開始統計覆寫率,過程中,各個服務最好不要再重新開機。
3.若是生成報告失敗很大可能是端口号連不上,可嘗試修改端口号,build.xml檔案中端口号與docker-compose.yml檔案中javaagent的端口号一緻即可。
4.build指定的源碼和class路徑下檔案需要與生成jar包的源碼檔案完全一緻,否則生成覆寫率報告會報錯。
[2] Linux環境安裝ant:
[3] jacoco與tomcat內建:
[4] jacoco與jenkins內建:
文章來源:晶片開放社群
文章連結:
https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.1b87180flWxVN5&id=658632213725708288