試了一下,覺得不太好用,但還是記錄一下過程,以備不時之需
我遇到的問題較多的是版本匹配問題,詳情如下:
- 下載 & 配置
- 啟動
- 掃描代碼生成可視化
- 集成 Jenkins
一 下載
1 Java
- 下載后解壓,我用的是 jdk1.8.0_191
- 配置環境變量 /etc/profile
-
java -version java version "1.8.0_191" Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
- 檢查 java -version 不報錯即表示配置成功
2 Sonar & Sonar-Scan
- https://www.sonarqube.org/downloads/ 選擇對應版本下載 sonar
- https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/ 選擇對應版本下載sonar scan
- 解壓 unizp **.zip
- 環境變量
-
# sonar 變量 export SONAR_RUNNER_HOME=/opt/sonar-scanner-4.4.0.2170-linux export PATH=$SONAR_RUNNER_HOME/bin:$PATH ulimit -SHn 65536
注:此處最終使用的是 sonarqube-6.5,先寫正常流程,使用其他版本的問題會放在之后問題總結里。
二 配置&啟動
1 MySQL 配置
注意 :此處使用的版本是 5.6.44; 使用 root 賬號登錄完成授權
啟動 sonarqube 時會在對應的 sonar 數據庫中生成一系列相關表和數據
CREATE USER sonar@'%' IDENTIFIED BY 'sonar'; //sonor - 用戶名; ‘sonar’-密碼;% - 任意 ip 可訪問,也可以執行為啟動 sonar 的機器 ip create sonar default character set utf8 collate utf8_general_ci; //創建數據庫 GRANT ALL ON sonar.* TO sonar; // 給 sonar 用戶對數據庫 sonar 的操作權限 flush privileges ;--立即啟用修改
2 Sonar 配置
1 vim sonarqube-6.5/conf/wrapper.conf 配置java
1 # Path to JVM executable. By default it must be available in PATH. 2 # Can be an absolute path, for example: 3 wrapper.java.command=/opt/jdk1.8.0_191/bin/java # 更改為自己的 java 全路徑 4 #wrapper.java.command=java
2 vim sonarqube-6.5/conf/sonar.properties
配置要訪問的數據庫ip 端口用戶名及密碼,在1 MySQL 中配置過的,注意 sonar 部署的機器對 mysql 機器有訪問權限
14 sonar.jdbc.username=sonar 15 sonar.jdbc.password=sonar 16 23 sonar.jdbc.url=jdbc:mysql://ip:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
...
109 #sonar.web.port=9000 //這個是啟動后 web 訪問端口,如果9000已經使用可更換
3 sonar-scanner 配置
sonar-scanner-4.4.0.2170-linux/conf/sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example #No information about specific project should appear here #----- Default SonarQube server #sonar.host.url=http://localhost:9000 #----- Default source code encoding #sonar.sourceEncoding=UTF-8 sonar.host.url=http://sonar_ip:9000 #sonar 要用的 ip 和端口 sonar.jdbc.username=sonar # 數據庫配置,同sonar一致就可以 sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:mysql://mysql_ip:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.login=admin # 登錄用戶名及密碼 sonar.password=admin
4 啟動
我一開始用的sonarqube高階版本,里面有 elasticsearch,要求不能用 root 賬號啟動。如果你已經不是 root 就正好,如果是需要新建一個用戶,具體可百度。
注意新建完成用戶后,
1 要更改 sonarqube 的可操作用戶未 chown -R sonar:sonar sonarqube-6.6
2 要保證 java 所在目錄新用戶有訪問權限
啟動命令如下,表示啟動成功
su sonar //切換到非 root 用戶 cd sonarqube-6.5/bin/linux-x86-64 sonar linux-x86-64 $ ./sonar.sh start Starting SonarQube... Started SonarQube.
訪問 web 地址 http://ip:9000 即可,如下表示啟動成功,登錄用戶名默認 admin / admin
三 統計
啟動成功后就可以使用 sonar 來進行代碼檢測了。檢測需要源碼。
1 在對應的源碼工程目錄下,添加文件 sonar-project.properties,內容如下:
# must be unique in a given SonarQube instance sonar.projectKey=my:project # this is the name displayed in the SonarQube UI sonar.projectName=MyProject # 隨便起名字,一般跟項目名一致 sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. # Since SonarQube 4.2, this property is optional if sonar.modules is set. # If not set, SonarQube starts looking for source code from the directory containing # the sonar-project.properties file. sonar.sources=. #也可以寫絕對路徑, . 表示當前文件夾 # Encoding of the source code. Default is default system encoding #sonar.sourceEncoding=UTF-8
2 執行命令 即開始掃描並展示在 sonar 平台上
# source /etc/profile # sonar-scanner INFO: Scanner configuration file: /opt/sonar-scanner-4.4.0.2170-linux/conf/sonar-scanner.properties ...... INFO: Task total time: 20.657 s INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS
四 Jenkins 集成
1 在 sonarqube 中生成一個token My Account-> Security ->隨便輸入 Name,生成一個 Token 記住它,因為沒有地方可以查看。
(PS:用token代替輸入用戶名和密碼)
2 下載插件 SonarQube Scanner SonarQube Scanner for Jenkins CodeSonar Plugin
3 配置 Jenkins 全局變量 SonarQube servers
4 配置 全局工具配置 -- 注意如果不准備使用節點的話,需要在master機器上部署一個sonar-scanner,指明路徑,不然會報找不到
5 配置 job 如下,不知道為什么我配置成 token 會提示沒權限,改成用戶名密碼就可以了,奇奇怪怪。
配置了jenkins之后,感覺就不走 服務器上的 sonar-scanner.配置文件了。
6 查看報告如下,點擊 SonarQube 跳轉到 sonar 的部署機器打開可視化報告。整個配置流程完成。
五 分析應用
在應用這塊我不是特別懂,后面了解清楚了再來完善,據說微博在用 sonar 做代碼分析。官網 https://github.com/SonarSource/sonar-php
https://blog.csdn.net/qq_32447301/article/details/90731314
Rules 對應的報錯類型
1 block 類報錯:無需修改
2 remove unreachable code :可清理優化
六 問題及解決
主要問題都是因為版本導致的 以下部分問題基於 sonar 版本 8.x,部分是 7.7
1 問題:啟動 sonar,報錯:Unable to start JVM: No such file or directory
原因:sonar 沒指定到可執行的 java 文件
解決:1 更改warpper.conf 文件權限,2 配置 2.1 warpper.conf 中的 java 路徑
2 sonar 8.x 版本, 問題:
WrapperSimpleApp: Encountered an error running main: java.lang.IllegalStateException: SonarQube requires Java 11 to run
java.lang.IllegalStateException: SonarQube requires Java 11 to run
原因:如 https://www.cnblogs.com/qianjinyan/p/11303195.html 所說,SonarQube 真的是有點飄啊,不想下載jdk11,因此跟該文作者一樣下載了 SonarQube 的舊版本。之后的問題都是基於 7.7 的
3 更換版本后的新報錯
root@my logs # vi es.log 2020.07.20 14:19:59 ERROR es[][o.e.b.Bootstrap] Exception java.lang.RuntimeException: can not run elasticsearch as root at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:106) ~[elasticsearch-5.6.3.jar:5.6.3] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:195) ~[elasticsearch-5.6.3.jar:5.6.3] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) [elasticsearch-5.6.3.jar:5.6.3]
解決:見 2.4 啟動中,新建非 root 用戶,設置權限后, su 新用戶 進行啟動操作
4 啟動 ES 還是報錯 https://blog.csdn.net/u012246178/article/details/63253531
2020.07.20 15:26:21 WARN es[][o.e.b.JNANatives] unable to install syscall filter: java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed at org.elasticsearch.bootstrap.SystemCallFilter.linuxImpl(SystemCallFilter.java:364) ~[elasticsearch-5.6.3.jar:5.6.3] at org.elasticsearch.bootstrap.SystemCallFilter.init(SystemCallFilter.java:639) ~[elasticsearch-5.6.3.jar:5.6.3] at org.elasticsearch.bootstrap.JNANatives.tryInstallSystemCallFilter(JNANatives.java:258) [elasticsearch-5.6.3.jar:5.6.3]
原因:因為Centos6不支持SecComp,而ES5.2.1默認bootstrap.system_call_filter為true進行檢測,所以導致檢測失敗,失敗后直接導致ES不能啟動。詳見 :https://github.com/elastic/elasticsearch/issues/22899
解決:在elasticsearch.yml中配置bootstrap.system_call_filter為false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
5 基於以上的衍生問題:conf/sonar.properties 中打開 sonar.jdbc.url=jdbc:mysql: localhost:3306/ 時,無法忽略 call_back 報錯,啟動失敗。注釋掉可以啟動成功
解決:在 elasticsearch/bin/elasticsearch 中更改 ES_JAVA_OPTS 增加參數 -E.enforce.bootstrap.checks=true,(-Des 參數已過期廢棄)
https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html
再次啟動,還是報錯。在 elasticsearch 下生成 hs_err_pid26890.log文件
# There is insufficient memory for the Java Runtime Environment to continue. # Cannot create GC thread. Out of system resources. # Possible reasons: # The system is out of physical RAM or swap space # In 32 bit mode, the process size limit was hit # Possible solutions: # Reduce memory load on the system
解決:試了下手動釋放內存和設置更大連接數,操作如下,https://www.cnblogs.com/kangoroo/p/7375604.html
# 先查看一下釋放cache信令值, 此時應該是0 $ cat /proc/sys/vm/drop_caches 0 # 將緩沖區寫入磁盤, 當需要停止系統的時候, 保證文件系統的完整性 $ sync # 釋放cache, 這個命令可能要花費一點時間, 請耐心等待 $ echo 3 > /proc/sys/vm/drop_caches # 再看一眼 $ cat /proc/sys/vm/drop_caches
6 又報錯了,如下:
[2020-07-21T14:00:13,928][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: unknown setting [.enforce.bootstrap.checks] please check that any required plugins are installed, or check the breaking changes documentation for removed settings at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-5.6.3.jar:5.6.3] ...... at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-5.6.3.jar:5.6.3] Caused by: java.lang.IllegalArgumentException: unknown setting [.enforce.bootstrap.checks] please check that any required plugins are installed, or check the breaking changes documentation for removed settings
解決:去掉bin/ela...中的參數,加到 elasticsearch/config/elasticsearch.yml 中如下
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
enforce.bootstrap.checks: true
7 如上操作后可以啟動了,但是會有一個web報錯如下
2020.07.21 14:30:15 INFO web[][o.s.p.ProcessEntryPoint] Starting web 2020.07.21 14:30:26 WARN web[][o.s.p.ProcessEntryPoint] Fail to start web org.sonar.api.utils.MessageException: Value of 'sonar.web.context' must start with a forward slash: 'sonarqube'
原因:百度說要加一個斜杠,可以加了斜杠后又開始報 call_back 那個錯誤
解決:有點煩了,機器不能隨我搞,就換成了5.6版本,5.6里連 elasticsearch 文件夾都沒有,啥都不用配了
8 問題:統計完成后,點擊bugs數跳轉到 問題頁面顯示無結果
原因:點擊分析失敗的后台任務,有報錯如下,猜測是這個問題
java.lang.IllegalStateException: Unrecoverable indexation failures: 1 errors among 1 requests at org.sonar.server.es.IndexingListener$1.onFinish(IndexingListener.java:39) at org.sonar.server.es.BulkIndexer.stop(BulkIndexer.java:122) at org.sonar.server.measure.index.ProjectMeasuresIndexer.doIndex(ProjectMeasuresIndexer.java:158) at org.sonar.server.measure.index.ProjectMeasuresIndexer.indexOnAnalysis(ProjectMeasuresIndexer.java:82) at org.sonar.ce.task.projectanalysis.step.IndexAnalysisStep.execute(IndexAnalysisStep.java:45) at org.sonar.ce.task.step.ComputationStepExecutor.executeStep(ComputationStepExecutor.java:81)
google 讓檢查 es 日志,果然發現 WARN 提示磁盤空間不夠
解決:清理磁盤,並重啟 sonarqube(但是我沒有操作,因為出問題的部署機器我不敢動)