question

为什么要做静态代码扫描,何时做,怎么做

static code analysis

Dynamic Analysis:

code coverage

sufficiency

quality of unit tests

memory leaks

sonar插件开发

....

简介

Sonar(SonarQube)是一个开源的静态代码扫描(Sonar Scanner)和度量的平台,通过插件形式,可以支持多种语言的质量管理和检测,自定义扫描规则(插件形式)

工作流程: sonarlint(Realtime Analysis) -> =push to= -> scm(版本管理工具) -> jenkins(CI工具) -> Code Analysis sonarQube Scanners -> =push reports to =-> SQ -> SonarQube Database

Sonar 架构

B/S架构,通过插件形式,支持多种语言

一个SonarQube服务器 启动3个主要进程:

Web服务器,管理员浏览质量快照并配置SonarQube实例

基于ES的搜索服务器,可以从页面返回搜索结果

负责处理代码分析报告并将其保存在SQ数据库中的计算机引擎服务器

SonarQube数据库存储:

SonarQube实例配置文件

项目质量快照,视图等

多个SonarQube插件安装在服务器上,可能包括语言,SCM,集成,身份验证和治理插件

一个或多个SQ扫描器在分析项目,运行在构建或持续集成等服务器上

插件

PMD

CheckStyle

Findbugs

工作原理:

Sonanqube-scanner:负责搜集代码相关数据,存入mysql

SonarQube: 负责对搜集的数据进行分析 ELastic Search搜索服务器,通过不同的插件算法来对这些结果再加工,最终以量化的方式来衡量代码质量,最终展示给用户

AST抽象语法树(Abstract Syntax Tree)

Sonar是从七个维度检测代码质量

不遵循代码标准

Sonar可以通过PMD、CheckStyle、Findbugs等代码检测工具规范代码编写

潜在缺陷

糟糕的复杂度分布:

对于程序中任何组件的改变都将可能导致需要全面的回归测试

重复的代码

注释不足或者过多

缺乏单元测试

糟糕的设计

通过sonar找出循环,展示包与包,类与类之间相互依赖关系,检测耦合。。LCOM4

Sonar-Scanner

sonar自定义规则

自定义rules

sonar提供xpath和java方式扩展

步骤:

创建一个SonarQube插件

增加相关依赖

创建自定义规则

public class Mysonar implements Plugin{
public void define(Context context){
//server extensions -> object are instantiated during server startup
// Server启动实例化
context.addExtension(MyjavaRulesDefinition.class);
// bactch extension -> objects are instantiated during code analysis
//分析代码实例化
context.addExtension(MyJavaFileCheckRegistrar.class);
}
}
//创建规则
BaseTreeVisitor
public void visitVariable(VariableTree tree){
}

打包