jenkins pipeline整合jacoco统计单元测试覆盖率

一  前提条件

首先需要在jenkins中安装jacoco插件

    在Manage plugins配置项里面搜索jacoco,安装JaCoCo code coverage reports 插件

    在maven的pom文件中加入插件

             
                org.apache.maven.plugins
                maven-surefire-plugin
                
                    
                    
                        **/*Test*.java
                    

                

            

maven的这个插件会在target下生成测试报告

注意:java的单元测试注解必须是org.junit.Test,否则将生成不了报告,maven识别不了

 

最后配置流水线

pipeline {
    agent any
    tools {
        jdk 'jdk1.8'
    }
    stages {
        stage('Checkout'){
            steps{
                 echo "starting fetchCode from ${params.repoUrl}......"
                // Get some code from a GitHub repository
               // git branch: '${GIT_BRANCH}', credentialsId:'d82aaf65-3389-4c65-aa6f-1e98be7c31a4', url: '${GIT_URL}'
            }
        }
        
        stage('单元测试') {
            steps {
              echo "starting unitTest......"
              //注入jacoco插件配置,clean test执行单元测试代码. All tests should pass.
              bat "mvn org.jacoco:jacoco-maven-plugin:prepare-agent -f ${pomPath} clean test -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true"
              junit '**/target/surefire-reports/*.xml'
              //配置单元测试覆盖率要求,未达到要求pipeline将会fail,code coverage.LineCoverage>20%.
              jacoco changeBuildStatus: true, maximumLineCoverage:"20"
            }
        }
        
        stage('部署测试环境') { 
            steps {
                echo "starting buiding......"
                //编译和打包
                bat "mvn  -f ${pomPath} clean package -Dautoconfig.skip=true -Dmaven.test.skip=true"
                echo "end of building ......"
            }
        }
       
    }
}

 

脚本中的一些参数是在流水线的参数中配置好的,可以参考之前的文章。

实际应用中,我们可能会吧脚本在程序后端动态生成,这样就可以动态的控制流水线了,

这需要通过http远程加载脚本

需要在jenkins安装插件,Http Request Plugin

安装后在具体的pipeline的jenkinsfile中写入

node{
    def response = httpRequest contentType:'APPLICATION_JSON',
        httpMode:"GET",
        url:"http://localhost:9001/jenkins/project/getScript?jobName=allen-jenkins",
        outputFile: "Jenkinsfile"
    
    println "Write jenkins file done"
        load "Jenkinsfile"
}

这个就是从远端加载脚本并执行,

远端返回的就是一个字符串

pipeline {
    agent any
    tools {
        jdk 'jdk1.8'
    }
    stages {
        stage('Checkout'){
            steps{
                 echo "starting fetchCode from ${params.repoUrl}......"
                // Get some code from a GitHub repository
               // git branch: 'master', credentialsId:'d82aaf65-3389-4c65-aa6f-1e98be7c31a4', url: 'https://git.synnex.org/scm/onetool/monitortool.git'
            }
        }
        
        stage('单元测试') {
            steps {
              echo"work place  is ${WORKSPACE}"
              echo "starting unitTest......"
              //注入jacoco插件配置,clean test执行单元测试代码. All tests should pass.
              bat "mvn org.jacoco:jacoco-maven-plugin:prepare-agent -f jddl-app-server/pom.xml clean test -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true"
              junit '**/target/surefire-reports/*.xml'
              //配置单元测试覆盖率要求,未达到要求pipeline将会fail,code coverage.LineCoverage>20%.
              jacoco changeBuildStatus: true, maximumLineCoverage:"20"
              echo "jar path is ${WORKSPACE}/target/"
            }
        }
        
       
    }
}

中间将一些参数进行了替换:

 

遇到的问题:

有时候通过远程加载脚本和直接运行脚本,他们的WORKPLACE可能不一样,这样容易导致mvn构建的时候找不到pom文件,这个问题当我们在脚本中加入重新拉去代码的逻辑后,又正常了

 

 

你可能感兴趣的:(问题总结)