DevOps之持续集成SonarQube代码质量扫描
一、SonarQube介绍
SonarQube是一个用于代码质量检测管理的开放平台,可以集成不同的检测工具,代码分析工具,以及持续集成工具。SonarQube 并不是简单地把不同的代码检查工具结果直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化。
SonarQube不仅提供了对 IDE 的支持,可以在Eclipse和IntelliJ IDEA这些工具里联机查看结果;同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用SonarQube,另外Sonar的插件还可以对Java以外的其他编程语言提供支持。
二、代码质量
1.编码规范:是否遵守了编码规范,遵循了最佳实践。
2.潜在的BUG:可能在最坏情况下出现问题的代码,以及存在安全漏洞的代码。
3.文档和注释:过少(缺少必要信息)、过多(没有信息量)、过时的文档或注释。
4.重复代码:违反了Don’tRepeat Yourself原则。
5.复杂度:代码结构太复杂(如圈复杂度高),难以理解、测试和维护。
6.测试覆盖率:编写单元测试,特别是针对复杂代码的测试覆盖是否足够。
7.设计与架构:是否高内聚、低耦合,依赖最少。
三、SonarQube部署
1、部署SonarQube
官方地址
https://www.sonarqube.org/downloads/
①Sonar需要至少JDK 1.8及以上版本
#解压上传的jdk#
tar xf jdk-8u161-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1..0_161 /usr/local/jdk
ln -s /usr/local/jdk/bin/java /usr/bin/java
#配置环境变量#
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
②部署SonarQube数据库(mysql5.6 或者更高版本)
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-.noarch.rpm
yum install mysql-community-server
systemctl start mysqld.service
#初次安装mysql是root账户是没有密码的#
set password for ‘root’@‘localhost’ = password('mypasswd');
flush privileges;
执行SQL语句
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar@pw';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar@pw';
FLUSH PRIVILEGES;
配置Sonar数据库
vim /usr/local/sonarqube/conf/sonar.properties sonar.web.host=0.0.0.0 #监听的IP地址
sonar.web.port= #监听的端口
sonar.jdbc.username=sonar #数据库用户名
sonar.jdbc.password=sonar@pw #数据库密码
sonar.jdbc.url=jdbc:mysql://192.168.29.176:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
Oracle数据库
手动复制驱动类到${SONAR_HOME}/extensions/jdbc-driver/oracle/目录下
参考官方文档:http://docs.sonarqube.org/display/HOME/SonarQube+Platform
③启动SonarQube
/usr/local/sonarqube/bin/linux-x86-/sonar.sh start
tail /usr/local/sonarqube/logs/sonar.log #日志文件
Web页面登陆:http://IP:9003 默认为9000端口,默认用户名密码admin/admin
④SonarQube插件
存放插件目录/usr/local/sonarqube/extensions/plugins/
Sonar页面汉化:Chinese Pack

