liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台


基本和Mac安装的大致差不多

一,Sonar简介:

 


前言

现如今大家越来越认识到质量前移的重要性。如果一开始就写出优质的、经过测试的代码,那么后面的测试阶段将会减少很多不必要的时间。如果开发人员迫于业务压力,一味追求项目开发进度,往往会容易形成大量的“烂代码”。

一般的烂代码体现在逻辑混乱、复杂度高、易读性差、没有单元测试和缺乏必要的注释。如果把这样的“烂代码”编译交付测试团队,那么测试人员势必会发现很多低级缺陷,甚至连冒烟测试都无法通过,这样势必会浪费很多时间,延误测试进度。

所以,回到开始,为何不一开始就是写出优质代码呢?

代码评审

我们都知道很多公司都在推行DevOps、推行测试前移,就是让测试人员尽早参与研发过程中来,有很多团队推行了测试人员参与代码评审流程,但是往往效果不是很理想,原因通常是由于测试人员代码能力有限,不熟悉业务代码逻辑,当然也就无法发现正确问题,这样也就而导致测试团队的代码评审变成了摆设。那么问题来了,有什么办法解决这种状况吗?

如果测试人员在执行代码评审的时候可以借助一些代码扫描工具,然后针对这些扫描出的问题再进一步分析,这样轻易地可以发现一些真正代码问题。

SonarQube简介

在实际的项目中,我们一般使用的多种编程语言,那么我们需要针对多种编程语言的一种扫描工具。目前主流的是使用SonarQube代码质量分析平台。

SonarQube是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测, 如 Java、Python、Groovy、C#、C、C++等几十种编程语言的检测。

1.糟糕的复杂度分布

文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试

2.重复

显然程序中包含大量复制粘贴的代码是质量低下的

sonar可以展示源码中重复严重的地方

3.缺乏单元测试

sonar可以很方便地统计并展示单元测试覆盖率

4.没有代码标准

sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写

5.没有足够的或者过多的注释

没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降

而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷

6.潜在的bug

sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug

7.糟糕的设计(原文Spaghetti Design,意大利面式设计)

通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系

可以检测自定义的架构规则

通过sonar可以管理第三方的jar包

可以利用LCOM4检测单个任务规则的应用情况

检测耦合

SonarQube平台由4个组件组成:

å¨è¿éæå¥å¾çæè¿°

一个SonarQube服务器包含三个子进程(web服务(界面管理)、搜索服务、计算引擎服务(写入数据库))
一个SonarQube数据库配置SonarQube服务
多个SonarQube插件位于解压目录extensions\plugins目录
一个或者多个SonarQube Scanners 用于分析特定的项目
SonarQube主要工作流程

å¨è¿éæå¥å¾çæè¿°

开发人员使用开发工具(IDE)上传代码到GitLab(源代码管理器);
Jenkins(CI系统)SCM自动拉取代码到到编译服务器;
Sonar Scanners扫描该代码检查质量,将分析结果推送到SonarQube平台,进而持久化数据库存储;
开发&测试人员可以使用IDE插件来同步SonarQube结果(java和js版本等)并可以实时在线分析分析
领导可以通过Web访问SonarQube质量平台,项目代码质量趋势一目了然
 

二,安装方法

1. 下载并安装Jdk。

不做太多介绍大家可以参考:http://www.cnblogs.com/owenma/p/6139860.html或者http://www.oracle.com/technetwork/cn/java/archive-139210-zhs.html(官网)

2. 下载安装Mysql。

不做太多介绍大家可以参考:http://www.cnblogs.com/owenma/p/6394477.html

3. 下载 SonarQube和Sonar scanner。

SonarQube:http://www.sonarqube.org/downloads/,或者https://www.sonarqube.org/downloads/

或者wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.2.zip

unzip sonarqube-7.2.zip

Sonar scanner:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner,或者https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

4.数据库配置

下载好所有的安装包之后首先配置数据库:

进入数据库命令

#mysql -u root -p

mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';

mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

mysql> FLUSH PRIVILEGES;

5.安装sonar与sonar-scanner

将下载的sonarqube-6.7.zip包解压至Linux某路径如/opt/sonar

