无论你使用哪个服务器,tomcat也好,web-sephery liberty也罢,如何把jacoco这个agent打到我们的image中?如何进行jacoco的配置,以及报告解析成为解决上述问题的关键!
我这里利用liberty为基础镜像,把jacocoagent构建到image中,经过实践采坑,记录一下历程:
- 我的自定义Dockerfile文件:
**********************START:DOCKERFILE**********************
FROM websphere-liberty:kernel
COPY sonarTest.war /config/dropins/
COPY jacocoagent.jar /home/
ENV JAVA_TOOL_OPTIONS -javaagent:/home/jacocoagent.jar=output=tcpserver,port=6300,address=*
EXPOSE 9080 9443 6300
**********************END:DOCKERFILE**********************
- 构建image:
docker build -t jacoco:v0 .
- 启动image:(这里注意,一定要把6300端口暴露出去,否则影响下一步的获取exec文件)
docker run -d -p 6300:6300
- 容器启动之后,就可以通过CLI去获取项目代码覆盖率;
生成二进制文件:
java -jar jacococli.jar dump --destfile ./jacoco.exec
- 解析二进制文件:(生成report文件夹,在其下有html文件信息;并生成report.xml文件)
java -jar jacococli.jar report ./jacoco.exec --classfiles /Users/zhaochengcai/eclipse-workspace/sonarTest/build/classes/java --sourcefiles /Users/zhaochengcai/eclipse-workspace/sonarTest/src/main/java --html report --xml report.xml
Tips:其中 --classfiles是必须的,也就是项目build之后生成的class文件.
至此,jacocoagent已成功打进我们的image中,并获取了测试覆盖率的文件。
在上述经历中遇到的问题:
- 启动image的时候 没有把port 6300给暴露出来,导致第4步生成exec二进制文件的时候出现Connection reset. 这里必须要承认自己在docker方面的基础知识不够扎实!!!
-
在构建Dockerfile的时候,address=* 这个参数有点意思,之前我写的是address=localhost,也尝试了address=127.0.0.1,但是在第4步获取exec二进制文件的时候得到的错误都是如下所示:
Connection reset
这里要借助jacoco官方文档的一句话:
IP address or hostname to bind to when the output method is tcpserver or connect to when the output method is tcpclient.
In tcpserver mode the value "*" causes the agent to accept connections on any local address.
也就是说如果用address=* 的话,jacoco agent可以接收本地的任何连接.所以,这里使用 * 通配符为妙.
image.png
网友评论