jacoco+maven+jenkins代码覆盖率统计

背景:使用jacoco来统计代码测试覆盖率,并集成到jenkins上。因为我是调研jacoco的,所以自己写了一个很简单的springboot项目,部署到docker,然后使用jacoco来统计测试这个demo的代码覆盖率的。

工具:gitLib 、maven、jenkins、docker

搭建过程

1、创建springboot项目

网上很多搭建springboot项目的案例,我也是百度后照着来的,这里不赘述

可参考:https://www.jianshu.com/p/397929dbc27d

2、本地使用jacoco

本地使用比较简单,不做记录

3、ubuntu16上搭建环境

1)安装配置jdk

官网下载ORACLE JDK安装包,然后上传到ubuntu服务器上使用tar -xzvf解压

官网地址:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html

ps :建议下载tar.gz包;解压后将整个文件copy到/usr/lib/jvm目录下

 

然后执行如下命令,打开profile文件,

sudo vim /ect/profile

在文件末尾添加上环境变量的配置

#set Java environment 
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 
export JRE_HOME=$JAVA_HOME/jre 
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH 
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

配置完之后,保存退出(按esc键推出编辑模式,切换到英文状态,输入冒号 :,然后再输入 wq!)。cat /ect/profile ,看一下添加的内容是否添加成功;

执行命令:source /ect/profile , 让文件的变动立即生效,因为有些配置文件修改完之后,并不是立即就能生效的。

做完这些之后,执行命令:java -version ,若能正常显示jdk版本,说明前面的配置成功了。

2)下载安装docker

前面的文章已经写过,不再赘述了

3)配置项目镜像

  • 配置项目的pom.xml文件

pom.xml中添加jacoco相关插件

<build>
   <plugins>
      <!--jacoco需要的插件-->
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.22.2</version>
         <configuration>
         </configuration>
      </plugin>
      <plugin>
         <groupId>org.jacoco</groupId>
         <artifactId>jacoco-maven-plugin</artifactId>
         <version>0.8.2</version>
         <executions>
            <execution>
               <id>default-instrument</id>
               <goals>
                  <goal>instrument</goal>
               </goals>
            </execution>
            <execution>
               <id>default-restore-instrumented-classes</id>
               <goals>
                  <goal>restore-instrumented-classes</goal>
               </goals>
            </execution>
            <execution>
               <id>report</id>
               <phase>prepare-package</phase>
               <goals>
                  <goal>report</goal>
               </goals>
            </execution>
            <execution>
               <id>check</id>
               <goals>
                  <goal>check</goal>
               </goals>
            </execution>
            <execution>
               <id>prepare-agent</id>
               <goals>
                  <goal>prepare-agent</goal>
               </goals>
            </execution>
         </executions>
         <configuration>
            <!-- rules里面指定覆盖规则 -->
            <rules>
               <rule implementation="org.jacoco.maven.RuleConfiguration">
                  <element>BUNDLE</element>
                  <limits>
                     <!-- 指定方法覆盖到80% -->
                     <limit implementation="org.jacoco.report.check.Limit">
                        <counter>METHOD</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.80</minimum>
                     </limit>
                     <!-- 指定指令覆盖到80% -->
                     <limit implementation="org.jacoco.report.check.Limit">
                        <counter>INSTRUCTION</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.80</minimum>
                     </limit>
                     <!-- 指定行覆盖到80% -->
                     <limit implementation="org.jacoco.report.check.Limit">
                        <counter>LINE</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.80</minimum>
                     </limit>
                     <!-- 指定类覆盖到100%,不能遗失任何类 -->
                     <limit implementation="org.jacoco.report.check.Limit">
                        <counter>CLASS</counter>
                        <value>MISSEDCOUNT</value>
                        <maximum>0</maximum>
                     </limit>

                  </limits>
               </rule>
            </rules>
         </configuration>
      </plugin>
   </plugins>
</build>
  • 项目打包

上面第1步骤将springboot项目建完后,自己写一个示例,然后使用maven打成jar包

  • 编写Dockerfile
#Docker image for springboot file run
# 基础镜像使用java
FROM java:8

# APP_NAME设置的是项目打成的jar包名称
ENV APP_NAME=demo-0.0.1-SNAPSHOT
ENV JAVA_OPTS="-server"
ENV PROFILE=docker

