服务器上安装软件:
1.安装jdk1.8
2.ant安装和配置
下载ant:
wget http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.4- bin.zip
解压:
unzip -n apache-ant-1.8.4-bin.zip -d /opt/apache-ant-1.8.4
建立软连接:
cd /usr/bin
ln -s -f /opt/apache-ant-1.8.4/bin
ln -s -f /opt/apache-ant-1.8.4/bin/ant
检查:ant -version
3.安装jacoco
下载zip包:https://www.eclemma.org/jacoco/
解压zip包到目录/opt/jacoco下
4.准备代码和.class文件
这里用的是开源项目halo,是一个java语言编写的博客系统
github:https://github.com/halo-dev/halo
环境构建这里不赘述了,参考以下文档,作者已经写的很清楚了:https://halo.run/develop/application/structure.html#%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95
最终我们需要的是java源码和打包后的.class文件,如下:
/root/.halo/ideaProject/halo_project/halo/src/main/java/
/root/.halo/ideaProject/halo_project/halo/build/classes
提醒:本地构建成功后,把源码和文件拷贝到服务器上的
5.准备ant的build.xml文件所需参数:
1.jacoco路径,例如/opt/jacoco/lib/jacocoant.jar
2.jacoco的.exec文件的路径,例如/opt/jacoco/target/jacoco.exec
3.jacoco生成的报告路径,例如/opt/jacoco/report
4.服务器的IP(本机为127.0.0.1),服务器的tcp端口号,例如6300
5.源码路径,例如:/root/.halo/ideaProject/halo_project/halo/src/main/java/
6.字节码文件路径,例如:/root/.halo/ideaProject/halo_project/halo/build/classes
该文件放到/opt/apache-ant-1.8.4/bin 下,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="test" xmlns:jacoco="antlib:org.jacoco.ant" >
<!--Jacoco的安装路径-->
<property name="jacocoantPath" value="/opt/jacoco/lib/jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="/opt/jacoco/target/jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="/opt/jacoco/report"/>
<!--远程tomcat服务的ip地址-->
<property name="server_ip" value="127.0.0.1"/>
<!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value="6300"/>
<!--源代码路径可以包含多个源代码-->
<property name="checkOrderSrcpath" value="/root/.halo/ideaProject/halo_project/halo/src/main/java/" />
<!--.class文件路径可以包含多个-->
<property name="checkOrderClasspath" value="/root/.halo/ideaProject/halo_project/halo/build/classes"/>
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef>
<!--dump任务:
根据前面配置的ip地址,和端口号,
访问目标tomcat服务,并生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="true" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
</target>
<!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" />
<jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata>
<structure name="JaCoCo Report">
<group name="Check Order related">
<classfiles>
<fileset dir="${checkOrderClasspath}" />
</classfiles>
<sourcefiles encoding="utf-8">
<fileset dir="${checkOrderSrcpath}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="utf-8" />
</jacoco:report>
</target>
</project>
6.使用jacocoagent作为代理启动应用:
java -javaagent:/opt/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1 -jar /root/.halo/halo-latest.jar
命令解释:
javaagent:javaagent是JDK 1.5以后引入的,也可以叫做Java代理.
后面跟的参数是jcocoagent的jar包地址:/opt/jacoco/lib/jacocoagent.jar
includes:包含在执行分析中的类名列表,*表示全部.
output:表示使用tcpserver代理侦听由address和port属性指定的TCP端口,并将执行的数据写入此TCP连接,从而实现不停止项目运行实时生成代码覆盖率报告.
port:开启的端口号,这里采用了6300端口进行监听(注意这里不是halo应用的端口)
address: 开启的ip地址,本地写127.0.0.1.
jar:运行服务的jar包地址.
7.测试halo应用
访问http://****.78.8.210:8080/admin/随机使用一些功能
8.生成覆盖率报告
在/opt/apache-ant-1.10.7/bin下执行"ant dump",会在/opt/jacoco/target下生成"jacoco.exec"
在/opt/apache-ant-1.10.7/bin下执行"ant report",会在/opt/jacoco/report下生成html报告
打包报告:tar -cf report.tar report
下载报告到本地,查看html报告
scp root@****.78.8.210:/opt/jacoco/report.tar /Users/******/Downloads/jacoco_report/
9.sonarqube安装和部署
sonarqube server搭建:sonarqube7.9已经不支持mysql了,需要下载旧版本
安装mysql:
用户:root/123456;sonar/sonar
用户授权:GRANT all privileges ON sonarqube.* TO sonar’@‘%' IDENTIFIED BY 'password';
创建了数据库:sonarqube
sonarqube server安装和配置
下载sonarqube拷贝到/tmp/sonapackage下
解压到/opt/sonaqube下
unzip -n sonarqube-sonarqube-7.6.zip -d /opt/sonarqube
最终目录:/opt/sonarqube/sonarqube-sonarqube-7.6
sonar配置:
sonar.web.host=0.0.0.0
sonar.web.port=9000
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
/opt/sonarqube/sonarqube-8.1.0.31237/bin/linux-x86-64
启动:./sonar.sh start
停止:./sonar.sh stop
启动遇到坑:https://blog.csdn.net/zdyueguanyun/article/details/79447260
sonar for ant插件
下载sonar for ant到插件:
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Ant
sonar.xml文件编写,放到/opt/apache-ant-1.10.7/bin下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="My Project" default="all" basedir="/root/.halo/ideaProject/halo_project/halo/" xmlns:sonar="antlib:org.sonar.ant">
<!-- ========= Define the main properties of this project ========= -->
<property name="src.dir" value="src" />
<!-- <property name="test.dir" value="src" /> -->
<!-- <property name="lib.junit.dir" value="lib" />-->
<property name="build.dir" value="build" />
<!-- <property name="target.dir" value="target" />-->
<property name="classes.dir" value="${build.dir}/classes" />
<!-- <property name="reports.dir" value="${build.dir}/reports" />-->
<!-- <property name="reports.junit.xml.dir" value="${reports.dir}/junit" />-->
<!-- Define the Sonar properties -->
<property name="sonar.projectKey" value="jacoco_test" />
<property name="sonar.projectName" value="jacoco test project" />
<property name="sonar.projectVersion" value="1.0" />
<property name="sonar.language" value="java" />
<property name="sonar.sources" value="${src.dir}" />
<!-- <property name="sonar.tests" value="${test.dir}" /> -->
<property name="sonar.binaries" value="${classes.dir}" />
<property name="sonar.java.binaries" value="${classes.dir}" />
<property name="sonar.sourceEncoding" value="UTF-8" />
<!-- <property name="sonar.surefire.reportsPath" value="${reports.junit.xml.dir}" />-->
<!-- The following properties are required to use JaCoCo: -->
<property name="sonar.dynamicAnalysis" value="reuseReports" />
<property name="sonar.java.coveragePlugin" value="jacoco" />
<property name="sonar.jacoco.reportPath" value="/opt/jacoco/target/jacoco.exec" />
<!-- Add your basic Sonar configuration below: sonar.jdbc.url, sonar.jdbc.username, etc. properties -->
<property name="sonar.jdbc.url" value="jdbc:h2:tcp://localhost:9092/sonar" />
<property name="sonar.jdbc.username" value="admin" />
<property name="sonar.jdbc.password" value="admin" />
<!-- ========= Define Sonar target ========= -->
<target name="sonar">
<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
<!-- Update the following line, or put the "sonar-ant-task-*.jar" file in your "$HOME/.ant/lib" folder -->
<classpath path="/opt/jacoco/lib/sonarqube-ant-task-2.6.0.1426.jar" />
</taskdef>
<!-- Execute Sonar -->
<sonar:sonar />
</target>
<!-- ========= The main target "all" ========= -->
<target name="all" depends="sonar" />
</project>
scp /Users/zhangyaqin/Downloads/sonar.xml root@117.78.8.210:/opt/apache-ant-1.10.7/bin
执行命令(记得切回root用户):ant -find sonar.xml
登录:http://117.78.8.210:9000
用户名和密码:admin/admin
重置覆盖率报告:
- 问题:想要把覆盖率报告初始化为零
- 解决:重启应用+删除jacoco.exec文件
- 原理:
在build.xml文件中有一个配置:
<target name="dump">
<jacoco:dump address="${server_ip}" reset="true" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
</target>
其中reset="true" 并不是真正意义上的重置,因为ant dump命令在生成jacoco.exec文件时,是根据jvm中类加载的情况而生成的,而这个数据是没有清空的。执行ant dump和ant report,会发现覆盖率没有改变。当应用重启后jvm的类加载也会重新开始,这样就完成了第一步。第二步就是删除jacoco.exec文件。完成了以上两步再生成覆盖率,可以看到重置为0了。
参考:
https://testerhome.com/topics/19225
https://testerhome.com/topics/5329
https://testerhome.com/topics/20632
https://testerhome.com/topics/8113
网友评论