背景:使用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
执行命令:apt-get install openjdk-8-jdk 还自动将jdk下载到 系统/usr/lib/jvm 路径下;
执行命令:sudo vim /ect/profile ,打开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
配置完之后,保存退出,cat /ect/profile ,看一下添加的内容是否添加成功;
执行命令:source /ect/profile , 让文件的变动立即生效,因为有些配置文件修改完之后,并不是立即就能生效的。
做完这些之后,执行命令:java -version ,若能正常显示jdk版本,说明前面的配置成功了。
2)下载安装docker
可参照:https://www.cnblogs.com/jiyang2008/p/9014960.html
- 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本:
sudo apt-get remove docker docker-engine docker-ce docker.io
- 更新apt包索引:
sudo apt-get update
- 安装以下包以使apt可以通过HTTPS使用存储库(repository):
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- 添加Docker官方的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 使用下面的命令来设置stable存储库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 再更新一下apt包索引:
sudo apt-get update
- 安装最新版本的Docker CE:
sudo apt-get install -y docker-ce
- 检查docker是否安装完成:
docker --version
当提示docker 版本就说明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 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的脚本文件中credentialsId是jenkins中配置的凭证id , url是gitlab上项目的地址;-Djacoco.port是上面dockerfile中暴露的接口
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()
}
}
}
}
构建任务,就可以生成测试报告了
gitlib配置jenkins凭证后面更新