sonar簡介
SonarQube是 一個開源的代碼質量分析平台,便於管理代碼的質量,可檢查出項目代碼的漏洞和潛在的邏輯問題。同時,它提供了豐富的插件,支持多種語言的檢測, 如 Java、Python、Groovy、C、C++等幾十種編程語言的檢測。、主要的核心價值體現在如下幾個方面:
- 檢查代碼是否遵循編程標准:如命名規范,編寫的規范等。
- 檢查設計存在的潛在缺陷:SonarQube 通過插 件 Findbugs、Checkstyle 等工具檢測代碼存在的缺陷。
- 檢測代碼的重復代碼量:SonarQube 可以展示項目中存在大量復制粘貼的代碼。
- 檢測代碼中注釋的程度:源碼注釋過多或者太少都不好,影響程序的可讀可理解性。
- 檢測代碼中包、類之間的關系:分析類之間的關系是否合理,復雜度情況。
SonarQube 平台是由4個部分組成:
- SonarQube Server
- SonarQube Database
- SonarQube Plugins
- SonarQube Scanner
安裝 SonarQube
IP:10.20.200.107 jdk版本 1.8
SonarQube 下載地址 https://www.sonarqube.org/downloads/ 版本 6.7.4
①、mysql中創建數據庫
create database sonar DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar123'; GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'%';
②、修改sonar 的相關配置
[root@nginx logs]# cat /opt/sonarqube-6.7.4/conf/sonar.properties|grep -v "^#\|^$" sonar.jdbc.username=sonar sonar.jdbc.password=sonar123 sonar.jdbc.url=jdbc:mysql://10.10.10.11:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.web.context=/sonar #這里自定義設置,也可以不寫sonar,直接設為“/” sonar.web.host=0.0.0.0 sonar.web.port=9000 #默認端口
額外可選參數配置(前期可不添加)
#jvm使用的內存大小,xms最大使用內存,xmx最小使用內存 sonar.web.javaOpts=-server -Xms1G -Xmx521m -XX:+HeapDumpOnOutOfMemoryError
③、啟動
由於sonar啟動的時候會自動啟動es插件,並且es不允許root用戶啟動,所以需要創建sonar用戶來啟動,否則es.log會報如下錯誤
java.lang.RuntimeException: can not run elasticsearch as root
創建用戶及啟動
adduser sonarUser passwd sonarUser chown -R sonarUser:sonarUser /opt/sonarqube-6.7.4 su sonarUser bin/sonar.sh start|stop|restart
④、打開頁面,進行漢化
從 https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases 上下載 sonar-l10n-zh-plugin-1.19.jar 放到 /opt/sonarqube-6.7.4/extensions/plugins 目錄,重啟sonar
注:插件版本一定要正確,具體信息看下載地址里的說明
訪問地址 http://ip:9000/sonar,默認用戶/密碼 admin/admin
安裝過程中出現問題可看 日志,分別為 sonar.log es.log web.log
安裝scanner
與jenkins同主機 ip :10.10.10.11
版本 2.8 下載地址 :https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip 解壓到 /opt目錄
進入目錄,修改sonar-scanner.properties
[root@bogon sonar-scanner-2.8]# cat conf/sonar-scanner.properties |grep -v "^$\|^#" sonar.host.url=http://10.20.200.107:9000/sonar/ sonar.login=admin sonar.password=admin sonar.jdbc.username=sonar sonar.jdbc.password=sonar123 sonar.jdbc.url=jdbc:mysql://10.10.10.11:3306/sonar?useUnicode=true&characterEncoding=utf8
設置環境變量
cat /etc/profile PATH=$PATH:/opt/sonar-scanner-2.8/bin export PATH source /etc/profile
查看是否成功
[root@bogon sonar-scanner-2.8]# sonar-scanner -h INFO: INFO: usage: sonar-scanner [options] INFO: INFO: Options: INFO: -D,--define <arg> Define property INFO: -h,--help Display help information INFO: -v,--version Display version information INFO: -X,--debug Produce execution debug output INFO: -i,--interactive Run interactively
scanner在於jenkins 進行集成的作用是:jenkins通過scanner傳入要分析的工程,scanner再將這些分析結果,傳給sonargube 進行呈現
jenkins中安裝插件及配置
①、安裝插件
②、全局配置
系統管理--> 系統設置
這里的 server authentication token 在 sonarqube 界面里生成
輸入令牌生成即可看到
系統管理-->全局工具配置
保存即可
③、新建maven項目並進行構建
構建環境這里
post step這里
說明:
Analysic properties 里輸入sonar的檢查參數
- #項目key (隨意輸入,必填項)
- sonar.projectKey=test-sonar
- #項目名稱和版本(必填項)
- sonar.projectName=cuimi-job
- sonar.projectVersion=1.0
- #源碼位置(必填項,相對於jenkins的workspace路徑,例如,我此時的絕對路徑為/var/lib/jenkins/workspace/test_sonar/hz-cloud-management/cloud-admin/src/main/java)
- sonar.sources=hz-cloud-management/cloud-admin/src/main/java
- #編譯后的class位置(必填項,相對路徑同上,如果有多個)
- sonar.java.binaries=hz-cloud-management/cloud-admin/target/classes
示例
sonar.projectKey=2017-12-19-job sonar.projectName=test_sonar sonar.projectVersion=1.0 sonar.login=admin #此處為登錄sonar的用戶名 由於配置文件里的參數有時候讀取不到,所以寫在這里 sonar.password=admin #此處為密碼 sonar.sources=hz-cloud-management/cloud-admin/src/main/java sonar.java.binaries=hz-cloud-management/cloud-admin/target/classes
添加構建后操作(可做可不做。。感覺沒多大用處)
開始構建,構建完成如圖所示、
點擊方框中直接跳轉到sonar界面
遇到的問題
構建完成時提示如下信息,導致構建失敗