# 将本地javaagnet.jar加到镜像中,Dockerfile文件和项目的jar包在同一级目录;
# docker认为Dockerfile所在目录为根目录,所以路径要注意哦!不然会启动不成功的
COPY /jacocoagent.jar jacocoagent.jar
ADD /${APP_NAME}.jar ${APP_NAME}.jar
RUN bash -c 'touch /${APP_NAME}.jar'

#带java agnet参数运行java -jar命令,这里的address要写成127.0.0.1 或 0.0.0.0哦
ENTRYPOINT exec java -javaagent:/jacocoagent.jar=includes=*,output=tcpserver,port=6305,address=127.0.0.1 $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${PROFILE} -jar /${APP_NAME}.jar

#开放一个端口供客户端dump数据使用,用来监听jacoco的,不要和项目的启动端口一致
EXPOSE 6305

ps : dockerfile中设置的端口是jacoco监控程序的端口,要使用未被使用的端口哦!千万不要和项目端口设置成一样哦!

Dockerfile文件说明:

FROM :指定基础镜像,如果不以任何镜像为基础,那可以写成FROM:java ;Dockerfile文件必须以FROM 开头。

EVN :设置环境变量

COPY:复制命令

ADD:把文件复制到镜像中

RUN:运行指令

ENTRYPOINT:docker容器启动时运行的启动命令

EXPORT:暴露端口

  • 服务器上部署项目

在服务器上新建一个目录,将项目jar包和Dockerfile上传到该目录;我的目录如下:

  • 打镜像

在Dockefile所在目录执行命令:

docker build -t adademo:1.1 .

上述命令最后有一个点要注意哦!表示在当前目录。执行完之后,检查是否成功打成了镜像

查看镜像命令:

docker images

列出了你的镜像说明打成功了

  • 启动docker容器

执行命令:

docker run -d --net=host adademo:1.1

ps : 我这里没有映射端口是因为后面有个坑,这里映射端口的话,jenkins构建的时候一直dump不了数据

至此项目启动成功了。可以查看项目的日志,查看步骤:

查看所有启动的容器:

docker ps

# 查看项目日志
docker logs -f --tail=1000 容器id

#当项目启动失败,同通过命令, 查看启动失败的容器
docker ps -a 

补充:

# 将已启动得容器停止并删除
docker stop image_id
docker rm image_id

# 删除镜像,加-f 强制删除镜像
docker rmi image_id

踩坑!!!!

  • docker build打镜像的时候,报错:ADD failed :stat **** : no such file or directory

原因1:dockerfile中需要ADD到镜像中的jar路径不对,原先我使用的是绝对路径。

其实dockerfile文件中的命令是以dockerfile所在目录为根目录,所以调整路径如下:

如果还是报错,那尝试一下在镜像中创建这个jar包,如上图标出的第二行

4、jenkins上集成gitLib

1)ubuntu16上安装jenkins

可参照:https://www.cnblogs.com/youcong/p/8710025.html

2)jenkins上安装插件

在jenkins管理 -- 插件管理 -- 可选插件 -- 搜索JaCoCo pluginDocker Pipeline ,然后选中安装即可;安装完在已安装下可搜索到

3)新建pipeline任务

new item -- 选择流水线 -- 流水线定义处选择:pipeline script,然后设置pipeline脚本

pipeline {
    agent any
    tools {
        jdk 'JDK1.8'
    }
    stages {
        stage('Checkout'){
            steps{
                git branch: 'master', credentialsId: '17d50c1e-91b0-4db2-b147-********', url: 'git@git.******/jacoco-test.git'
            }
        }
        stage('Build') {
            steps{
                withMaven(maven: 'maven'){
                      sh "mvn clean package -Dmaven.test.skip=true"
                }
            }
        }
        stage('DumpFromServer'){
            steps {
                withMaven(maven: 'maven'){
                    sh 'mvn  -X  org.jacoco:jacoco-maven-plugin:0.8.2:dump -Djacoco.address=127.0.0.1 -Djacoco.port=6305'
                }
            }
        }
        stage('JacocoPublisher') {
            steps {
                 jacoco()
            }
        }
    }
}

pipeline的脚本文件中

credentialsId:是jenkins中配置的凭证id  。需要gitlib上配置该Jenkins的密钥,然后再jenkins中系统管理 --> 管理凭据 -- 添加凭据

Username:可以随便填,最好见名知意

Private Key : ssh的私钥

添加成功后,就会生成凭证id了

url:是gitlab上对应项目的地址;

-Djacoco.port是上面dockerfile中暴露的接口 

构建任务,就可以生成测试报告了

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值