持续集成 SonarQube 分享 (一):介绍与安装

ymsun · March 26, 2017 · Last by 王理发修车铺 replied at July 05, 2018 · 14530 hits

背景介绍

SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码, 潜在bug, 代码风格问题,缺乏单元测试等问题, 并通过一个web ui展示出来。

1. 用户本地使用IDE的插件进行代码分析
2. 用户上传到源代码版本控制服务器
3. 持续集成,使用Sonar Scanner进行扫描
4. 将扫描结果上传到SonarQube服务器
5. SonarQube server将结果写入db
6. 用户通过web ui查看扫描结果
7. SonarQube导出结果到其他需要的服务

一、SonarQube的架构

  • Database
  • SonarQube Server
  • SonarQube Scanner
  • Project
  • Nginx (如果不需要通过nginx转发则不需要Nginx模块)

二、SonarQube的安装

1、环境准备

  • java环境
  • 数据库(支持SQL Server、Mysql、Oracle、PostgreSQL)

2、安装过程

(1)mysql创建user并授权(安装sonarqube6.3需要Mysql5.6以上)

> CREATE USER 'sonar’@'%' IDENTIFIED BY 'password';
> GRANT all privileges ON sonarqube.* TO sonar’@‘%' IDENTIFIED BY 'password';
> flush privileges;
> create database sonarqube;

(2)SonarQube Server搭建

下载地址

Downloads

sonarqube服务中配置修改:/conf/sonar.properties

sonar.web.host=0.0.0.0
sonar.web.port=9000
sonar.jdbc.username=sonar
sonar.jdbc.password=password
sonar.jdbc.url=jdbc:mysql://db_host:db_port/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
#sonar.web.context=/your_prefix //非必须,若需要在访问sonarqube服务时加上统一的前缀则配置此项

启动服务:sonarqube-6.3/bin/linux-x86-64

./sonar.sh start

stop服务

./sonar.sh stop

(3)SonarQube Scanner服务

下载地址

Downloads

sonar-scanner中配置修改:conf/sonar-scanner.properties

sonar.host.url=http://your_host:your_port/[your_prefix]

添加环境变量

export PATH=$PATH:/usr/local/sonar-scanner-2.9.0.670/bin

查看服务是否Ok

sonar-scanner -h 

文档:click here

(4)在Project中使用

将sonar-project.properties 放入需要扫描的project中

#sonar-project.properties内容如下
sonar.projectKey=project_key
sonar.projectName=project_name
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=py //需要扫描哪种语言的代码,如python:py,java:java
sonar.sourceEncoding=UTF-8
sonar.host.url=http://your_host:your_port/[your_prefix]

启动分析

sonar-scanner -X

上述是sonarqube的一些基本介绍与安装过程,下期继续分享一些实用的plugin~

共收到 13 条回复 时间 点赞

  很不错,有时间试试。

写的很详细,赞👍 🍻

期待后续!!

很不错的分享, 有一个问题是对于脚本语言是怎么静态扫出Bug呢,还是只能做style check?

py这类的脚本语言也有一些规则能扫出来,比如构造函数不能有返回。比如一些循环引用等等。

不错。

PS:sonarqube 目前也有 docker 镜像,部署起来效率更高:https://hub.docker.com/_/sonarqube/

根据这篇帖子,很轻松的搭建起了Sonar,期待后续进阶内容~

期待对 sonar 的分析,还有自定义规则

我用AS的插件可以分析代码,但是在使用Sonar runner的时候,报错如下:
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 3.184s
INFO: Final Memory: 52M/336M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
org.sonar.squidbridge.api.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property
at org.sonar.java.JavaClasspath.init(JavaClasspath.java:59)
at org.sonar.java.AbstractJavaClasspath.getElements(AbstractJavaClasspath.java:281)
at org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:141)
at org.sonar.java.JavaSquid.(JavaSquid.java:83)

我的sonar runner 在对本地安卓项目进行测试的时候,总是失败,报错如下,可以帮看看怎么解决吗?
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 3.184s
INFO: Final Memory: 52M/336M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
org.sonar.squidbridge.api.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property
at org.sonar.java.JavaClasspath.init(JavaClasspath.java:59)
at org.sonar.java.AbstractJavaClasspath.getElements(AbstractJavaClasspath.java:281)
at org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:141)
at org.sonar.java.JavaSquid.(JavaSquid.java:83)

楼主您好,谢谢您的分享。有个问题想请教一下,您知道如何通过java程序获取sonaqube的代码分析结果吗?比如bug数量,坏味道啊这些参数,谢谢。

ymsun #13 · March 08, 2018 作者
zhang 回复

sonarqube这些数据会存储到db里,你可以写脚本从db里获取你想要的信息输出到文件中。

扫描的时候需要将中红色的注释删除,不然会报错(乱码);

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up