SonarQube一款可持续检测的源代码工具,数千种静态代码自动检测规则,支持27种语言包括Java,C,C++,Objective-C,C#等,可扩展到任何规模项目
一、安装jdk

修改环境变量

vi /etc/profile
export JAVA_HOME=/data/sonarqube/jdk-11.0.14
export PATH=$JAVA_HOME/bin:$PATH
#export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

验证生效

# javac -version
javac 11.0.14

二、安装sonarqube

解压

unzip sonarqube-9.3.0.51899.zip

创建sonar用户

/usr/sbin/useradd --create-home --home-dir /usr/local/sonar --shell /bin/bash sonar

授权

chown -R sonar:sonar sonarqube-9.3.0.51899/

创建数据库实例

create user sonar with password 'sonar123';
create database sonar with owner sonar encoding 'utf8';
grant all on database sonar to postgres;

创建sonar数据目录

mkdir /data/sonar-data/
# chown -R sonar:sonar /data/sonar-data/

修改 properties文件

vi sonarqube-9.3.0.51899/conf/sonar.properties

sonar.jdbc.url=jdbc:postgresql://10.3.9.228:9999/sonar
sonar.jdbc.username=postgres
sonar.jdbc.password=Gsafety.123
sonar.path.data=/data/sonar-data/data
sonar.path.temp=/data/sonar-data/temp

启动

su - sonar -s /bin/sh -c "/data/sonarqube/sonarqube-9.3.0.51899/bin/linux-x86-64/sonar.sh start"
su - sonar -s /bin/sh -c "/data/sonarqube-9.3.0.51899/bin/linux-x86-64/sonar.sh start"

2022.04.22 09:47:21 WARN  app[][startup] ####################################################################################################################
2022.04.22 09:47:21 WARN  app[][startup] Default Administrator credentials are still being used. Make sure to change the password or deactivate the account.
2022.04.22 09:47:21 WARN  app[][startup] ####################################################################################################################
2022.04.22 09:47:25 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2022.04.22 09:47:25 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up

访问sonarqube地址

http://10.3.9.248:9000/

默认账号admin admin,首次登录后修改admin默认密码

三、故障解决

1. sonar服务启动失败,elasticsearch系统参数检查失败
问题描述

vi logs/es.log 
[2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决:
1)修改elasticsearch配置参数

vi /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_broadcasts = 1
vm.swappiness=0
net.core.somaxconn=1024
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_max_syn_backlog=1024

vm.max_map_count=262144

执行命令sysctl -p生效

# sysctl -p

2)修改最大文件数
vi /etc/security/limits.conf
末尾行添加

* soft nofile 65535
* hard nofile 65535

查看启动信息

cd /data/sonarqube/sonarqube-9.3.0.51899
su sonar ./bin/linux-x86-64/sonar.sh console

2. sonarqube启动后又关闭

1)问题描述 
在启动sonarqube服务后,服务已经启动,但是突然关闭

2022.04.22 10:32:52 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2022.04.22 10:32:52 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up
2022.04.22 10:34:01 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [ce]: 137
2022.04.22 10:34:01 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is stopped
2022.04.22 10:34:01 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [web]: 137
2022.04.22 10:34:01 INFO  app[][o.s.a.SchedulerImpl] Process[web] is stopped

经过很长时间的排查,发现日志当中并没有 WARN ERROR 的报错

2)问题分析:
sonarqube有三个关键的组件
elasticsearch
postgresql数据库
web-gui

sonarqube启动顺序也是按上面顺序,先启动elasticsearch、然后是连接数据库,然后是web-gui 
logs日志目录,也是按照这个顺序记录日志,在启动时分别产生:
access.log 针对web服务的日志,记录所有的访问记录。这个日志在sonar没有启动成功啥也没有,所以这个日志跟启动sonar没关系。
es.log:针对es组件的日志,也是sonarqube启动第一个运行的组件,这个日志有报错,那就是es的问题。
sonar.log:sonar服务的启动日志,记录所有组件的启动信息。
web.log:web-GUI 日志,web - GUI 界面想要启动,得满足 ES pg sonar 这三个要求。

3)定位日志

es的日志(es.log)

2022.04.22 10:32:41 INFO  es[][o.e.h.AbstractHttpServerTransport] publish_address {127.0.0.1:9001}, bound_addresses {127.0.0.1:9001}
2022.04.22 10:32:41 INFO  es[][o.e.n.Node] started
2022.04.22 10:32:41 INFO  es[][o.e.g.GatewayService] recovered [7] indices into cluster_state
2022.04.22 10:32:42 INFO  es[][o.e.c.r.a.AllocationService] Cluster health status changed from [RED] to [GREEN] (reason: [shards started [[metadatas][0]]]).
2022.04.22 10:34:01 INFO  es[][o.e.n.Node] stopping ...
2022.04.22 10:34:01 INFO  es[][o.e.n.Node] stopped
2022.04.22 10:34:01 INFO  es[][o.e.n.Node] closing ...
2022.04.22 10:34:01 INFO  es[][o.e.n.Node] closed

