Jenkins+SonarQube集成代碼質量檢測管理

介紹
SonarQube 是一開源的代碼分析平臺,用來持續分析和評測代碼質量,支持檢測N多種語音,Java、JS、C、C++等。經過SonarQube可檢測項目中潛在的Bug、漏洞、代碼規範、重複代碼、缺少單元測試的代碼等問題,提供UI界面查看和管理。
架構:
Jenkins+SonarQube集成代碼質量檢測管理javascript

SonarQube 構成:php

  • SonarQube Server
    主要3個進程:
    Web server提供UI
    Search server是基於Elasticsearch搜索服務
    Compute Engine Server 計算引擎服務,進行代碼分析並保存到SonarQube 數據庫
  • SonarQube Database
    存儲SonarQube 實例配置信息,項目、視圖等快照
  • SonarQube Scanners
    分析項目代碼
  • SonarQube Plugins
    SonarQube 插件管理

環境
JDK8(安裝略)
Mysql5.6(安裝、建立庫和新建用戶等略)
SonarQube Server 7.2,如用最新版,JDK要求11,各類坑
Sonar-scanner 3.0
Jenkins2.15以上,版本低,集成SonarQube servers時各類坑html

部署SonarQube server
1).下載SonarQube ,下載社區版,地址: https://www.sonarqube.org/downloads/
2).安裝SonarQube
下載好,解壓至/usr/local目錄:/usr/local/sonarqube-7.2.1/bin/linux-x86-64
3).配置修改
修改SonarQube的MySQL鏈接信息。
因爲默認SonarQube web端口爲9000, elasticsearch端口9001,安裝SonarQube服務器這兩個端口已用,因此更改默認端口。
修改conf/sonar.properties文件,調整以下信息前端

sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar_user
sonar.jdbc.password=p@ssword1
sonar.sorceEncoding=UTF-8
sonar.web.port=9005
sonar.search.port=9006

4).SonarQube漢化
下載SonarQube漢化插件,連接:https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.10 將插件拷貝到項目sonarqube-7.2.1目錄./extensions/plugins下,重啓sonar服務生效。java

5).啓動SonarQube服務
進入安裝目錄:/usr/local/sonarqube-7.2.1/bin/linux-x86-64
注意:更改/usr/local/sonarqube-7.2.1目錄所屬用戶,因目錄下的elasticsearch服務不能用root啓動。mysql

cd /usr/local/sonarqube-7.2.1/bin/linux-x86-64
sh sonar.sh start
## 啓動log查看
--> Wrapper Started as Daemon
Launching a JVM...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
    Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.

