ant+jacoco+jenkins+HttpRunnerManager代码覆盖率统计平台搭建

实现思路通过jenkins构建,并使用HttpRunnerManager异步实现报告更新与展示。

现在整理一下我的实现流程:

一、创建jenkins节点并启动此节点

1、jenkins系统创建nodes节点

2、生成镜像,创建并运行节点容器

二、jenkins创建job,使用jacoco运行程序

1、配置jdk和maven

2、创建job

3、maven构建并使用ant+jacoco启动脚本

4、创建build.xml文件,生成报告

三、覆盖率统计报告服务器

四、httprunnermanager异步生成报告

1、在宿主机上添加异步任务代码

2、宿主机上启动任务

3、在httprunnerManager中添加任务代码

4、httprunnerManager添加访问报告的链接

五、应用展示

一、创建jenkins节点并启动此节点

创建jenkins节点,并使用docker容器启动节点。

1、jenkins系统创建nodes节点

a、系统管理 - 管理节点 - 新建节点

b、创建成功后会出现如下界面

          点击agent.jar,下载agent.jar重命名为 slave.jar

2、生成镜像,创建并运行节点容器

a、下载所需要的环境包

           ant、maven、jacoco、jdk:从官网上下载

slave.jar:就是刚才下载的agent.jar。

        

     b、编写dockerfile文件

FROM         python:3.6.6-stretch
MAINTAINER test@123.com
#环境变量
ENV MASTER_DOMAIN 'jenkins_Ip:8080' #第一步中的jenkins服务器的的IP及端口
ENV AGENT_NAME 'docker-slave-jacoco-medical' #jenkins的节点名称
ENV SECRET '1222223333344444444445556666777777666' # 第一步中的jenkins节点的SECRET
#创建目录
RUN mkdir /var/tmp/jdk /var/tmp/maven /var/tmp/slave /var/tmp/ant /var/tmp/jacoco
COPY jdk1.8.0_181.tar.gz /var/tmp/jdk/
COPY apache-maven-3.5.4-bin.tar.gz /var/tmp/maven/
COPY slave.jar /var/tmp/slave/
COPY apache-ant-1.10.5-bin.tar.gz /var/tmp/ant/
COPY jacoco-0.8.1.tar.gz /var/tmp/jacoco/
#解压
RUN tar -xzvf /var/tmp/jdk/jdk1.8.0_181.tar.gz -C /var/tmp/jdk \
&& cd /var/tmp/jdk && rm -rf *.tar.gz
RUN tar -xzvf /var/tmp/maven/apache-maven-3.5.4-bin.tar.gz -C /var/tmp/maven \
&& cd /var/tmp/maven && rm -rf *.tar.gz
RUN tar -xzvf /var/tmp/ant/apache-ant-1.10.5-bin.tar.gz -C /var/tmp/ant \
&& cd /var/tmp/ant && rm -rf *.tar.gz
RUN tar -xzvf /var/tmp/jacoco/jacoco-0.8.1.tar.gz -C /var/tmp/jacoco \
&& cd /var/tmp/jacoco && rm -rf *.tar.gz
#EXPOSE 映射端口
EXPOSE 80
#环境变量
ENV ANT_HOME /var/tmp/ant/apache-ant-1.10.5
ENV JAVA_HOME /var/tmp/jdk/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /var/tmp/maven/apache-maven-3.5.4
ENV CATALINA_BASE /var/tmp/maven/apache-maven-3.5.4
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin:$ANT_HOME/bin
#环境变量生效
#RUN source /etc/profile
#运行代码
RUN cd /var/tmp/jdk/jdk1.8.0_181/bin && ln -s java java_1.8
CMD java_1.8 -jar /var/tmp/slave/slave.jar -jnlpUrl "http://${MASTER_DOMAIN}/computer/${AGENT_NAME}/slave-agent.jnlp" -secret "${SECRET}"

dockerfile文件内容

 c、生成镜像文件

在dockerfile所在的目录下运行

docker build -t docker.io/slave_jacoco_medical:latest .

     d、创建并运行容器

        AGENT_NAME:jenkins节点名称        SECRET:创建节点成功界面的secret值

-e:设置环境变量     --name:容器名称

