代码扫描工具
1. sonar
2.ali的stc平台用的是:findbugs 和 pmd
参考:
测试框架:使用SONAR分析代码质量
配置sonar、jenkins进行持续审查
1、Sonar介绍
Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
长清网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。成都创新互联于2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联。
同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
它主要的核心价值体现在如下几个方面:
检查代码是否遵循编程标准:如命名规范,编写的规范等。
检查设计存在的潜在缺陷:SonarQub e 通 过插 件 F indbugs、Checkstyl e 等 工具检测代码存在的缺陷。
检测代码的重复代码量:SonarQub e 可 以展示项目中存在大量复制粘贴的代码。
检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。
SonarQub e 平 台是 由 4 个 部分组成:
SonarQube Server
SonarQube Database
SonarQube Plugins
SonarQube Scanner
2、配置数据库
Apache Derby 是Sonar自带并且默认安装使用的数据库,此外Sonar对如下数据库提供支持:MySQL 5.x, Oracle 10g XE, Postgresql, MS SqlServer等,本文以mysql为例介绍如何配置数据库:
1)创建数据库
在mysql中执行如下脚本创建数据库及mysql用户
$ ${SONAR_HOME}/war/build-war.sh
c. 启动Tomcat, 通过 http://localhost:8080/sonar 访问.
Tomcat安装配置参见:CenOS系统中安装Tomcat7并设置为自启动服务
4.启动服务
sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh stop ## 停止服务 sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh start ## 启动服务 sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh restart ## 重启服务 sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh console ## 控制台启动 sudo tail -f /opt/sonarqube-6.2/logs/sonar.log ## 查看日志
5、配置插件
浏览器访问 http://centos:9000/sonar,用预设的管理员账号(admin/admin)登陆;
在线安装:进入插件中心 (Administration / System / Update Center / Available Plugins) 找到所需的插件,点击右侧的 “Install” 开始安装;
![代码扫描工具](data:image/png;base64,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<a title=)
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nati21cmVyxozERRclfvCDxNixyWg0tWpV+pln0vvd/2os/EHKKd+XZ6vILywjukuccqwG/vjH9FNPpe69N7FoUfKKKxI1NYlzzklcfHHy2mtTt9+e+vWv0089NfDmmwNHjnhZKvhr4MiR9J496aeeSj34YOr225PTpiUuvjhxzjmJmprkFVck77gjde+96aeeGti3z++SIm+knPJ9ebaK/MIyotvzlGM10Ns78N576d//PtXSklqyJDljRqKuLnHeeYnq6sTYscnp01OLFqV++9v0M88M7N070N3tb2kxGAPd3QNvv51+5pnUb36TWrQo2dCQGDs2UV2dOO+8RF1dcsaM1NKlqZaW9PPPD7z33kDc6UfvUQlIOeX78mwV+YVlRHcZpByZge7ugb170888k/rtb1OLFiWnT9fOiMmbbkpOnZq8+ebUkiWp5ub0ww+nn302/cYbA/v3E4N8NNDdPbB/f3rHjvSzz6YffjjV3JxasiR5883JqVOTs2YlIpFEdXXissuS06enFi9O/fa36WefHdi7N9tLHcFEyinfl2eryC+BX8ZX394f+GUcvLJNOTIDR46k33or/cIL6U2bUmvXpu68M3nLLcmGhuTPfpa48MJEdXXizDMTP/lJYty45KRJyVmzUosWpVatSm/cmN62Ld3RMfD++1wOK8DAkSMD77+f7uhIP/106n/+J7VqVWrRouSsWclJkxLjxiV+8pPEmWcmqqsTo0YlJ0xINjQkb7kldeedqbVr05s2pV94If3WW6z2EOrpTwU/5Xz7v+/3Pa+QcoSCvYxv7z+4YOMLFy/8H78LUu5mPL7vnvaDfleG/397d9sUxZXoATwfIR/lvvBNcmtr3d2zW50Ly467s5Mge2EiKxqfrglEXZksi6zWUjFcSF2SrjIKKQvU5Tq4g+L6gCZmQuAS43hFRbwyrjoYNvgAM1DDY98XPQ/nnD7d08MM0zPN/1f9gunpPn36zNj955zTmE3Lc3PLExPLIyNLAwNL588vnjix+MknCwcPLrz//sLmzfNO5zwhC2+/PU/IfHHxvMu1UFGxsHXrwrvvLuzfv9DQsHj48GJr6+KxY4snTiydObN04cLStWtL3367NDy8PDa2PD6+/PJlwT2ivByNLr98uTw+vjw2tjQ8vDQ0tHTt2tKFC0tnziyeOLF47Nhia+vi4cMLDQ0L+/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">
离线安装:在线安装容易失败,可尝试离线安装,下载插件 jar 文件至插件目录下,并重启 SonarQube 生效;
插件 jar 文件的下载地址,可以到在线安装页找到插件的 Homepage 再找 releases,如下:
- Git: 已自带安装;
- SVN: 已自带安装;
- Java: 已自带安装,Java 源代码解析,计算指标等;
- JavaScript: 已自带安装;
- Chinese Pack:SonarQube 页面汉化;
- Findbugs
- Checkstyle
- PMD
- SonarGraph
插件的离线安装脚本如下:
-
cd /opt/sonarqube-6.2/extensions/plugins/
-
sudo rm -rf sonar-csharp-plugin-*.jar
-
sudo wget https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.13/sonar-l10n-zh-plugin-1.13.jar
-
sudo wget https://github.com/SonarQubeCommunity/sonar-findbugs/releases/download/3.4.4/sonar-findbugs-plugin-3.4.4.jar
-
sudo wget https://github.com/SonarQubeCommunity/sonar-checkstyle/releases/download/2.4/sonar-checkstyle-plugin-2.4.jar
-
sudo wget https://github.com/SonarQubeCommunity/sonar-pmd/releases/download/2.6/sonar-pmd-plugin-2.6.jar
-
sudo wget https://github.com/SonarQubeCommunity/sonar-sonargraph/releases/download/sonar-sonargraph-plugin-3.5/sonar-sonargraph-plugin-3.5.jar
-
sudo /opt/sonarqube-6.2/bin/linux-x86-64/sonar.sh restart ## 重启服务
-
## 注意:不完整的 wget 下载文件必须删掉,否则会导致 SonarQube 启动失败!
a)插件介绍
Sonar支持多种插件,将下载后的插件上传到${SONAR_HOME}extensions\plugins目录下,重新启动sonar。
sonar默认集成了Java Ecosystem插件,该插件是一组插件的合集
-
Java [sonar-java-plugin]:java源代码解析,计算指标等
-
Squid [sonar-squid-java-plugin]:检查违反Sonar定义规则的代码
-
Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle检查违反统一代码编写风格的代码
-
FindBugs [sonar-findbugs-plugin]:使用FindBugs检查违反规则的缺陷代码
-
PMD [sonar-pmd-plugin]:使用pmd检查违反规则的代码
-
Surefire [sonar-surefire-plugin]:使用Surefire执行单元测试
-
Cobertura [sonar-cobertura-plugin]:使用Cobertura获取代码覆盖率
-
JaCoCo [sonar-jacoco-plugin]:使用JaCOCO获取代码覆盖率
生成认证令牌(Token)
外部系统(比如 Jenkins)访问 SonarQube 时要用到;
进入:Administration(配置) / Security(权限) / User(用户),找到用户 admin,点击 “Tokens” 一列;
弹出界面里:输入 TokenName=”admin”, 点击 “Generate”, 生成 “8687b74188c446f2e02ec6eb5ee9d80b88048406”
部署至 Tomcat
上面是 Sonar 以独立 server 方式运行,也可以改为集成至 Tomcat:
## 注意修改 $TOMCAT_HOME/bin/catalina.sh 初始内存 1G+ sudo /opt/sonarqube-6.2/war/build-war.sh ## 将sonar达成一个war包 sudo cp /opt/sonarqube-6.2/war/sonar.war %TOMCAT_BASE/web-apps/
二、与jenkins集成
1、通过Maven进行集成
修改maven的主配置文件(${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件),在其中增加访问Sonar数据库及Sonar服务地址,添加如下配置:
-
-
-
sonar
-
-
-
-
jdbc:mysql://localhost:3306/sonar
-
-
com.mysql.jdbc.Driver
-
-
sonar
-
-
sonar
-
-
http://localhost:9000
-
-
-
-
-
-
-
-
sonar
-
-
此处注意sonar.host.url地址应根据sonar部署情况修改
同样,为了避免内存溢出,推荐增加内存堆栈的大小。设置MAVEN_OPTS环境变量:
set MAVEN_OPTS=”-Xmx512m -XX:MaxPermSize=256m”
使用Sonar
a. 运行Sonar服务器;
b. 通过 mvn sonar:sonar 将代码注入到Sonar中进行分析处理,并将处理结果以XML的形式保存在数据库中;
c. 通过浏览器访问,显示分析结果;
d. 持续运行Maven构建,会迭代显示分析结果;
e. 可以显式指定sonar插件的版本,如下:
-
-
-
-
-
org.codehaus.sonar
-
sonar-maven-plugin
-
3.5.1
-
-
-
-
f. 可以显式的将sonar绑定到Maven生命周期中,如下:
-
-
org.codehaus.sonar
-
sonar-maven-plugin
-
3.5.1
-
-
-
sonar
-
site
-
-
sonar
-
-
-
-
此时,指定Maven的site声明周期时,则会自动调用sonar.sonar 命令.
2、直接与Jenkins集成
在jenkins的插件管理中选择安装SonarQube Plugin,该插件可以使项目每次构建都调用sonar进行代码度量。
安装完毕后,进入:系统管理 / 系统设置 / SonarQube servers, 点击 “Add SonarQube” 按钮:
- Name: SonarQube-6.2
- Server URL: http://centos:9000/sonar
- Server version: 5.3 or higher
- Server authentication token: 8687b74188c446f2e02ec6eb5ee9d80b88048406(前面 SonarQube 生成的)
Jenkins 会把构建结果通过 URL和认证令牌发送给 SonarQube
![](data:image/png;base64,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
<br>
网站标题:代码扫描工具 <br>
网站网址:<a href=)
http://cdjierui.cn/article/geeigh.html