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是看服务器的呀!!