代碼掃描工具 SonarQube Scanner 配置 & Jenkins 集成


試了一下,覺得不太好用,但還是記錄一下過程,以備不時之需

我遇到的問題較多的是版本匹配問題,詳情如下:

  • 下載 & 配置
  • 啟動
  • 掃描代碼生成可視化
  • 集成 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

注:此處最終使用的是 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(但是我沒有操作,因為出問題的部署機器我不敢動)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM