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,此後先後嘗試了如下三種方案。
Tomcat+jacoco | Java+jacoco | Docker+jacoco | |
優勢 | 伺服器上新的容器,配置檔案可随意改動,不影響整體Web服務功能 | 直接使用java啟jar包和jacoco服務,不依賴任何容器 | 改動少,隻需在docker中添加啟動jacoco |
缺點 | Tomcat如何啟動Web相關服務需要好好研究 | 各種服務的依賴關系比較多,且有些服務啟動依賴.so鏡像 | Docker不熟悉,且網絡查詢docker中啟動新的程序需要修改docker鏡像且重新開機,服務有當機的風險 |
現狀 | 無法啟動web服務,放棄 | 單一服務可啟動,存在依賴的服務啟動報錯,放棄 | 尋找到一種方法,修改docker-compse.yml配置檔案,重新開機相應服務即可。 |
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
注意:1. 執行啟動服務指令需要小心,一定要加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
1、指定Jaococant.jar的路徑。
2、指定覆寫率生成的.exec檔案和生成統計報告的路徑,路徑随意,建立檔案夾指定路徑即可。
3、 Ant支援遠端生成報告,此處是本地生成,填寫127.0.0.1,若是遠端添加遠端伺服器的位址。
4、配置javaagent的端口,此處端口與1.2.2步驟中docker-compse.yml的javaagent端口号一緻。
圖-4
5、指定源代碼的路徑,源碼必須與生成.jar包的源碼完全一緻。
6、 指定class檔案的路徑。
圖-5
7、 dump指令配置,此處注意append參數的配置說明,目前選擇是true。
8、merge代碼是合并所有項目的.exec檔案,生成總的代碼覆寫率報告。
圖-6
9、生成覆寫率報告代碼部分,添加所有項目的資訊,具體圖-6中test1項目。
10、 進入build_jacoco.xml檔案所在目錄,執行ant –f build_jacoco.xml,顯示BUILD SUCCESFUL後,進入生成報告路徑檢視生成的報告,打開index.html有統計資訊即成功。
圖-7
11、 進入具體項目連結,即可觀察每行代碼的覆寫情況,分析未覆寫的代碼增加相應的測試case。
2、 可能遇見的問題
1、若Web服務為叢集環境,需要将其他服務down掉,使所有請求都發往部署jacoco的伺服器上。
2、啟動服務後,開始統計覆寫率,過程中,各個服務最好不要再重新開機。
3、若是生成報告失敗很大可能是端口号連不上,可嘗試修改端口号,build.xml檔案中端口号與docker-compose.yml檔案中javaagent的端口号一緻即可。
4、build指定的源碼和class路徑下檔案需要與生成jar包的源碼檔案完全一緻,否則生成覆寫率報告會報錯。
3. 引用資料:
[1]jacoco下載下傳路徑:
[2] Linux環境安裝ant:
[3] jacoco與tomcat內建:
[4] jacoco與jenkins內建:
原文作者:zhangyj
點選檢視原文