SonarQube 是一套程式碼品質分析的工具,支援多種程式語言,像是 C/C++、C#/VB.NET、Java、JavaScript、Python…等超過 25 種程式語言,SonarQube 用 7 個維度來分析程式碼品質,包括:
- Architecture & Design
- Duplications
- Unit tests
- Complexity
- Potential bugs
- Coding rules
- Comments
還可以與 CI 做結合,讓 SonarQube 成為持續整合當中的一環,可以幫助節省一部分人工 Code Review 的力氣,也可以幫助提前發現一些不小心忽略的疏失。
安裝 Wget、JDK 1.8.0
這個部分沒什麼問題,照著下面的指令輸入,就可以安裝完成。
yum install -y wget
yum install -y java-1.8.0-openjdk.x86_64
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
設定防火牆埠號 3306、9000
3306 是給 MySQL 用的,9000 是給 SonarQube 用的。
firewall-cmd --permanent --add-port={3306/tcp,9000/tcp}
firewall-cmd --reload
安裝及設定 MySQL
SonarQube 必須搭配一套資料庫系統,有支援哪些資料庫系統可以參考 Requirements,我這邊選擇的是 MySQL 5.7 Community。
先安裝 MySQL 的 Repository
rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
接著用 yum 把 MySQL 裝起來
yum install -y mysql-community-server
裝完之後啟動
systemctl enable mysqld
systemctl start mysqld
設定管理者帳號
安裝完畢後,root@localhost 這個管理者帳號就會被建立起來,但是密碼呢?!
在安裝的過程當中,安裝程序已經幫我們把 root@localhost 管理者帳號的密碼產生在 /var/log/mysqld.log
底下,我們可以透過下面這行指令查看密碼。
grep 'temporary password' /var/log/mysqld.log
利用這個密碼登入後再改成我們自訂的密碼,要修改密碼可以執行下面這行指令。
ALTER USER 'root'@'localhost' IDENTIFIED BY '{密碼}';
要讓外部的 GUI 管理工具可以使用 root 登入,必須要額外的設定,這個部分我記錄在這篇文章[廚餘回收] 裝完 MariaDB 後無法從外部連線到伺服器!?,想要這麼做的朋友可以參考一下,雖然一個是 MariaDB、一個是 MySQL Community,但是在這個部分的處理是可以共用的。
設定 innodb_buffer_pool_size 及 query_cache_size
SonarQube 的 Requirements 文件有說明只支援 InnoDB storage engine 不支援 MyISAM,依照官方的建議,只要使用 InnoDB 的第一件事情是調整 innodb_buffer_pool_size
、query_cache_size
這兩個參數。
query_cache_size 至少要 15M,至於 innodb_buffer_pool_size 的話,它必須要是(innodb_buffer_pool_chunk_size × innodb_buffer_pool_instances)的倍數,有關於 innodb_buffer_pool_size、innodb_buffer_pool_chunk_size、innodb_buffer_pool_instances 這三兄弟的關係可以參考 InnoDB Startup Options and System Variables。
我們直接在 /etc/my.cnf
底下把設定加上
加完之後,執行 systemctl restart mysqld
重新啟動 MySQL 服務,我們可以登入 MySQL 執行下面這行 Query Statement 來確認是否有設定成功?
SELECT @@innodb_buffer_pool_size, @@query_cache_size;
建立 SonarQube 專用的 MySQL 帳號及資料庫
建立 SonarQube 專用的資料庫帳號
CREATE USER 'sonarqube'@'localhost' IDENTIFIED BY '{密碼}';
GRANT ALL PRIVILEGES ON sonarqube.* TO 'sonarqube'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
建立 SonarQube 專用的資料庫,這個部分我是透過 GUI 管理工具建立的,下面是相對應的指令碼。
CREATE DATABASE sonarqube
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
安裝 SonarQube
最困難的部分過去了,接下來就容易了,SonarQube 有提供 Native Package,先加入 Repository。
wget -O /etc/yum.repos.d/sonar.repo http://downloads.sourceforge.net/project/sonar-pkg/rpm/sonar.repo
使用 yum 將 SonarQube 安裝起來
yum install -y sonar
設定及啟動 SonarQube
安裝完成後,打開 SonarQube 的設定檔 /opt/sonar/conf/sonar.properties
調整 sonar.jdbc.username
、sonar.jdbc.password
、sonar.jdbc.url
。
修改完設定檔後存檔,啟動 SonarQube。
systemctl enable sonar.service
systemctl start sonar.service
在瀏覽器敲入 http://{Host}:9000
,就可以看到 SonarQube 的畫面,預設的管理者帳號密碼是 admin/admin
。
在第一次進入 SonarQube 會需要等待好一會兒,因為 SonarQube 正在做初始化,不要以為是當掉了。
放點碼進去分析看看
進入 SonarQube 服務後,我才知道「我錯了!」,C# Code 根本無法在 Linux 上分析啊!囧...(見 2016/10/30 補充更新)
之後我應該會建 Windows 環境再玩一次,可是既然已經到這一步了,就不要放棄,我到 GitHub 上隨便找一個 Java 的 project,拿 Java 的 Code 餵給 SonarQube 分析看看。
要分析程式碼必須找到對應的 Scanner,Java 的 Code 用 SonarQube Scanner 就可以分析了,首先我們必須先建立擺放 project 原始碼的目錄,所以我在 /root 底下建立一個 projects 的目錄,然後假設我有一個叫 test 的 project,我就把 test 這個 project 的原始碼放在 /root/projects/test/src
底下。
接著我們要生成一個 sonar-project.properties
設定檔放到 /root/projects/test 底下,sonar-project.properties 的範本可以參考 Analyzing with SonarQube Scanner。
而 sonar-project.properties 裡面我們必須至少指定下列這三項設定:
sonar.projectKey
:Project Key,必須要是唯一的。sonar.projectName
:Project Name。sonar.sources
:原始碼對應的相對路徑,若原始碼與設定檔同個目錄,則維持預設值即可。
再來我們一樣到 Analyzing with SonarQube Scanner 下載 SonarQube Scanner,解壓縮後放在想放的目錄,我是放在 /opt/sonar
底下。
最後我們切換到與 sonar-project.properties 同一層的目錄,執行 sonar-scanner。
cd /root/projects/test
/opt/sonar/sonar-scanner-2.8/bin/sonar-scanner
等它跑一下之後,再切換到 SonarQube Web UI 就可以看到它自動生成了一個 Test Project。
點進去就可以看到更詳細的分析結果
怎麼解讀這些分析出來的結果?可以參考風哥的基本介紹文章程式碼品質分析的好用工具 - SonarQube 基本介紹 (1)。
2016/10/30 補充更新
風哥留言有提到「只要 SonarQube Scanner 不要在 Linux 上跑就可以分析」,如果我們已經有 Windows 環境,我們可以單獨下載 SonarQube Scanner for MSBuild 解壓縮放在 Windows 環境,修改 SonarQube.Analysis.xml
設定檔內的 sonar.host.url
設定值,指到 Linux 環境上的 SonarQube 服務,我們就不一定要在 Windows 環境上安裝 SonarQube。
參考資料
- How To Install And Configure Sonarqube On Linux (RHEL/Centos/Ec2)
- Sonar 的安裝與使用
- Innodb Performance Optimization Basics
- MySQL Jdbc 驅動的 rewriteBatchedStatements 參數
- docs.sonarqube.org - Installing the Server
- docs.sonarqube.org - Plugin Library
- Installing MySQL on Linux Using the MySQL Yum Repository
- Properties Files for the useConfigs Option