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){
}
打包