[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar (default-cli) on project hz-cloud: Failed to upload report - 500: An error has occurred. Please contact your administrator -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar (default-cli) on project hz-cloud: Failed to upload report - 500: An error has occurred. Please contact your administrator at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345) at org.apache.maven.cli.MavenCli.main(MavenCli.java:191) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Caused by: org.apache.maven.plugin.MojoExecutionException: Failed to upload report - 500: An error has occurred. Please contact your administrator at org.sonarsource.scanner.maven.bootstrap.ScannerBootstrapper.execute(ScannerBootstrapper.java:67) at org.sonarsource.scanner.maven.SonarQubeMojo.execute(SonarQubeMojo.java:104) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) ... 20 more Caused by: Failed to upload report - 500: An error has occurred. Please contact your administrator [ERROR] [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException SonarQube analysis completed: FAILURE Build step 'SonarQube analysis with Maven' changed build result to FAILURE Build step 'SonarQube analysis with Maven' marked build as failure Finished: FAILURE
同時查看sonarqube運行的web日志,/opt/sonarqube-6.7.4/logs/web.log

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4269869 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3678)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2509)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.sonar.db.ce.CeTaskInputDao.insert(CeTaskInputDao.java:53)
... 45 common frames omitted
解決辦法:
原因是MySQL的max_allowed_packet設置過小引起的,開始默認設置的是4M,后來改為了20M,進入mysql
mysql -u -p mysql> show VARIABLES like '%max_allowed_packet%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | max_allowed_packet | 4194304 | | slave_max_allowed_packet | 1073741824 | +--------------------------+------------+
修改/etc/my.cnf
[mysqld]
max_allowed_packet = 20M
重啟mysql,重啟sonarqube即可
重啟sonarqube時報錯

2018.07.09 16:20:26 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonarqube-6.7.4/temp WrapperSimpleApp: Encountered an error running main: java.nio.file.AccessDeniedException: /opt/sonarqube-6.7.4/temp/conf/es/jvm.options java.nio.file.AccessDeniedException: /opt/sonarqube-6.7.4/temp/conf/es/jvm.options at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244) at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103) at java.nio.file.Files.delete(Files.java:1126) at org.sonar.process.FileUtils2$DeleteRecursivelyFileVisitor.visitFile(FileUtils2.java:170) at org.sonar.process.FileUtils2$DeleteRecursivelyFileVisitor.visitFile(FileUtils2.java:165) at java.nio.file.Files.walkFileTree(Files.java:2670) at java.nio.file.Files.walkFileTree(Files.java:2742) at org.sonar.process.FileUtils2.deleteDirectoryImpl(FileUtils2.java:127) at org.sonar.process.FileUtils2.deleteDirectory(FileUtils2.java:112) at org.sonar.application.AppFileSystem$CleanTempDirFileVisitor.visitFile(AppFileSystem.java:117) at org.sonar.application.AppFileSystem$CleanTempDirFileVisitor.visitFile(AppFileSystem.java:101) at java.nio.file.Files.walkFileTree(Files.java:2670) at org.sonar.application.AppFileSystem.createOrCleanTempDirectory(AppFileSystem.java:96) at org.sonar.application.AppFileSystem.reset(AppFileSystem.java:62) 。。。。。。。。。。。。。。。。。。
可能存在緩存原因導致啟動失敗,刪除 sonarqube目錄下的temp目錄下文件即可