背景:使用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 plugin 和 Docker 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中暴露的接口
构建任务,就可以生成测试报告了