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

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

SonarQube 構成:

  • 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時各種坑

部署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服務
進入安裝目錄:/usr/local/sonarqube-7.2.1/bin/linux-x86-64
注意:更改/usr/local/sonarqube-7.2.1目錄所屬用戶,因目錄下的elasticsearch服務不能用root啓動。

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

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

# 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配置會用到。

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

[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模式。
附上Analysis properties參數:

#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/**/*

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章