zoukankan      html  css  js  c++  java
  • HttpRunnerManager平台异步生成及展示代码覆盖率报告(ant+jacoco+jenkins+HttpRunnerManager)

    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='1222223333344444444445556666777777666'  
    -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平台查看报告:

     

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

  • 相关阅读:
    linux配置PHP环境!!(云服务器架设)
    JQ上传预览+存数据库
    AJAX做增删改查详细!
    JS解析XML
    UEditor编辑器的使用
    php注释规范
    phpexcel导出数据表格
    简单分析JavaScript中的面向对象
    制作smarty模版缓存文件
    求二叉树中节点的最大距离
  • 原文地址:https://www.cnblogs.com/snailgirl/p/10075135.html
Copyright © 2011-2022 走看看