将下载的sonar-scanner-cli-3.0.3.778-linux.zip包解压某路径/usr/local

6.解压zip文件

(1)进入/sonar中,使用命令解压sonarqube-6.1.zip

unzipsonarqube-6.1.zip

(2)进入/sonar中,解压sonar-scanner-2.8.zip

unzip sonar-scanner-2.8.zip


7.修改Sonar和Sonar-Scanner相应的配置

配置sonar应用mysql

  修改配置文件sonar.properties

sonar.jdbc.username=sonar

sonar.jdbc.password=sonar

sonar.jdbc.url=jdbc:mysql://172.17.20.140:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

sonar.web.host=0.0.0.0

sonar.web.context=/sonar

sonar.web.port=9000

配置Sonar-Scanner 进行项目代码审查

  下载sonar-scanner,解压到任意目录,同样的修改sonar.properties 配置文件

# --------指定系统中sonar访问路径

sonar.host.url=http://localhost:9000/sonar

8.新增用户,并将目录所属权赋予该用户

useradd sonarchown -R sonar:sonar sonarqube-6.7.4/

chown -R sonar:sonar sonar/

chmod -R 777 sonar/

9.启动

su soanr

cd /opt/sonar/sonarqube-7.9.1/bin/linux-x86-64

sonar.sh start

cd /opt/sonar/sonarqube-7.9.1/bin/linux-x86-64/

sh sonar.sh console看启动日志

传文件:scp Downloads/sonarqube-6.7.7.zip [email protected]:/root

启动成功后


10,这里配置基本和sonar.properties相同,

注意:

(1)如果待测试项目与SonarQube服务不在同一台机器,则需要添加SonarQube服务的IP:

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第1张图片

image.png

(2)端口填写自己数据库端口,默认3306

3、配置环境变量

在文件末尾添加如下字段:  export SONAR_RUNNER_HOME=path to your Sonar-Scanner directory  export PATH=$PATH:$SONAR_RUNNER_HOME/bin  保存修改  使配置立即生效:source ~/.bash_profile

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第2张图片

bash_profile

注:这里配置特别容易出错,一定要写清楚sonar-runner的位置,并且最后执行source ~/.bash_profile命令

4、测试sonar-runner是否配置成功

打开终端,执行命令sonar-runner -v

sonar-runner -v

出现如下图则代表配置成功

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第3张图片

image.png

到这里 sonarqube,sonar-runner的配置基本完成,而接下来就是最为关键也是问题最多的地方,如何检测我们的项目(重点)

5、打开待测试的项目根目录

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第4张图片

image.png

新建sonar-project.properties文件并输入如下信息

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第5张图片

sonar-project.properties

注意:

sonar.projectKey是我们项目的名称

sonar.projectName是我们项目的名称

sonar.sources是源文件所在的目录(因为这里使用的框架是slim框架,入口为public,TP同理)

6、打开终端,进入待测试项目根目录,执行如下命令:

sonar-runner

注注注:这里一定要进去待测试项目根目录,如项目为test,你应该通过终端cd到test目录下执行该命令

执行会有一点时间,完成之后会出现以下界面

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第6张图片

sonar-runner

这里是操作成功的界面,而我们在执行sonar-runner命令时,会遇到很多问题,包括我自己,在执行命令的时候,也遇到一大堆问题,下面我列出自己所遇到的问题,给大家做个参考。

11,Jenkins部署

因为我们是用Jenkins做为后台的持续扫描调度服务,所以需要安装SonarQube Scanner For Jenkins插件,也就不需要安装其他的扫描器了。

å¨è¿éæå¥å¾çæè¿°

在Jenkins全局配置中SonarQube服务器连接详细信息的配置。然后,使用标准Jenkins工程构建步骤从Jenkins触发SonarQube扫描分析,支持触发方式包括:

SonarQube Scanner
SonarQube Scanner for Maven
SonarQube Scanner for Mave
SonarScanner for MSBuild
分析完成后,插件将检测到构建过程中是否进行了SonarQube分析,并在Jenkins工程页面上显示徽章和小部件,其中包含指向SonarQube平台的链接以及质量阀状态。
å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

打开构建结果的链接来查看具体的分析报告