elasticsearch正常启动,之后服务停止,并且没有错误日志

sonar日志(sonar.log)

2022.04.22 10:32:52 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2022.04.22 10:32:52 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up
2022.04.22 10:34:01 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [ce]: 137
2022.04.22 10:34:01 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is stopped
2022.04.22 10:34:01 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [web]: 137
2022.04.22 10:34:01 INFO  app[][o.s.a.SchedulerImpl] Process[web] is stopped
2022.04.22 10:34:01 WARN  app[][o.s.a.p.ManagedProcessHandler] Interrupted while hard stopping process [key='es', ipcIndex=1, logFilenamePrefix=es] (currentThread=HardStopper-0)
java.lang.InterruptedException: null
    at java.base/java.lang.Object.wait(Native Method)
    at java.base/java.lang.Object.wait(Object.java:462)
    at java.base/java.util.concurrent.TimeUnit.timedWait(TimeUnit.java:408)
    at java.base/java.lang.ProcessImpl.waitFor(ProcessImpl.java:510)
    at org.sonar.application.process.AbstractManagedProcess.waitFor(AbstractManagedProcess.java:89)
    at org.sonar.application.process.EsManagedProcess.waitFor(EsManagedProcess.java:39)
    at org.sonar.application.process.ManagedProcessHandler.hardStopImpl(ManagedProcessHandler.java:166)
    at org.sonar.application.process.ManagedProcessHandler.hardStop(ManagedProcessHandler.java:122)
    at org.sonar.application.SchedulerImpl.hardStopProcess(SchedulerImpl.java:315)
    at org.sonar.application.SchedulerImpl.hardStopAll(SchedulerImpl.java:274)
    at org.sonar.application.SchedulerImpl.hardStopImpl(SchedulerImpl.java:260)
    at org.sonar.application.SchedulerImpl$HardStopperThread.run(SchedulerImpl.java:486)
2022.04.22 10:34:01 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 143

sonar服务也是正常启动,但是之后停止了。报错信息是从web-ui登录时,无法验证用户名,因为此时es已经挂了。

web日志(web.log )

xclusions=[]}]
2022.04.22 10:32:49 INFO  web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter org.sonar.server.authentication.ws.ValidateAction@5361c13b [pattern=UrlPattern{inclusions=[/api/authentication/validate], exclusions=[]}]
2022.04.22 10:32:49 INFO  web[][o.s.s.q.ProjectsInWarningDaemon] Counting number of projects in warning is not started as there are no projects in this situation.
2022.04.22 10:32:49 INFO  web[][o.s.s.p.p.PlatformLevelStartup] Running Community Edition
2022.04.22 10:32:49 INFO  web[][o.s.s.p.Platform] WebServer is operational

web服务启动,没有ERROR或者WARNING日志,查看INFO日志中的信息,也没有相应的提示问题的内容

数据库
登录pg数据库,查看sonar库下表是否正常创建

sonar-# \dt
 public   | active_rule_parameters    | 数据表 | postgres
 public   | active_rules              | 数据表 | postgres
 public   | alm_pats                  | 数据表 | postgres
 public   | alm_settings              | 数据表 | postgres
 public   | analysis_properties       | 数据表 | postgres
 public   | app_branch_project_branch | 数据表 | postgres
 public   | app_projects              | 数据表 | postgres
 public   | audits                    | 数据表 | postgres
 public   | ce_activity               | 数据表 | postgres
 public   | ce_queue                  | 数据表 | postgres
 public   | ce_scanner_context        | 数据表 | postgres
 public   | ce_task_characteristics   | 数据表 | postgres
 public   | ce_task_input             | 数据表 | postgres
 public   | ce_task_message           | 数据表 | postgres
 public   | components                | 数据表 | postgres
 public   | default_qprofiles         | 数据表 | postgres
 public   | deprecated_rule_keys      | 数据表 | postgres
 public   | duplications_index        | 数据表 | postgres
 public   | es_queue                  | 数据表 | postgres
 public   | event_component_changes   | 数据表 | postgres
 public   | events                    | 数据表 | postgres
 public   | file_sources              | 数据表 | postgres

 
 数据库表已经正常创建
 
 故障定位:
 可以排查连接postgresql数据库、web-ui问题
 所以故障出现在sonar和es上,在登录时认证提示es问题,所以大概率是es问题 
 即:elasticsearch启动后立即停止服务,问题很隐藏,基本断定是服务器或者内存问题
 
解决:
加大内存
这个错误很隐蔽,一般发现不了,最显著的特点就是es启动正常,也没有报错,但是自己停止了,如下

vi elasticsearch/config/jvm.options
-Xms1024m
-Xmx1024m

启动sonarqube,依然未解决 

最后换了一台服务器,重新部署sonarqube,服务正常启动,看来sonarqube是看服务器的呀!!