-v:挂载,需要把代码所在的工作目录、报告生成的目录挂载到宿主机上

注意:此处容器的名字与jenkins节点远程工作目录名字一致,这样会给后续异步生成报告带来便捷,此处先不过多解释。

(可以通过传入的AGENT_NAME、SECRET变量,生成不同项目的容器)

docker run -d --restart always -p 9001:80 -e AGENT_NAME='docker-slave-jacoco-medical'  \
-e SECRET='' \
-v /var/jenkins_jacoco_jobs/jenkins_slave_medical_jobs:/jenkins_slave_jacoco_medical \
-v /jenkins_root/jenkins_medical_root:/root \
-v /var/ant_reports/medical_reports:/var/antreports \
--name jenkins_slave_jacoco_medical docker.io/slave_jacoco_medical:latest

二、jenkins创建job,使用jacoco运行程序

     1、配置jdk和maven

           jenkins使用maven生成jar包,需要先安装jdk、maven

jenkins - 系统管理 - 全局工具配置

     2、创建job

注意此处需要设置为刚才创建的节点名称

源码管理:

     3、maven构建并使用ant+jacoco启动脚本

通过 maven  -f  路径/pom.xml  install 构建  或如图设置

通过jacoco启动程序:“构建 - Execute shell” 设置启动脚本

启动程序后,可通过 http://宿主机IP:9001/访问接口(容器对外挂载的是9001端口)

# 如果程序已经启动,杀掉进程
count=`ps -ef | grep jacocoagent | grep -v "grep" | wc -l`
if [ $count -gt 0 ]; then
ps aux|grep jacocoagent|grep -v grep|awk '{print $2}'|xargs kill -9
fi
# 删除merged.exec 确保构建后覆盖率清为0
rm -rf /docker_slave_jacoco_medical/merged.exec \
#启动程序
&& java -javaagent:/var/tmp/jacoco/jacoco-0.8.1/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8048,address=127.0.0.1 -jar /jenkins_slave_medical/workspace/jacoco_medical/target/mdc-service-0.0.1-SNAPSHOT.jar &

Execute shell 脚本

4、创建build.xml文件,生成报告

创建build.xml

<?xml version="1.0" ?>
<project name="testExec" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<property name="jacocoantPath" value="/var/tmp/jacoco/jacoco-0.8.1/lib/jacocoant.jar"/>
<property name="jacocoexecPath" value="./merged.exec"/>
<property name="workspacePath" value="."/>
<property name="reportfolderPath" value="/var/antreports/reports"/>
<property name="server_ip" value="127.0.0.1"/>
<property name="server_port" value="8048"/> <!-- <property name="srcApiPath" value="/docker_slave_jacoco_medical/workspace/jacoco_medical/mdc-api/src/main/java">
<property name="classApiPPath" value="/docker_slave_jacoco_medical/workspace/jacoco_medical/mdc-api/target/classes"/> --> <property name="srcServicePath" value="/docker_slave_jacoco_medical/workspace/jacoco_medical/mdc-service/src/main/java"/>
<property name="classServicePath" value="/docker_slave_jacoco_medical/workspace/jacoco_medical/mdc-service/target/classes/com"/> <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef> <target name="merge">
<jacoco:merge destfile="merged.exec">
<fileset dir="${workspacePath}" includes="**/*.exec"/>
</jacoco:merge>
</target> <target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target> <target name="jacoco">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" /> <jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata> <structure name="JaCoCo Report">
<group name="order">
<classfiles>
<fileset dir="${classServicePath}" />
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="${srcServicePath}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="utf-8" />
</jacoco:report>
</target>
</project>

build.xml

进入容器内部执行以下命令,即可生成报告

ant dump -buildfile   路径/build.xml
ant jacoco -buildfile 路径/build.xml

三、覆盖率统计报告服务器

# 搜索并拉取镜像
docker search tomcat
docker pull tomcat
# 创建并运行容器,把webapp目录挂载出来
docker run -d --restart always -p 9090:8080 -v /var/ant_reports:/usr/local/tomcat/webapps --name tomcat_ant_reports docker.io/tomcat:latest

通过http://宿主机IP:9090/medical_reports/reports/ 即可查看代码覆盖率报告

四、httprunnermanager异步生成报告

