SonarQube 是一个开源的代码质量管理平台,覆盖了代码质量的7个维度:Potential bugs,Complexity,Unit tests、Dupliactions,Architecture & Design、Comments、Coding rules。由于本人刚接触SonarQube,本文仅介绍SonarQube平台的搭建及在Gradle构建脚本中使用sonarqube插件的简单实践,更深入的使用方法请参考SonarQube in Action

安装MySQL

CentOS 7默认的仓库不包含MySQL数据库索引(默认为MariaDB),虽然MariaDB和MySQL的上层接口一致,但实践证实,SonarQube的确不支持MariaDB,于是这里介绍一下安装MySQL的过程。

$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
$ sudo yum install mysql-server

# Start MySQL Server
$ sudo systemctl enable mysqld
$ sudo systemctl start mysqld

# Reset MySQL root password
$ mysql_secure_installation

安装SonarQube

SonarQube最新的LTS版本为5.6.3,需要系统上安装OpenJDK 8,在笔者的“同一系统安装多个Java版本”一文中对Java环境的配置做了介绍,此处不赘述。

创建SonarQube数据库账户

# 首先使用root账户连接到MySQL数据
$ mysql -u root -p
Enter password:
...
# 然后使用如下命令创建sonar账户
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> FLUSH PRIVILEGES;

安装SonarQube

$ wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.3.zip
$ sudo unzip -d /usr/share sonarqube-5.6.3.zip
$ sudo ln -s /usr/share/sonar-5.6.3 /usr/bin/sonar
$ sudo ln -s /usr/bin/sonar/bin/linux-x86-64/sonar.sh /etc/init.d/sonar

配置并启动

编辑/usr/share/sonar-5.6.3/conf/sonar.properties文件,如下:

# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#----- MySQL 5.6 or greater
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

启动SonarQube:

$ sudo service sonar start

Gradle and SonarQube

编辑项目的build.gradle文件,添加如下内容:

plugins {
    id "org.sonarqube" version "2.2"
}

sonarqube {
    properties {
        // 更多配置参考Reference 1
        property "sonar.projectName", project.name
        property "sonar.projectKey", "$project.group:$project.name"
        property "sonar.sourceEncoding", "UTF-8"
    }   
}

添加gradle.properties文件,内容如下:

# SonarQube服务器地址
systemProp.sonar.host.url=http://10.0.63.202:9000

# 下面的配置已经弃用了,即使加上也会被忽略
#systemProp.sonar.jdbc.url=sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
#systemProp.sonar.jdbc.username=sonar
#systemProp.sonar.jdbc.password=sonar

# 如果SonarQube设置了 Force user authentication,则需要提供用户名密码将结果同步给SonarQube Server
systemProp.sonar.login=admin
systemProp.sonar.password=admin

LDAP 认证配置

在 Update Center 下载下载 LDAP 插件并配置/usr/share/sonar-5.6.3/conf/sonar.properties,添加如下内容:

# LDAP Configuration
sonar.security.realm=LDAP
sonar.security.savePassword=true
sonar.security.localUsers=admin
ldap.url=ldap://xxx.xxx.xxx.xxx:389
ldap.bindDn=uid=root,cn=users,dc=example,dc=com
ldap.bindPassword=secret

# User Configuration
ldap.user.baseDn=cn=users,dc=startimes,dc=me
# shodowExpire=-1 用来禁止失效用户登陆
ldap.user.request=(&(uid={login})(memberof=cn=gitlab-users,cn=groups,dc=example,dc=com)(shadowExpire=-1))
# sAMAccountName 用于 AD登陆
#ldap.user.request=(&(sAMAccountName={login})(memberof=cn=gitlab-users,cn=groups,dc=example,dc=com))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail

# Group Configuration
#ldap.group.baseDn=cn=groups,dc=example,dc=com
#ldap.group.request=(&(memberUid={uid}))
#ldap.group.idAttribute=cn

Email 配置

Administration => General Settings => Email

几个值得注意的问题:

  • SMTP username需要与From address相同
  • User secure connection可能是plaintext

以上问题都可通过设置sonar.log.level=DEBUG来查看,日志在 /usr/share/sonar-5.6.3/logs/sonar.log 中。