Jenkins Sonar

sonar簡介

    SonarQube是 一個開源的代碼質量分析平臺,便於管理代碼的質量,可檢查出項目代碼的漏洞和潛在的邏輯問題。同時,它提供了豐富的插件,支持多種語言的檢測, 如 Java、Python、Groovy、C、C++等幾十種編程語言的檢測。、主要的核心價值體如今以下幾個方面java

  • 檢查代碼是否遵循編程標準:如命名規範,編寫的規範等。
  • 檢查設計存在的潛在缺陷:SonarQube 經過插 件 Findbugs、Checkstyle 等工具檢測代碼存在的缺陷。
  • 檢測代碼的重複代碼量:SonarQube 能夠展現項目中存在大量複製粘貼的代碼。
  • 檢測代碼中註釋的程度:源碼註釋過多或者太少都很差,影響程序的可讀可理解性。
  • 檢測代碼中包、類之間的關係:分析類之間的關係是否合理,複雜度狀況。

 

SonarQube 平臺是由4個部分組成:mysql

  • SonarQube Server
  • SonarQube Database
  • SonarQube Plugins
  • SonarQube Scanner

 

安裝 SonarQube

IP:10.20.200.107  jdk版本 1.8 nginx

SonarQube 下載地址 https://www.sonarqube.org/downloads/  版本 6.7.4git

 

①、mysql中建立數據庫github

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 的相關配置web

[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       #默認端口

 

額外可選參數配置(前期可不添加)sql

#jvm使用的內存大小,xms最大使用內存,xmx最小使用內存

sonar.web.javaOpts=-server -Xms1G -Xmx521m -XX:+HeapDumpOnOutOfMemoryError

 

③、啓動數據庫

因爲sonar啓動的時候會自動啓動es插件,而且es不容許root用戶啓動,因此須要建立sonar用戶來啓動,不然es.log會報以下錯誤apache

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
View Code

同時查看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
View Code

 

解決辦法:

緣由是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)
。。。。。。。。。。。。。。。。。。
View Code

可能存在緩存緣由致使啓動失敗,刪除 sonarqube目錄下的temp目錄下文件便可

相關文章
相關標籤/搜索