1、在宿主机上添加异步任务代码

  celerycon.py :

from kombu import Exchange,Queue
from celery import platforms
import os
BROKER_URL = 'amqp://user:password@rabbitmq的ip:port//'#与httprunnerManager使用同一个rabbitmq
CELERY_RESULT_BACKEND = "db+mysql://root:123456@10.8.154.123:3309/test"
#CELERY_RESULT_BACKEND ="amqp"
CELERY_QUEUES = (
Queue("default",Exchange("default"),routing_key="default"),
Queue("for_task_A",Exchange("for_task_A"),routing_key="for_task_A"),
Queue("for_task_B",Exchange("for_task_B"),routing_key="for_task_B")
)
CELERY_ROUTES = {
'ApiManager.tasks.taskA':{"queue":"for_task_A","routing_key":"for_task_A"},
'tasks.taskB':{"queue":"for_task_B","routing_key":"for_task_B"}
}
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
platforms.C_FORCE_ROOT = True
CELERYD_MAX_TASKS_PER_CHILD = 40

       tasks.py :

import os
from celery import Celery
app = Celery()
app.config_from_object("celerycon") #获取配置文件
@app.task(bind=True)
def taskA(self, tag, queue='for_task_A'):
#在本机执行shell脚本,返回执行结果的状态,成功返回0
#tag是传入的参数(容器名称)
lac = os.system('bash -v /opt/jacoco_work/workSc/ApiManager/ant.sh' + tag)
return "Success!" if lac == 0 else "Failure!"
@app.task
def taskB(self,x,y,z):
return x + y + z

     ant.sh :

#!bin/bash
docker_name=$1
sudo docker exec $docker_name bin/bash -c "ant dump -buildfile /$docker_name/build.xml && ant jacoco -buildfile /$docker_name/build.xml"

#docker_name获取的是执行代码时传入的第一个参数。
#build.xml直接放在jenkins节点(容器)的远程工作目录下,因之前远程工作目录与容器名字相同,此处可以把远程工作目录参数化。如此以来,以后不管任何项目都可以通过参数来生成相应
项目的报告。(这就是之前容器的名字与jenkins节点远程工作目录名字设置一致的原因)

 2、宿主机上启动任务

#进入workSc目录下执行:
# 启动任务
celery multi start jacoco_work -A ApiManager.tasks -l info -n worker1.%h
# 停止任务
celery multi stop jacoco_work -A ApiManager.tasks -l info -n worker1.%h

 3、在httprunnerManager中添加任务代码

 views.py添加

from ApiManager.tasks import *
def refresh1(request):
# model:容器名称(如:jenkins_slave_jacoco_medical)
name = request.POST.get('model')
taskA.delay(name)
data = {
'msg': name + ' started',
'id': name
}
return render_to_response('refresh.html', data)

  tasks.py添加

@shared_task
def taskA(tag):
# 以下代码不会执行
lac = os.system('bash -v /opt/jacoco_work/workSc/ApiManager/ant.sh docker_slave_jacoco_medical')
return lac

     4、httprunnerManager添加访问报告的链接

最后在httprunnerManager平台使用 iframe 展现 http://宿主机ip:9090/medical_reports/reports/ 页面的报告

五、应用展示

注意:构建时是从gitlab直接拉取代码,所以构建时注意看下开发配置的环境是否为测试环境。

1、在httprunnerManager平台,选择jacoco搭建的环境,运行用例

2、接口测试完毕后,点击”提交“实现异步生成报告

3、通过httprunnerManager平台查看报告:

如果大家有发现什么错误的地方或者好的建议,欢迎评论留言指出,谢谢。