2019.07.16 18:38:14 INFO  app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /usr/local/sonarqube-7.2.1/temp
2019.07.16 18:38:14 INFO  app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9006
2019.07.16 18:38:15 INFO  app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/usr/local/sonarqube-7.2.1/elasticsearch]: /usr/local/sonarqube-7.2.1/elasticsearch/bin/elasticsearch -Epath.conf=/usr/local/sonarqube-7.2.1/temp/conf/es
2019.07.16 18:38:15 INFO  app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
2019.07.16 18:38:15 INFO  app[][o.e.p.PluginsService] no modules loaded
2019.07.16 18:38:15 INFO  app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
2019.07.16 18:38:21 INFO  app[][o.s.a.SchedulerImpl] Process[es] is up
2019.07.16 18:38:21 INFO  app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/usr/local/sonarqube-7.2.1]: /usr/java/jd
k1.8.0_25/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/usr/local/sonarqube-7.2.1/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -c
p ./lib/common/*:/usr/local/sonarqube-7.2.1/lib/jdbc/mysql/mysql-connector-java-5.1.46.jar org.sonar.server.app.WebServer /usr/local/sonarqube-7.2.1/temp/sq-process2544415
354422955674properties
2019.07.16 18:38:51 INFO  app[][o.s.a.SchedulerImpl] Process[web] is up
2019.07.16 18:38:51 INFO  app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='ce', ipcIndex=3, logFilenamePrefix=ce]] from [/usr/local/sonarqube-7.2.1]: /usr/java/jdk1
.8.0_25/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/usr/local/sonarqube-7.2.1/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -cp 
./lib/common/*:/usr/local/sonarqube-7.2.1/lib/jdbc/mysql/mysql-connector-java-5.1.46.jar org.sonar.ce.app.CeServer /usr/local/sonarqube-7.2.1/temp/sq-process63974425157314
53678properties
2019.07.16 18:38:55 INFO  app[][o.s.a.SchedulerImpl] Process[ce] is up
2019.07.16 18:38:55 INFO  app[][o.s.a.SchedulerImpl] SonarQube is up

6).Web訪問SonarQube
這裏web前端配置Nginx訪問,Nginx配置:linux

# HTTPS server
server {
        listen 443;
        server_name sonar.abc.com;
        #root /home/git/gitlab/public;

        access_log  /data/logs/sonar-nginx_access-ssl.log;
        error_log   /data/logs/sonar-nginx_error-ssl.log;
        client_max_body_size 128m;

        ssl on;
        ssl_certificate /data/certs/alaxiaoyou.com.chain.crt;
        ssl_certificate_key /data/certs/alaxiaoyou.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
           proxy_redirect     off;
           proxy_set_header   X-Forwarded-Proto $scheme;
           proxy_set_header   Host              $http_host;
           proxy_set_header   X-Real-IP         $remote_addr;
           proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
           proxy_pass http://127.0.0.1:9005;
       }
}

訪問https://sonar.alaxiaoyou.com/,輸入默認用戶名密碼:admin/admin,密碼可更改。首次登陸進去後記錄好Token,後面Jenkins配置會用到。nginx

部署SonarQube Scanners
下載地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
將SonarQube Scanner包安裝到Jenkins所在服務器,接下來Jenkins上配置需用Scanner安裝目錄。git

[root@alxy-zabbix-srv sonar-scanner-3.0.3.778-linux]# ll
total 16
drwxr-xr-x 2 jenkins jenkins 4096 May 12  2017 bin
drwxr-xr-x 2 jenkins jenkins 4096 Jul 19 14:54 conf
drwxr-xr-x 4 jenkins jenkins 4096 Jul 18 18:54 jre
drwxr-xr-x 2 jenkins jenkins 4096 Jul 18 18:54 lib

Jenkins集成SonarQube
1). Jenkins 與 SonarQube 集成插件安裝
Jenkins -> 系統管理 -> 管理插件,選擇安裝SonarQube Scanner for Jenkins
Jenkins+SonarQube集成代碼質量檢測管理
2). Jenkins -> 系統管理 -> 系統設置,配置SonarQube Server信息
Jenkins+SonarQube集成代碼質量檢測管理
上面Name隨便填寫,通常按SonarQube版原本命名,方便識別。Server Url可配置成SonarQube的ip+9005端口或域名。SonarQube在5.3版本後,不在經過用戶和密碼方式登陸,經過配置token的方式,Jenkins將構建結果經過URL和token發送給SonarQube 。上面的Token信息,可在安裝後首次登陸SonarQube Server時得到。或者在SonarQube web查看,以下:
Jenkins+SonarQube集成代碼質量檢測管理
3). Jenkins -> 系統管理 -> 全局工具配置,配置SonarQube Server和Maven
Jenkins+SonarQube集成代碼質量檢測管理
4). 建立Jenkins項目,在項目構建過程加入SonarScanner進行代碼分析
新建一個Jenkins項目,選擇構建一個maven項目,項目是java編寫的。
Jenkins+SonarQube集成代碼質量檢測管理
配置Git代碼倉庫,並選擇分支。
Jenkins+SonarQube集成代碼質量檢測管理
在【Build Environment】標籤選擇勾中「Prepare SonarQube environment」
Jenkins+SonarQube集成代碼質量檢測管理
在【Build】標籤配置
Jenkins+SonarQube集成代碼質量檢測管理
在Post Steps增長構建步驟」Execute SonarQube Scanner「
Jenkins+SonarQube集成代碼質量檢測管理
Task to run:輸入scan命令,分析代碼。
Path to project properties:是可選擇的,可指定一個sonar-project.properites文件,若是不指定則使用項目默認的properites文件。
Analysis properties:是輸入一些配置參數傳遞給SonarQube,這參數優先級高於sonar-project.properites文件,因此這配置的參數可替代sonar-project.properites文件。sonar-project.properites文件可直接在項目根目錄中建立sonar-project.properites文件。
Additional arguments:可輸入附加參數,-X指進入SonarQube Scanner的Debug模式。
附上Java開發語言Analysis properties參數:github

#Sonar項目標識,在SonarQube實例下必須惟一
sonar.projectKey=b2b-root-qa
#在SonarQube Web顯示的項目名稱
sonar.projectName=sonarScan-b2b-root-qa
#項目版本
sonar.projectVersion=1.1.0
#語言
sonar.language=java
#代碼文件編碼
sonar.sourceEncoding=UTF-8

#指定分析項目代碼,指定java源文件和class
sonar.sources=${WORKSPACE}/b2b-app/src/main/java
sonar.java.binaries=${WORKSPACE}/b2b-app/target/classes
sonar.sources=${WORKSPACE}/b2b-admin/src/main/java
sonar.java.binaries=${WORKSPACE}/b2b-admin/target/classes

#排除不參與代碼分析的文件或目錄
sonar.exclusions=.git/**/*

配置文件sonar-project.properites示例:

#required metadata
#projectKey項目的惟一標識,不能重複
sonar.projectKey=ProjectName
sonar.projectName=ProjectName
sonar.projectVersion=1.0 
sonar.sourceEncoding=UTF-8
sonar.modules=java-module,javascript-module,html-module,php-module

# Java module
java-module.sonar.projectName=Java Module
java-module.sonar.language=java
java-module.sonar.sources=.
java-module.sonar.projectBaseDir=src
sonar.binaries=classes

# JavaScript module
javascript-module.sonar.projectName=JavaScript Module
javascript-module.sonar.language=js
javascript-module.sonar.sources=js
javascript-module.sonar.projectBaseDir=webRoot

# Html module
html-module.sonar.projectName=Html Module
html-module.sonar.language=web
html-module.sonar.sources=pages
html-module.sonar.projectBaseDir=webRoot

# Php module
php-module.sonar.projectName=Php Module
php-module.sonar.projectVersion=1.1
php-module.sonar.sourceEncoding=UTF-8
php-module.sonar.language=php
php-module.sonar.sources=.

項目構建
Jenkins+SonarQube集成代碼質量檢測管理
Console控制檯查看構建日誌
Jenkins+SonarQube集成代碼質量檢測管理

SonarQube查看項目代碼分析結果
Jenkins構建成功後會顯示
Jenkins+SonarQube集成代碼質量檢測管理
點擊綠色【OK】按鈕,或者點擊【SonarQube】便可跳轉到SonarQube Web頁面查看
Jenkins+SonarQube集成代碼質量檢測管理

相關文章
相關標籤/搜索