关于Jenkins的配置:
在 Jenkins 项目构建过程中加入SonarScanner进行代码分析,首先需要在Jenkins工程的构建环境标签页中勾选"Prepare SonarQube Scanner evironment"

å¨è¿éæå¥å¾çæè¿°

配置SonarQube Scanner构建步骤

å¨è¿éæå¥å¾çæè¿°

Task to run: 输入 scan,即分析代码;
JDK :选择 SonarQube Scanner 使用的 JDK(注意这里必须是 JDK 不能是 JRE);
Path to project properties : 这里可以指定一个sonar-project.properties 文件,如果不指定的话会使用项目默认的 properties文件;
Analysis properties: 这里需要输入一些配置参数用来传递给 SonarQube,这里的参数优先级高于sonar-project.properties文件里面的参数,所以可以在这里来配置所有的参数以替代sonar-project.properties文件,下面列出了一些参数,sonar.language指定了要分析的开发语言(特定的开发语言对应了特定的规则),sonar.sources定义了需要分析的源代码位置(示例中的.所指示的是当前 Jenkins项目的目录),sonar.java.binaries 定义了需要分析代码的编译后文件位置;
Additional arguments 输入框中可以输入一些附加的参数,示例中的-X 意思是进入SonarQube Scanner的Debug 模式,这样会输出更多的日志信息;
JVM Options 可以输入在执行 SonarQube Scanner是需要的JVM参数。
关于质量阀状态关联编译结果
Jenkins支持每当代码分析无法满足SonarQube的质量标准时,即工程构建失败,Jenkins需要安装Quality Gates Plugin
 

å¨è¿éæå¥å¾çæè¿°

另外,在项目工程中需要增加“构建后操作”,不过此插件好像有个缺陷,Project key输入框不支持${variable}形式

å¨è¿éæå¥å¾çæè¿°

小团队持续代码扫描实践

技术方案&实现

1)原生的开源框架:Jenkins+SonarQube+Gitlab

å¨è¿éæå¥å¾çæè¿°

2)单点执行,满足小团队要求

å¨è¿éæå¥å¾çæè¿°

3)及时反馈机制:Jenkins的Montor view插件+钉钉群通知+Email通知
Montor view可以挂到团队电视看板上。

å¨è¿éæå¥å¾çæè¿°

钉钉群通知

å¨è¿éæå¥å¾çæè¿°

产品团队邮件通知

å¨è¿éæå¥å¾çæè¿°

4)手工配置为主

流程&标准

1)项目多分支开发模型

å¨è¿éæå¥å¾çæè¿°

2)Jenkins定时轮巡代码扫描
3)关注单个质量维度:代码违规
SonarQube支持多种维度代码扫描,如下图:

liunx+Jenkins+SonarQube+Gitlab搭建自动化持续代码扫描质量平台_第7张图片

基于保持简单的原则,主要从代码违规维度出发,代码规则和潜在Bug测试人员跟进审核,确认是否误报,提升测试人员代码评审能力。
å¨è¿éæå¥å¾çæè¿°

4)设置质量阀
å¨è¿éæå¥å¾çæè¿°

团队&文化
1)领导重视代码质量
2)团队成员积极性高
3)敏捷文化形成

写在最后
DevOps开发模式目前已成为当前各大互联网公司的主流文化或技术。在DevOps中依然离不开测试,测试人员如何融入其中去?可以说,在DevOps中想要做好测试,技术上需要很多要求,主要体现在以下方面:

代码基本功(Java、Python、shell、groovy)
工具链(Jenkins、Gitlab、maven、ant等)
容器(docker、k8s等)
操作系统(linux、ssh等)
自动化技术(Java服务端方向:Springboot、TestNG、MyBatis/JPA、MySQL、HttpClient、ExtentReport、dubbo、http/https、Postman、Mockito等)
性能测试技术(JMeter、Tomcat、Nginx、Redis、MongoDB、Telegraf、InfluxDB、Grafana、Nmon、JVM等)

当前DevOps已经很热,所以,不管是测试 or 开发 or 运维,都需要往DevOps靠拢,你的职业发展之路才能尽可能越来越牛逼。
————————————————
 

你可能感兴趣的:(sonar代码审计与分析)