介紹
SonarQube 是一開源的代碼分析平臺,用來持續分析和評測代碼質量,支持檢測N多種語音,Java、JS、C、C++等。經過SonarQube可檢測項目中潛在的Bug、漏洞、代碼規範、重複代碼、缺少單元測試的代碼等問題,提供UI界面查看和管理。
架構:javascript
SonarQube 構成:php
環境
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
2). Jenkins -> 系統管理 -> 系統設置,配置SonarQube Server信息
上面Name隨便填寫,通常按SonarQube版原本命名,方便識別。Server Url可配置成SonarQube的ip+9005端口或域名。SonarQube在5.3版本後,不在經過用戶和密碼方式登陸,經過配置token的方式,Jenkins將構建結果經過URL和token發送給SonarQube 。上面的Token信息,可在安裝後首次登陸SonarQube Server時得到。或者在SonarQube web查看,以下:
3). Jenkins -> 系統管理 -> 全局工具配置,配置SonarQube Server和Maven
4). 建立Jenkins項目,在項目構建過程加入SonarScanner進行代碼分析
新建一個Jenkins項目,選擇構建一個maven項目,項目是java編寫的。
配置Git代碼倉庫,並選擇分支。
在【Build Environment】標籤選擇勾中「Prepare SonarQube environment」
在【Build】標籤配置
在Post Steps增長構建步驟」Execute SonarQube Scanner「
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=.
項目構建
Console控制檯查看構建日誌
SonarQube查看項目代碼分析結果
Jenkins構建成功後會顯示
點擊綠色【OK】按鈕,或者點擊【SonarQube】便可跳轉到SonarQube Web頁面查看