一、前言
在上一篇中我们讲解了SonarQube
的部署,在日常开发中SonarQube往往是基于现有的Gitlab
、Jenkins
集成配合使用的,以便在项目拉取代码后进行代码审查。若是存在多套环境的情况下,例如有开发环境、测试环境、生产环境等,我是不建议在生产环境中去进行代码审查的,一来进行重复的代码审查没有意义,二来比较浪费时间,所以建议只在开发环境开启代码审查即可。
二、在Jenkins中集成SonarQube
2.1 在sonarQube中生成token
2.2 在Jenkins中安装SonarQube Scanner插件
2.3 在Jenkins中添加SonarQube凭证
选择Secret text 作为凭证类型,如下所示:
完成后如下所示:
2.4 在Jenkins系统配置中配置SonarQube
2.5 关闭审查结果上传 SCM 功能
三、代码审查
3.1 非流水线项目
- 新建非流水线项目
- 编写Execute shell测试脚本
内容如下:
echo "开始编译和打包" mvn install mvn clean package echo "编译和打包结束"
- 添加构建步骤Execute SonarQube Scanner
内容如下:
#项目的key(自定义) sonar.projectKey=springboot_demo #项目名称 sonar.projectName=springboot_demo #项目版本号 sonar.projectVersion=1.0 #需要分析的源码的目录,多个目录用英文逗号隔开 sonar.sources=src #需要忽略的目录 sonar.exclusions=**/test/** # 字节码文件所在位置 sonar.java.binaries=target/classes #关闭审查结果上传到SCM 功能 sonar.scm.disabled=true
3.2 流水线项目一
- 新建非流水线项目
- 项目根目录下创建Jenkins文件
内容如下:
pipeline{ agent any stages{ stage('拉取代码'){ steps{ checkout([ $class: 'GitSCM', branches: [ [ name: '*/master' ] ], doGenerateSubmoduleConfigurations: false, extensions: [ ], submoduleCfg: [ ], userRemoteConfigs: [ [ credentialsId: 'git_sshkey', url: 'http://192.168.10.189/xiaohezi/springboot_demo2.git' ] ] ]) } } stage('SonarQube checking') { steps { script { //引入SonarQubeScanner工具 scannerHome = tool 'sonar-scanner' } //引入SonarQube的服务器环境 withSonarQubeEnv('sonarqube9.4') { sh "${scannerHome}/bin/sonar-scanner" } } } stage('编译构建') { steps { sh "mvn clean package -Dmaven.test.skip=true" println('打包完成!') } } }}
注:sonar-scanner是在Jenkins全局工具中配置自动安装的。
- 项目根目录下创建sonar-project.properties文件
- 内容如下:
#项目的key(自定义)sonar.projectKey=springboot_demo2#项目名称sonar.projectName=springboot_demo2#项目版本号sonar.projectVersion=1.0 #需要分析的源码的目录,多个目录用英文逗号隔开sonar.sources=src#需要忽略的目录sonar.exclusions=**/test/**# 字节码文件所在位置sonar.java.binaries=.#关闭审查结果上传到SCM 功能sonar.scm.disabled=true
3.3 流水线项目二
注:将脚本放在Jenkins中。
内容如下:
pipeline{ agent any stages{ stage('拉取代码'){ steps{ checkout([ $class: 'GitSCM', branches: [ [ name: '*/master' ] ], doGenerateSubmoduleConfigurations: false, extensions: [ ], submoduleCfg: [ ], userRemoteConfigs: [ [ credentialsId: 'git_sshkey', url: 'http://192.168.10.189/xiaohezi/springboot_demo2.git' ] ] ]) } } stage('SonarQube checking') { steps { script { //引入SonarQubeScanner工具 scannerHome = tool 'sonar-scanner' } //引入SonarQube的服务器环境 withSonarQubeEnv('sonarqube9.4') { sh "${scannerHome}/bin/sonar-scanner" } } } stage('编译构建') { steps { sh "mvn clean package -Dmaven.test.skip=true" println('打包完成!') } } }}
- 项目根目录下创建sonar-project.properties文件
内容如下:
#项目的key(自定义)sonar.projectKey=springboot_demo2#项目名称sonar.projectName=springboot_demo2#项目版本号sonar.projectVersion=1.0 #需要分析的源码的目录,多个目录用英文逗号隔开sonar.sources=src#需要忽略的目录sonar.exclusions=**/test/**# 字节码文件所在位置sonar.java.binaries=.#关闭审查结果上传到SCM 功能sonar.scm.disabled=true
3.4 流水线项目三(微服务项目)
微服务项目中需要在每个项目下都建立sonar-project.properties
文件,在Jenkins的脚本中需要循环去checking每个微服务。
例如以下示例:
stage('sonarQube代码质量检查') { steps { script { if("${params.sonarQube}".trim() == "yes") { for (service in ServicesBuild) { def workspace = "dayu-" println "当前进行代码质量检查是:${service}" if("${service}".trim() == "dayu-gateway" || "${service}".trim() == "dayu-auth" || "${service}".trim() == "dayu-admin"){ workspace = "${workspace}" + "${service}".trim().split("-")[1] } if("${service}".trim() == "dayu-user" || "${service}".trim() == "dayu-search" || "${service}".trim() == "dayu-report"){ workspace = "dayu-modules/" + "${workspace}" + "modules-" + "${service}".trim().split("-")[1] } //定义当前Jenkins的SonarQubeScanner工具 scannerHome = tool 'sonar-scanner' //引用当前JenkinsSonarQube环境 withSonarQubeEnv('sonarqube9.4') { sh """ cd ${workspace} ${scannerHome}/bin/sonar-scanner """ } } }else{ println "是no,跳过sonarQube代码质量检查" } } } }
- 下载Windows平台的扫描器
地址如下:
https://docs.sonarqube.org/9.4/analysis/scan/sonarscanner/
- 将 bin 目录添加到 %PATH% 环境变量
- 项目根目录下执行命令
注:由于微服务名称及文件夹不同,对应处理拼接处理即可。