HttpRunnerManager平台异步生成及展示代码覆盖率报告的更多相关文章

  1. Karma +Jasmine+ require JS进行单元测试并生成测试报告、代码覆盖率报告

    1. 关于Karma Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner). 该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuou ...

  2. jacoco 生成单测覆盖率报告

    一.jacoco 简介 jacoco 是一个开源的覆盖率工具,它针对的开发语言是 java.其使用方法很灵活,可以嵌入到 ant.maven 中:可以作为 Eclipse 插件:可以作为 javaAg ...

  3. 生成图形化html报告

    生成图形化html报告: 1.从cmd 进入执行测试文件 2.执行该命令:jmeter -n -t <test JMX file> -l <test log file> -e ...

  4. linux平台模拟生成CAN设备

    前言 使用socketCan的过程中有时候没有can接口设备,但是需要测试一下can接口程序是否有问题, 此时需要系统模拟生成can设备,本文介绍linux平台模拟生成CAN设备的方法. 实现步骤 1 ...

  5. 使用JaCoCo Maven插件创建代码覆盖率报告

    这篇博客文章描述了我们如何使用JaCoCo Maven插件为单元和集成测试创建代码覆盖率报告. 我们的构建要求如下: 运行测试时,我们的构建必须为单元测试和集成测试创建代码覆盖率报告. 代码覆盖率报告 ...

  6. MAC 环境下搭建HttpRunnerManager平台

    1 . mac pycharm 创建虚拟环境 https://blog.csdn.net/qq_39806105/article/details/96908584 2. mac 环境下搭建HttpRu ...

  7. 在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表

    在我的<FastReport报表随笔>介绍过各种FastReport的报表设计和使用,FastReport报表可以弹性的独立设计格式,并可以在Asp.net网站上.Winform端上使用, ...

  8. 东师理想云平台异步任务处理系统V2.0重构思路

    现存问题分析: 1.功能太多,而且杂糅到一个程序中,架构不清晰,出问题不好调试.2.系统重启后,不登录到桌面,程序不运行,用户体验差.经常的下载403等错误3.处理程序卡死,处理速度慢等问题,不支持多 ...

  9. Linux下搭建实现HttpRunnerManager的异步执行、定时任务及任务监控

    前言 在之前搭建的HttpRunnerManager接口测试平台,我们还有一些功能没有实现,比如异步执行.定时任务.任务监控等,要完成异步执行,需要搭建 RabbitMQ 等环境,今天我们就来实现这些 ...

随机推荐

  1. 广义线性模型 - Andrew Ng机器学习公开课笔记1.6

    在分类问题中我们如果: 他们都是广义线性模型中的一个样例,在理解广义线性模型之前须要先理解指数分布族. 指数分布族(The Exponential Family) 假设一个分布能够用例如以下公式表达, ...

  2. Linux系统编程--read/write

    . read/write read函数从打开的设备或文件中读取数据. #include <unistd.h> ssize_t read(int fd, void *buf, size_t ...

  3. st16c554

    /* * st16c554.c * * TWO ST16C554 driver for AMCC PPC405EP * * Author: Li Zhi You/Zhu jiang <godis ...

  4. web服务器优化的一些思路

    作为一个新手(并不是菜鸟,而是像我们这样的学生),维护一个网站往往是一个很头疼的问题,尤其是动态网站,更尤其是用java写的网站. 当网站的吞吐量很小的时候你会发现服务器根本不需要维护,因为几乎没有延 ...

  5. 在项目中使用JMail发送邮件

    1.添加JMail组件:在vs的解决方案资源管理器中,右键添加引用,选择浏览,选择jmail.dll文件,在Bin文件夹中就可以看到添加的JMail组件. 2.注册JMail组件:开始-->运行 ...

  6. Android之自己定义checkbox样式

    大部分情况下,我们在UI中并不採用android自带的checkbox复选框样式,这时候就须要我们自己定义自己的checkbox. 首先找两张checkbox背景图片.比方下图样子的: 然后在draw ...

  7. VS工程目录下的ipch文件夹和.sdf文件

    Visual Studio 2010工程目录下的ipch文件夹和.sdf文件 - web8 - 博客园http://www.cnblogs.com/web100/archive/2012/12/21/ ...

  8. ProcessBuilder执行本地命令

    /**关键技术剖析 * 用本命令名和命令的参数选项构造ProcessBuilder对象,它的start方法执行命令,启动一个进程,返回一个Process对象 * ProcessBuilder的envi ...

  9. IOS开发经验总结(二)

    本文转载至 http://dreamahui.iteye.com/blog/1878922 IOS开发总结 by mhmwadm (感谢mhmwadm) 2013/4/10 1 XCode快捷键 4  ...

  10. angular4 *ngFor获取index

    angular 中的*ngFor指令的使用 <ul> <li *ngFor="let item in items">{{item}}</li> ...