2、SonarQube Scanner扫描器
①官方文档
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
#Sonar通过Scanner(扫描器)来对代码进行质量分析#
②下载Scanner扫描器
#上传插件包:sonar-scanner-2.8.zip#
unzip sonar-scanner-2.8.zip
mv sonar-scanner-2.8 /usr/local/
ln -s /usr/local/sonar-scanner-2.8/ /usr/local/sonar-scanner
③SonarQube集成Scanner
vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://192.168.29.175:9006 #sonar地址
sonar.sourceEncoding=UTF- #字符集
sonar.jdbc.username=sonar #数据库账号
sonar.jdbc.password=sonar@pw #数据库密码
sonar.jdbc.url=jdbc:mysql://192.168.29.175:3306/sonar?useUnicode=true&characterEncoding=utf8 #数据库连接地址
④项目代码库测试
github:https://github.com/SonarSource/sonar-examples
下载软件包:https://github.com/SonarSource/sonar-examples/archive/master.zip
⑤项目代码下配置sonar-project.properties
sonar.projectKey=
sonar.projectName=#这个名称会显示在Sonar的web页面
sonar.projectVersion=
sonar.sources=. #源码路径
sonar.language=java
sonar.sourceEncoding=UTF-
⑥代码质量扫描
#进入到项目下执行#
/usr/local/sonar-scanner/bin/sonar-scanner
部分扫描Log信息
INFO: Java Main Files AST scan (done) | time=28351ms
INFO: Java Test Files AST scan
INFO: source files to be analyzed
INFO: / source files have been analyzed
INFO: Java Test Files AST scan (done) | time=0ms
INFO: Sensor JavaSquidSensor [java] (done) | time=28795ms
INFO: Sensor NoSonar Sensor [php]
INFO: Sensor NoSonar Sensor [php] (done) | time=0ms
INFO: Sensor CoberturaSensor [cobertura]
INFO: / source files have been analyzed
WARN: Cobertura report not found at /app/idc/apps/jenkins/work/workspace/12ctb_thematic_web/target/site/cobertura/coverage.xml
INFO: Sensor CoberturaSensor [cobertura] (done) | time=1ms
INFO: Sensor Coverage Report Import [csharp]
INFO: Sensor Coverage Report Import [csharp] (done) | time=0ms
INFO: Sensor Coverage Report Import [csharp]
INFO: Sensor Coverage Report Import [csharp] (done) | time=0ms
INFO: Sensor Unit Test Results Import [csharp]
INFO: Sensor Unit Test Results Import [csharp] (done) | time=0ms
INFO: Sensor SurefireSensor [java]
INFO: parsing /app/idc/apps/jenkins/work/workspace/12ctb_thematic_web/target/surefire-reports
INFO: Sensor SurefireSensor [java] (done) | time=1ms
INFO: Sensor JaCoCoSensor [java]
INFO: JaCoCoSensor: JaCoCo report not found : /app/idc/apps/jenkins/work/workspace/12ctb_thematic_web/target/jacoco.exec
INFO: Sensor JaCoCoSensor [java] (done) | time=1ms
INFO: Sensor JaCoCoItSensor [java]
INFO: JaCoCoItSensor: JaCoCo IT report not found: /app/idc/apps/jenkins/work/workspace/12ctb_thematic_web/target/jacoco-it.exec
INFO: Sensor JaCoCoItSensor [java] (done) | time=0ms
INFO: Sensor JaCoCoOverallSensor [java]
INFO: Sensor JaCoCoOverallSensor [java] (done) | time=0ms
INFO: Sensor XmlFileSensor [java]
INFO: Sensor XmlFileSensor [java] (done) | time=2ms
INFO: Sensor Analyzer for "php.ini" files [php]
3、Jenkins集成SonarQube
①安装插件:SonarQube Scanner
Jenkins-系统管理-插件管理
②Jenkins集成Sonar

