SonarQube平台介绍
代码分析与审计
代码审计工具平台
- 综合新的代码分析平台
- sonar支持自定义规则,较多公司使用
- IDE辅助功能
- xcode、android studio
- 阿里巴巴java开发手册ide插件支持
- 独立的静态分析工具
- findbugs、androidlint studio
- 阿里巴巴java开发手册ide插件支持
- 独立的静态分析工具
- findbugs、androidlint、scan-build
- pmd阿里巴巴java开发手册pmd插件
代码审计关注的质量指标
- 代码坏味道
- 代码规范
- 技术债评估
- bug和漏洞
- 代码重复度
- 单测与集成
- 测试用例数量
- 覆盖率
静态分析技术分类
- 代码静态检查
- 代码分析:lint系列,通过分析语法树和源代码,检查代码规范
- 编译器分析:借助编译器获得代码关系
- 字节码静态分析
- 分析jar、war、dex等格式的文件,代表工具:findbugs
SonarQube平台
官方网站:https://www.sonarqube.org/
官方文档:https://docs.sonarqube.org/latest/
SonarQube插件:https://www.sonarplugins.com/
SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。
主要的核心价值体现在如下几个方面:
- 检查代码是否遵循编程标准:如命名规范,编写的规范等。
- 检查设计存在的潜在缺陷:SonarQube 通过插件 Findbugs、Checkstyle 等工具检测代码存在的缺陷。
- 检测代码的重复代码量:SonarQube 可以展示项目中存在大量复制粘贴的代码。
- 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
- 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。
SonarQube 平台主要是由 4 个部分组成
- SonarQube Server
- SonarQube Database
- SonarQube Plugins
- SonarQube Scanner
SonarQube平台工作流程
SonarQube 在进行代码质量管理时,会从下图 所示的七个纬度来分析项目的质量。
SonarQube执行流程
SonarQube结合Git、Jenkins的代码持续审查执行流程。SonarQube 需要数据库的支持,用于存储检测项目后的分析数据,同时为了实现可持续监测,还需要持续集成工具(如Jenkins)的支持,在构建版本前,通过Jenkins+Sonar 插件执行项目分析指令,最终的结果会通过SonarQube 服务器的Web 页面展示。下图是使用SonarQube做代码持续审查的流程图:
SonarQube平台安装与配置
注意:sonar7.9之后版本不支持mysql,oracle必须使用ojdbc7或者更高版本
环境准备
- 系统:CentOS8
- 数据库:postgres
- SonarQube,最新的版本
- Docker
安装
我们使用Docker安装SonarQube
postgres
拉取postgres镜像
1
[root@localhost ~]# docker pull postgres
启动postgres容器
1
[root@localhost ~]# docker run -d --name sonarqube_postgres -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar postgres
默认端口:5432
###sonarqube
拉取sonarqube镜像
1
[root@localhost ~]# docker pull sonarqube
lts表示稳定版
启动sonarqube容器
1
[root@localhost ~]# docker run -d --name sonarqube -p 9000:9000 --link sonarqube_postgres -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_postgres:5432/sonar -v sonarqube_data:/opt/sonarqube/data -v sonarqube_extensions:/opt/sonarqube/extensions -v sonarqube_logs:/opt/sonarqube/logs sonarqube
数据卷:
- sonarqube_data:数据
- sonarqube_extensions:插件
- sonarqube_logs:日志
启动容器后,报错解决
查看容器日志:
docker logs -f 容器id|容器name
错误信息
1
2
3
4
5
6
7
8
9
10……
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
2020.08.19 08:04:37 INFO es[][o.e.n.Node] stopping ...
2020.08.19 08:04:37 INFO es[][o.e.n.Node] stopped
2020.08.19 08:04:37 INFO es[][o.e.n.Node] closing ...
2020.08.19 08:04:37 INFO es[][o.e.n.Node] closed
2020.08.19 08:04:37 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 78
2020.08.19 08:04:37 INFO app[][o.s.a.SchedulerImpl] Process[es] is stopped
2020.08.19 08:04:37 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped从上面的log查看错误
1
2ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决方案
1
2
3# vi /etc/sysctl.conf # 修改本地文件的内存大小值(添加,vm.max_map_count = 655360)
# sysctl -p
# 再次启动SonarQube,docker restart 容器id|容器name
以上安装步骤相当麻烦,是否可以有一次性搞定的方案呢?我们可以使用docker-compose进行容器编排的操作,编写docker-compose.yml文件
1 | version: "3" |
注意:SonarQube在扫描代码是不能指定分支的,默认写死了master,如果修改分支则需要sonarqube-community-branch-plugin-1.6.0.jar插件,该插件的Github地址:https://github.com/mc1arke/sonarqube-community-branch-plugin
访问
- 访问地址:http://ip:9000/
- 用户名:admin/admin
admin/admin登录后,会提示修改密码
SonarQube安装插件
登录进入首页,点击”Administration” -> “Marketplace”,注意:登录的账户有管理员的权限
例如Java语言常用的相关插件:Checkstyle、Findbugs、SonarJava、PMD
插件安装会放到docker数据卷sonarqube_extensions,进入数据卷查看安装的插件
也可到sonar插件的网站:https://www.sonarplugins.com/
,搜索对应的插件下载,下载完成的插件放到数据sonarqube_extensions目录下,重启SonarQube即可。
代码扫描规则定制
SonarQube官网对不同语言指定了很多规则,通过扫描出来的结果,也是分高低优先级,但是有些规则不一定是根据我们编码可现的,如果用现有的规则扫描会误报很多的问题,因此我们的规则有效、直观,进行规则制定。
定制规则是要由开发的规则规范来定制,可以参考阿里巴巴开发手册进行定制:https://github.com/alibaba/p3c