TIPS
本文基于 Community Edition版本 8.9.3 (build 48735),理论支持6.0及更高版本
SonarQube 是一个开源的代码质量管理系统,可用来快速定位代码中的Bug、漏洞以及不优雅的代码。它支持几乎所有的常见编程语言,例如 Java、JavaScript、TypeScript、Kotlin、Ruby、Go, Scala 等。并且还有插件机制,利用插件,可以让 SonarQube 更加强大,例如可以整合 Findbugs、PMD、Checkstyle 等。可以说,SonarQube 是一款提升项目代码质量必备的根据。
系统需求
- X64的操作系统
- JDK(对于7.9.x,那么需要JDK 11或更高版;对于6.x - 7.8.x,需要JDK 8或更高版本)
- 2G内存
其他需求详见:https://docs.sonarqube.org/8.9/requirements/requirements/
TIPS
- 《其他需求》建议大家参照一下,里面探讨如何修改Linux文件描述符限制等说明;
- 上面贴的是是8.9版的链接,如果你使用的是其他版本,只需将版本名称改掉即可,例如改为7.8即可查看7.8.x的需求。
下载
前往 https://www.sonarqube.org/downloads/ ,按照如图说明下载即可。建议下载 LTS 版本,以便获得长期的维护与支持。
TIPS
- 只有社区版支持直接安装插件(方便)
- 非社区版需要 license 激活,初次使用推荐使用社区版,后续如需其他版本再做版本替换,数据库无缝衔接(试切换未出问题,不保证一定无缝衔接)
安装与启动(Oracle JRE 11 or OpenJDK 11)
- 服务器下载安装包(示例)
# 网络顺畅版 wget -c -np https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.3.48735.zip -O sonarqube.zip # 通过代理下载(断点续传,不追溯父目录) wget -c -np -e "https_proxy=http://[username]:[password]@[proxy_ip]:[port]" https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.3.48735.zip -O sonarqube.zip --no-check-certificate
- [username]: 用户名
- [password]: 密码
- [proxy_ip]: 代理主机ip
- [port]: 代理主机端口
- 解压安装包(根据个人习惯解压到特定目录,这里解压到
/usr/local/sonarqube
)unzip sonarqube.zip -d /usr/local/sonarqube
- 根据你的操作系统,切换到相应的目录。例如,当前使用的
CentOS
,则可切换到linux-x86-64
目录。├── bin │ ├── jsw-license │ ├── linux-x86-64 │ ├── macosx-universal-64 │ └── windows-x86-64
- 执行如下命令即可启动 SonarQube
./sonar.sh start
当然,该shell还有其他命令,可输入
./sonar.sh --help
或者./sonar.sh
查阅。 - 稍等片刻,访问 http://localhost:9000/ 即可看到类似如下的界面,说明安装成功。
- 停止 SonarQube,只需执行
./sonar.sh stop
即可。 - 如需重启,只需执行
./sonar.sh restart
即可。
管理员登录
访问:http://localhost:9000
账号:admin
密码:admin
生产环境可用
默认情况下,SonarQube 使用的是 H2 数据库,这是一款非常流行的嵌入式数据库。但生产环境中,SonarQube 并不建议使用 H2。SonarQube 支持多种数据库,例如 Oracle、PostgreSQL、SQL Server 等。下面,我们以 PostgreSQL 为例,让 SonarQube 使用 PostgreSQL 存储数据。
TIPS
支持的数据库及数据库版本请前往这篇文档查看,避免 SonarQube 不支持你的数据库版本以及注意点。
https://docs.sonarqube.org/8.9/requirements/requirements/
举个例子:SonarQube 8.9 要求使用 PostgreSQL 9.6 或者 PostgreSQL 10 以上,并且必须配置使用UTF-8
配置 PostgreSQL
数据库
- 修改配置文件:
$SONARQUBE_HOME/conf/sonar.properties
$SONARQUBE_HOME 为 sonarqube 目录,当前为/usr/local/sonarqube
- 在
pgsql
创建数据库CREATE DATABASE "sonar" WITH OWNER = "erbantou" ENCODING = 'UTF8';
- 找到类似如下的内容:
#----- PostgreSQL 9.6 or greater # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema". #sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
在这行下面,添加如下内容(以 localhost 为例):
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonar?currentSchema=public sonar.jdbc.username=erbantou sonar.jdbc.password=277353
这里,数据库地址、账号、密码根据你的需求修改。
- 执行
./sonar.sh restart
,重启 SonarQube 。观察 PostgreSQL,可以发现,此时SonarQube 会自动在 PostgreSQL 数据库中建表并插入初始化数据。 - 类似的方式,你也可以为你的 SonarQube 配置其他数据库。
设置systemd-unit服务
- 添加服务配置文件
/etc/systemd/system/sonarqube.service
[Unit] Description=SonarQube After=network.target [Service] LimitCORE=infinity LimitNOFICE=100000 LimitNPROC=100000 LimitNOFILE=131072 Type=forking ExecStart=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start ExecReload=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart ExecStop=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh stop User=sonar Group=sonar PrivateTmp=true Restart=always RestartSec=5 StartLimitInterval=0 [Install] WantedBy=multi-user.target
LimitXXXX 用于解决系统资源限制问题
- 服务相关命令
# 重新加载服务配置 systemctl daemon-reload # 设置为开机启动服务 systemctl enable sonarqube.service # 移除开机启动服务 systemctl disable sonarqube.service # 启动服务 systemctl start sonarqube.service # 停止服务 systemctl stop sonarqube.service # 重启服务 systemctl restart sonarqube.service # 查看服务 systemctl status sonarqube.service
整合 Maven
- 在 Maven 的全局配置文件:
$MAVEN_PATH/conf/settings.xml
(也可能是.m2/settings.xml
看你是怎么配置 Maven 的)中添加如下内容:<profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.jdbc.url>jdbc:postgresql://localhost/sonar?currentSchema=public</sonar.jdbc.url> <sonar.jdbc.driver>org.postgresql.Driver</sonar.jdbc.driver> <sonar.jdbc.username>erbantou</sonar.jdbc.username> <sonar.jdbc.password>erbantou</sonar.jdbc.password> <sonar.host.url>http://127.0.0.1:9000</sonar.host.url> </properties> </profile>
- 到 Maven 项目的根目录执行如下命令,即可使用 SonarQube 分析项目:
右上角头像- 我的账号 - 安全
页中,在生成令牌
中填入你的Token
名称,并点击生成
按钮,生成token
mvn sonar:sonar \ -Dsonar.java.binaries=target/sonar \ -Dsonar.projectKey=sonar-demo \ -Dsonar.host.url=http://172.22.26.247:9000 \ -Dsonar.login=87e6577e3839bfeb81f3c44900fa6b2686758e58 # 或者 mvn sonar:sonar \ -Dsonar.java.binaries=target/sonar \ -Dsonar.projectKey=sonar-demo\ -Dsonar.host.url=http://172.22.26.247:9000 \ -Dsonar.login=admin \ -Dsonar.password=277353
等待片刻后,项目构建成功:
[INFO] Spring Cloud YES ................................... SUCCESS [ 12.431 s] [INFO] xxx ................................................ SKIPPED [INFO] xxx ................................................ SKIPPED [INFO] xxx ................................................ SKIPPED [INFO] xxx ................................................ SKIPPED
- 此时,再次访问 http://localhost:9000 ,即可看到对应分析结果。
插件安装
SonarQube有一个强大的插件机制。以安装汉化插件为例:
- 按照图示进行操作:
- 点击
Install
按钮后,将会弹出重启 SonarQube 的提示,点击即可重启。 - 类似的方式,也可为 SonarQube 安装其他插件。
常见问题
-
Java 版本问题
- 服务器 JDK 为非 JDK11+ 版本,则需先下载 JDK11+ 版本,以 Oracle JDK11 为例,先到官网下载 Oracle JDK11
- 解压 JDK 到指定目录,如 /usr/java/jkd11
- 更改 SonarQube 使用的 Java JVM,编辑
$SONARQUBE-HOME/conf/wrapper.conf
并更新以下行:wrapper.java.command=/usr/java/jkd11/bin/java
-
SonarQube 无法以 root 身份运行
sonarqube 启动时,log 目录下的 es.log 报错:
java.lang.RuntimeException: can not run elasticsearch as root
原因:
SonarQube 无法在基于 Unix 的系统上以 root 用户身份运行,因此如有必要,创建一个专用用户帐户以用于 SonarQube。解决方法:
# 1. 创建新用户 sonar $ adduser sonar # 2. 为 sonar 创建密码 $ passwd sonar # 3. 修改 sonarqube 的目录和用户组为 sonar $ chown -R sonar:sonar /usr/local/sonarqube
-
Configuring the Elasticsearch storage path
默认情况下,Elasticsearch 数据存储在
$SONARQUBE-HOME/data
中,但不建议将其用于生产实例。 相反,您应该将此数据存储在其他位置,最好是在具有快速 I/O 的专用卷中。除了保持可接受的性能外,这样做还可以简化 SonarQube 的升级。编辑
$SONARQUBE-HOME/conf/sonar.properties
以配置以下设置:sonar.path.data=/var/sonarqube/data sonar.path.temp=/var/sonarqube/temp
用于启动 SonarQube 的用户必须具有对这些目录的读写权限。
-
默认系统限制
23 [2] bootstrap checks failed 24 [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] 25 [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
1. 对于第一个错误
vim /etc/security/limits.conf
该文件为通过 PAM 登录的用户设置资源限制。它不影响系统服务的资源限制。后面设置服务单元的过程遇到这个坑,修改配置文件,在文件最后加入下面两个行。用户退出重新登录生效。* soft nofile 131072 * hard nofile 131072
重启后查看效果:open files (-n) 131072
[root@repo ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15071 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 131072 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 15071 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
对于设置 systemd service 的资源限制,可以在全局配置文件 /etc/systemd/system.conf 中的 DefaultLimitNOFILE/DefaultLimitNPROC 设置,系统默认没有配置,也可在对应的 service 单元中指定,参见设置systemd-unit服务。这里以单个服务单元中添加配置参数限制说明:
[root@repo ~]# systemctl status sonarqube ● sonarqube.service - sonarqube Loaded: loaded (/usr/lib/systemd/system/sonarqube.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-06-17 10:09:08 CST; 8h ago Process: 31938 ExecStop=/lvmdata/sonarqube/bin/linux-x86-64/sonar.sh stop (code=exited, status=0/SUCCESS) Process: 32119 ExecStart=/lvmdata/sonarqube/bin/linux-x86-64/sonar.sh start (code=exited, status=0/SUCCESS) Main PID: 32169 (wrapper) CGroup: /system.slice/sonarqube.service ├─32169 /lvmdata/sonarqube/bin/linux-x86-64/./wrapper /lvmdata/sonarqube/bin/linux-x86-64/../../conf/wrapper.conf wrapper.syslog.ident=SonarQube wrapper.pidfile=/lvmdata/sonarqube/bin/linux-x86-64/.... ├─32171 /usr/local/jdk/bin/java -Dsonar.wrapped=true -Djava.awt.headless=true -Xms8m -Xmx32m -Djava.library.path=./lib -classpath ../../lib/jsw/wrapper-3.2.3.jar:../../lib/common/woodstox-core-lgpl-... ├─32200 /usr/local/jdk/bin/java -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.t... ├─32326 /usr/local/jdk/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/lvmdata/sonarqube/temp -XX:-OmitStackTraceInFastThrow --add-opens=java.base/java.util=ALL-UNNAMED --a... └─32426 /usr/local/jdk/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/lvmdata/sonarqube/temp -XX:-OmitStackTraceInFastThrow --add-opens=java.base/java.util=ALL-UNNAMED -Xm... Jun 17 10:09:07 VM_2_11_centos systemd[1]: Starting sonarqube... Jun 17 10:09:07 VM_2_11_centos sonar.sh[32119]: Starting SonarQube... Jun 17 10:09:08 VM_2_11_centos systemd[1]: Started sonarqube. [root@repo ~]# cat /proc/32169/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size unlimited unlimited bytes Max resident set unlimited unlimited bytes Max processes 131072 131072 processes Max open files 131072 131072 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 15071 15071 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
TIPS
非 root 用户的最大进程数为4096
,可在/etc/security/limits.d/20-nproc.conf
中查看2. 对于第二个错误,通过修改内核参数即可解决
# root用户 vim /etc/sysctl.conf # 添加以下配置 vm.max_map_count=131072 # 生效 sysctl -p
评论区