【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设置为默认规则

【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查【Jenkins使用之八】jenkins集成SonarQube-质量检查【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查
(4)激活p3c规则 这样sonarqube在分析java项目时就使用p3c规则了

【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查

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

【Jenkins使用之八】jenkins集成SonarQube-质量检查

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

【Jenkins使用之八】jenkins集成SonarQube-质量检查
(2.2)为SonarQube用户生成Token,Jenkins只能通过Token与SonarQube集成,比如这里使用登录用户Administator

【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查
(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构建

【Jenkins使用之八】jenkins集成SonarQube-质量检查

报错:如果选用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使用之八】jenkins集成SonarQube-质量检查
第二种:Jenkins安装sonar-scanner插件,使用插件来扫描

(1)安装SonarQube Scanner for Jenkins插件

(2)配置SonarQube Scanner for Jenkins插件

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

【Jenkins使用之八】jenkins集成SonarQube-质量检查

【Jenkins使用之八】jenkins集成SonarQube-质量检查

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

【Jenkins使用之八】jenkins集成SonarQube-质量检查

(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;
【Jenkins使用之八】jenkins集成SonarQube-质量检查

(5)构建

【Jenkins使用之八】jenkins集成SonarQube-质量检查

第三种: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/

配置安装路径

【Jenkins使用之八】jenkins集成SonarQube-质量检查

修改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构建

【Jenkins使用之八】jenkins集成SonarQube-质量检查

(5)查看sonarQube检查结果

【Jenkins使用之八】jenkins集成SonarQube-质量检查
参考:
持续集成Jenkins+sonarqube部署教程