[創意料理] 在 CentOS 7 與程式碼品質分析工具 SonarQube 相遇

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_sizequery_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.usernamesonar.jdbc.passwordsonar.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。

參考資料

C# 指南ASP.NET 教學ASP.NET MVC 指引
Azure SQL Database 教學SQL Server 教學Xamarin.Forms 教學