4、SonarQube遇到的问题
①ERROR: Error during SonarQube Scanner execution
ERROR: Error during SonarQube Scanner execution
org.sonar.squidbridge.api.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property
at org.sonar.java.JavaClasspath.init(JavaClasspath.java:)
at org.sonar.java.AbstractJavaClasspath.getElements(AbstractJavaClasspath.java:)
at org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:)
at org.sonar.java.JavaSquid.<init>(JavaSquid.java:)
at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:)
at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:)
at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:)
at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:)
at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:)
at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:)
at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:)
at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:)
at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:)
at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:)
at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:)
at org.sonar.batch.bootstrapper.Batch.doExecuteTask(Batch.java:)
at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:)
at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:)
at com.sun.proxy.$Proxy0.execute(Unknown Source)
at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:)
at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:)
at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:)
at org.sonarsource.scanner.cli.Main.execute(Main.java:)
at org.sonarsource.scanner.cli.Main.main(Main.java:)
ERROR:
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.
[Pipeline]
解决:SonarQube6.7.6版本下面的sonar-java插件为 sonar-java-plugin-4.15.0.12310.jar
更换为其他版本:sonar-java-plugin-4.3.0.7717.jar
插件地址:
https://github.com/SonarSource/sonar-java
②Sonar - OutOfMemoryError: Java heap space
#在sonar.properties文件中排除对一些无用扩展名文件进行扫描
sonar.exclusions=**/*.doc,**/*.docx,**/*.ipch #SonarQube Scanner 2.5以上的版本修改扫描器参数
export SONAR_SCANNER_OPTS="-Xmx3062m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=128m"
DevOps之持续集成SonarQube代码质量扫描的更多相关文章
- SonarQube代码质量扫描持续集成
1.安装JDK和配置JAVA_HOME和CLASSPATH 2.安装mysql数据库 3.创建数据库和用户 mysql -u root -p mysql> CREATE DATABASE son ...
- Jenkins 集成Sonar代码质量扫描
Jenkins上安装插件 在jenkins插件安装界面安装: 插件名 SonarQube Scanner for Jenkins Jenkins上配置 jenkins中操作:系统管理-系统设置,找到 ...
- jenkins+sonarQube代码质量扫描 并排除指定的目录
sonar.projectKey=dev1-news-paymentsonar.projectName=dev1-news-paymentsonar.projectVersion=$BUILD_NUM ...
- 持续集成之代码质量管理-Sonar [三]
转载:https://www.abcdocker.com/abcdocker/2053 摘要 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工 ...
- Windows安装使用SonarQube7.4 对java项目进行代码质量扫描
我这里使用7.4因为使用JDK是1.8 其它版本看下依赖版本就好 1.下载7.4版本安装包 https://binaries.sonarsource.com/CommercialDistributio ...
- 通过静态分析和持续集成 保证代码的质量 (Helix QAC)2
续上.... 第二章 部署示例:Jenkins and Helix QAC工具 第一节 Jenkins 作为持续集成系统 现在有很多持续集成工具,既有免费的,也有商业的.最近的研究显示,Jenkins ...
- 通过静态分析和持续集成 保证代码的质量 (Helix QAC)1
前言 现代软件开发团队面临着很多挑战,这些挑战包括:产品交付期限越来越紧,团队的分布越来越广,软件的复杂度越来越高,而且对软件的质量要求越来越高. 本文分为两个章节.第一章讨论持续集成的原理,持续集成 ...
- SonarQube部署及代码质量扫描入门教程
一.前言 1.本文主要内容 CentOS7下SonarQube部署 Maven扫描Java项目并将扫描结果提交到SonarQube Server SonarQube扫描报表介绍 2.环境信息 工具/环 ...
- 持续集成之代码质量管理-Sonar
原文:http://blog.csdn.net/abcdocker/article/details/53840582 Sonar介绍 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Son ...
随机推荐
- Django开发—如何重置migration
情景一:不需要原有的数据库数据 删除数据库所有的表删除项目的migration模块中的所有 文件,除了init.py 文件执行脚本 python3 manage.py makemigrations p ...
- 浅谈 MySQL的预编译
之前的一篇 Mybatis中 #{}和${}的区别 中涉及到通过 SQL预编译和 #{} 传值 的方式防止SQL注入. 由此引发了想了解预编译的想法.那么什么是预编译那? 一.三个阶段: 词法和语义解 ...
- tomcat7远程代码执行 ImageMagick 命令执行漏洞
tomcat7远程代码执行 windows / linux ::$DATA ImageMagick 命令执行漏洞(CVE-2016–3714) base64编码
- USACO1.6 Superprime Rib
题目传送门 每一个特殊质数都会被从右边切掉,所以除了首位外的其它位数一定都不会是偶数,只能是$1$,$3$,$5$,$7$,$9$ 而每一个特殊质数的首位一定是质数,也就是$2$,$3$,$5$,$7 ...
- 【VS开发】使用 NuGet 管理项目库
NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Microsoft 在全球的员工人数接近 90,000, ...
- Revo Uninstaller Pro - 真正彻底卸载软件不留垃圾的强大神器!(清理安装残留文件/注册表)
大家都知道 Windows 在卸载软件时总是不够彻底,系统C盘总会留下大量难以辨别和清理的垃圾文件和临时文件,时间长了注册表也会变得非常臃肿,不仅浪费硬盘空间,而且也会明显拖慢系统响应和启动速度. R ...
- python 并发编程 基于gevent模块 协程池 实现并发的套接字通信
基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...
- ICPC Asia Nanning 2017 F. The Chosen One (大数、规律、2的k次幂)
Welcome to the 2017 ACM-ICPC Asia Nanning Regional Contest.Here is a breaking news. Now you have a c ...
- vultr vps 开启BBR加速 (CentOS 7)
上个月买的vultr的vps 感觉看视频还是比较慢的 于是上网找教程开启BBR加速 在这里记录一下 以后可能会用到 BBR 是 Google 提出的一种新型拥塞控制算法,可以使 Linux 服务器显著 ...
- spring boot-1.简单介绍及环境搭建
1.简介 spring boot 是在spring 基础上进行了全面整合的架构,个人认为优点在于以下几点: 1.简化配置,甚至零配置即可开发出一个web应用.spring boot 默认配置了大量的s ...