zoukankan      html  css  js  c++  java
  • 【Jenkins使用之八】jenkins集成SonarQube-质量检查

    环境
      CentOS Linux release 7.6.1810
      jdk1.8.0_65
      apache-tomcat-8.5.45
      Jenkins-2.235.5
      apache-maven-3.6.3
      git-2.9.5
      gradle-6.6.1
      SonarQube-6.7.7(LTS)
      sonar-scanner-cli-4.2.0.1873
    拓扑:
    node1:安装GitLab、SonarQube
    node2:安装Jenkins、Git、MAVEN

    一、SonarQube集成sonar-pmd-p3c
    1、sonar常用插件
    soanrQube有一些需要用到的插件,用于代码分析。
    由于这些插件都是jar包所以可以直接去中央仓库查询下载即可,下载地址有:
    https://search.maven.org/
    https://mvnrepository.com/
    将下载后的插件上传到${SONAR_HOME}extensionsplugins目录下,重新启动sonar。
    sonar默认集成了Java Ecosystem插件,该插件是一组插件的合集
    (1)Java [sonar-java-plugin]:java源代码解析,计算指标等
    (2)Squid [sonar-squid-java-plugin]:检查违反Sonar定义规则的代码
    (3)Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle检查违反统一代码编写风格的代码
    (4)FindBugs [sonar-findbugs-plugin]:使用FindBugs检查违反规则的缺陷代码
    (5)PMD [sonar-pmd-plugin]:使用pmd检查违反规则的代码
    (6)Surefire [sonar-surefire-plugin]:使用Surefire执行单元测试
    (7)Cobertura [sonar-cobertura-plugin]:使用Cobertura获取代码覆盖率
    (8)JaCoCo [sonar-jacoco-plugin]:使用JaCOCO获取代码覆盖率
    常用的插件:
    (1)JavaScript代码检查:http://docs.codehaus.org/display/SONAR/JavaScript+Plugin
    (2)Python代码检查:http://docs.codehaus.org/display/SONAR/Python+Plugin
    (3)Web页面检查(HTML、JSP、JSF、Ruby、PHP等):http://docs.codehaus.org/display/SONAR/Web+Plugin
    (4)xml文件检查:http://docs.codehaus.org/display/SONAR/XML+Plugin
    (5)scm源码库统计分析:http://docs.codehaus.org/display/SONAR/SCM+Stats+Plugin
    (6)文件度量:http://docs.codehaus.org/display/SONAR/Tab+Metrics+Plugin
    (7)中文语言包:http://docs.codehaus.org/display/SONAR/Chinese+Pack
    (8)时间表显示度量结果:http://docs.codehaus.org/display/SONAR/Timeline+Plugin
    (9)度量结果演进图:http://docs.codehaus.org/display/SONAR/Motion+Chart+Plugin
    (10)插件配置示例(本段内容来自http://www.ibm.com/developerworks/cn/java/j-lo-sonar/

    2、SonarQube集成pmd-p3c

    2、SonarQube集成pmd-p3c
    (1)去github:https://github.com/mrprince/sonar-p3c-pmd 下载源码,编译打包:sonar-pmd-plugin-2.6.jar.
    注意:SonarQube高版本依赖的p3c插件不同,注意选择。
    (2)将sonar-pmd-plugin-2.6.jar放到/usr/local/sonarqube-6.7.7/extensions/plugins下面重启sonarqube
    (3)sonarqube新增质量配置 并将新设置的p3c设置为默认规则


    (4)激活p3c规则 这样sonarqube在分析java项目时就使用p3c规则了

    二、jenkins集成SonarQube
    准备工作
    (1)jenkins新建一个Multibranch Pipeline项目,并设置Jenkinsfile所在的Git源

    (2)SonarQube默认允许任何人执行源码分析,因此生产环境中使用会有安全隐患。
    (2.1)设置禁止非登录用户使用


    (2.2)为SonarQube用户生成Token,Jenkins只能通过Token与SonarQube集成,比如这里使用登录用户Administator


    (2.3)在执行mvn命令时需要加入sonar.login参数

    -Dsonar.login=2f8d3d2538d2b577d2621ab3571e3ce72f7a225f

    在持续集成Jenkins使用SonarQube有三种方式:
    第一种:借助maven中的sonar插件,然后jenkins运行mvn命令执行扫描
    (1)maven项目pom.xml要添加sonar-maven-plugin插件

    <plugin>
        <groupId>org.sonarsource.scanner.maven</groupId>
        <artifactId>sonar-maven-plugin</artifactId>
        <version>3.6.0.1398</version>
    </plugin>

    (2)编写Pipeline

    pipeline{
        agent any
        options {
            ansiColor('xterm')
        }
        stages{
            //这里将Jenkinsfile和要编译的代码分开存放
            //默认拉取Jenkinsfile  然后按照里面的pipeline来设置拉取代码和后续操作
            stage("代码下载"){
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitlab-root-ssh', url: 'git@192.168.82.46:wjy/archivetest.git']]])
                }
            }
            //sonar检查
            stage("sonar检查"){
                steps {
                    sh "mvn clean package org.sonarsource.scanner.maven:sonar-maven-plugin:3.6.0.1398:sonar -Dsonar.host.url=http://192.168.118.106:9000 -Dsonar.login=2f8d3d2538d2b577d2621ab3571e3ce72f7a225f -Dmaven.test.skip=true"
                }
            }
        }
    }

    (3)BlueOcean构建

    报错:如果选用sonar-maven-plugin-3.4.1.1168或者3.7.0.1746会报错:Could not find goal 3.4.1.1168 XXX among avilable goals
    换个版本就能解决:3.6.0.1398

    (4)查看sonarQube检查结果


    第二种:Jenkins安装sonar-scanner插件,使用插件来扫描

    (1)安装SonarQube Scanner for Jenkins插件

    (2)配置SonarQube Scanner for Jenkins插件

    设置Jenkins访问Sonarqube的authtoken,类型是Secret text

    (3)设置Sonarqube Webhooks,由于不同代码规模不同,分析耗时不同,当sonarqube分析完成后主动通知jenkins

    (4)编写pipeline

    pipeline{
        agent any
        stages{
            //这里将Jenkinsfile和要编译的代码分开存放
            //默认拉取Jenkinsfile  然后按照里面的pipeline来设置拉取代码和后续操作
            stage("代码下载"){
                steps {
                    dir("archivetest"){
                        checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitlab-root-ssh', url: 'git@192.168.82.46:wjy/archivetest.git']]])
                    }
                }
            }
            stage("代码静态检查"){
                steps {
                    dir("archivetest"){
                        withSonarQubeEnv('sonarqube') {
                            sh "mvn clean package org.sonarsource.scanner.maven:sonar-maven-plugin:3.6.0.1398:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_AUTH_TOKEN} -Dmaven.test.skip=true"                    
                        }
                    }
                }
            }
            stage("质量阈"){
                steps {
                    dir("archivetest"){
                        timeout(time:15,unit:'MINUTES'){
                            waitForQualityGate abortPipeline:true
                        }
                    }
                }
            }
        }
    }

    使用timeout插件 避免网络超时时jenkins一直处于等待状态;

    使用withSonarQubeEnv是一个SonarQube环境变量包装器 可以将第二步配置的Sonarqube的服务端地址和authtoken在闭包内部使用SONAR_HOST_URL和SONAR_AUTH_TOKEN两个变量来使用,注意withSonarQubeEnv参数就是第(2)步骤里的Name;
    waitForQualityGate是告诉jenkins等待SonarQube根据Quality Gates返回的分析结果,使用参数abortPipeline 为true代表当质量检查不合格时将 pipeline状态设置为UNSTABLE;

    (5)构建

    第三种:Jenkins整合sonar-scanner客户端,jenkins调用sonar-scanner命令来执行扫描

    (1)Jenkins所在机器安装sonar-scanner客户端,我这里装的是sonar-scanner-cli-4.2.0.1873-linux
    下载地址:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/

    配置安装路径

    修改sonar-scanner.properties 指定SonarQube server地址

    [root@node2 conf]# cat sonar-scanner.properties 
    #Configure here general information about the environment, such as SonarQube server connection details for example
    #No information about specific project should appear here
    #----- Default SonarQube server
    sonar.host.url=http://192.168.118.106:9000
    #----- Default source code encoding
    #sonar.sourceEncoding=UTF-8

    (2)代码项目下面添加sonar-project.properties文件

    # 项目key 保证唯一
    sonar.projectKey=archivetest
    # 项目名字
    sonar.projectName=archivetest
    sonar.projectVersion=1.0.0
    sonar.language=java
    sonar.modules=java-module
    
    # sonar.sources是源文件所在的目录 注意如果下面还有css文件会要求安装Node.js
    java-module.sonar.sources=src/main/java
    java-module.sonar.projectBaseDir=.
    # 指定class目录 从sonarQube 4.12开始,sonar将会进行程序的动态检查,不配置sonar.java.binaries属性将会出错
    sonar.java.binaries=target/classes
    # Encoding of the source code. Default is default system encoding
    sonar.sourceEncoding=UTF-8

    (3)编写pipeline

    pipeline{
        agent any
        options {
            ansiColor('xterm')
        }
        stages{
            //这里将Jenkinsfile和要编译的代码分开存放
            //默认拉取Jenkinsfile  然后按照里面的pipeline来设置拉取代码和后续操作
            stage("代码下载"){
                steps {
                    dir("archivetest"){
                        checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitlab-root-ssh', url: 'git@192.168.82.46:wjy/archivetest.git']]])
                        sh "mvn clean install -Dmaven.test.skip=true"
                        sh "/usr/local/sonar-scanner-4.2.0.1873/bin/sonar-scanner -Dsonar.host.url=http://192.168.118.106:9000 -Dsonar.login=2f8d3d2538d2b577d2621ab3571e3ce72f7a225f"                    
                    }
                }
            }
        }
    }

    (4)BlueOcean构建

    (5)查看sonarQube检查结果


    参考:
    持续集成Jenkins+sonarqube部署教程

  • 相关阅读:
    png 图片的缩放
    数据结构>图的最短路径
    2007年7月25日在博客园的排名上升到前400名
    C# 汉字转拼音(全拼)
    修改 Linux 主机名
    C# 事件的继承
    一个实现了 IDisposable 接口的基类
    Windows 防火墙上也有端口映射功能
    网上邻居不能访问的问题
    令网站提速的7大秘方
  • 原文地址:https://www.cnblogs.com/cac2020/p/13679726.html
Copyright © 2011-2022 走看看