SonarQube搭建手記

throwable發表於2020-05-17

前提

這篇文章記錄的是SonarQube服務搭建的詳細過程,應用於雲遷移後的PipleLine的程式碼掃描環節。

筆者有軟體版本升級強迫症,一般喜歡使用軟體的最新版本,編寫此文的時候(2020-05-17SonarQube的最新版本為8.3.1

SonarQube簡介

SonarQube是一個程式碼質量管理開放平臺,它整合了數千種自動的靜態程式碼分析規則,旨在提高開發人員的程式碼質量和安全性,使得開發人員編寫更加乾淨,更加安全的程式碼。主要提供了三個比較大的功能:

  • 程式碼可靠性支援:提前捕獲和提示程式碼中的錯誤,從而避免未定義的行為影響到終端使用者。
  • 應用安全支援:修復可能危害到應用程式的漏洞,並通過安全熱點學習AppSec(簡單理解就是會學習和識別新的漏洞)。
  • 技術債務支援:確保管理的程式碼庫乾淨並且可維護,以便提高開發人員的開發效率。

目前SonarQube支援27種程式語言,基本上覆蓋了當前主流的程式語言編寫的專案:

上面談到的功能可能比較泛,實際上,研發團隊可以基於SonarQube做下面的事情:

  • CI/CD流程加入一個SonarQube掃描的環節。
  • 實施程式碼質量閾值,只有通過了這個質量閾值檢測才能進入下一個流程。
  • 程式碼質量低於閾值的專案要及時調整對應的程式碼。

質量閾值可以進行自定義,SonarQube中針對每個專案會有詳細的皮膚資訊,裡面會給出專案當前的健康狀態,不同級別漏洞的分類和明細,漏洞對應提交者等多維度的統計資訊,方便進行問題的追蹤和修復。舉個例子,筆者在上一家公司專案上線需要跑一個流水線,而SonarQube設定了不同等級的閾值,對於老專案,會使用最低等級的閾值:阻斷性的錯誤數量要求為0,對於一些新的專案,則嚴格要求質量如嚴重性的錯誤要求為0等,只要無法通過質量閾值檢查,那麼專案是無法上線的。

SonarQube安裝

一般情況下,只需要安裝社群版免費的SonarQube服務即可,可以基於二進位制檔案安裝或者直接使用Docker下載映象啟動,二進位制檔案安裝的過程比較複雜,因為SonarQube內部依賴內建的ElasticSearch做搜尋,在Linux系統中需要新增一個非root使用者,並且修改一些列的系統引數例如系統支援的最大可開啟的檔案數等等。此外,SonarQube是一個Java應用,需要本地安裝JDKSonarQube7.9版本開始放棄支援MySQL資料庫8.3.1版本下只支援記憶體模式、PostgreSQLMicrosoft SQL ServerOracle四種儲存引擎。筆者調研過,持久化模式下,三種資料庫中PostgreSQL的安裝相對簡便。下面會詳細記錄基於二進位制檔案安裝SonarQube服務的過程。

軟體(系統) 版本
CentOS 7.x
OpenJDK 11.x
PostgreSQL 12.x
SonarQube 8.3.1

筆者在測試的虛擬機器(區域網IP192.168.56.200)上關閉了防火牆,如果防火牆開啟需要開放對應的埠號。

安裝JDK11

OpenJDK的安裝比較簡單:

mdkir /data/openjdk
cd /data/openjdk
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
## 預設會解壓到/data/openjdk/jdk-11資料夾
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz

如果系統中沒有預設的JDK,可以新增到/etc/profile中:

vim /etc/profile

## /etc/profile檔案中新增下面的內容
export JAVA_HOME=/data/openjdk/jdk-11
export PATH=$JAVA_HOME/bin:$PATH

## 重新整理環境變數
source /etc/profile

測試一下:

[root@localhost jdk-11]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

安裝PostgreSQL資料庫

PostgreSQL的安裝也相對簡單,官方文件有十分詳細的步驟:

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql12
yum install -y postgresql12-server
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12

修改/var/lib/pgsql/12/data/pg_hba.conf配置,開放所有Host的訪問:

接著重啟PostgreSQL

systemctl restart postgresql-12

切換使用者進入PostgreSQL的命令列,並且新增一個新的資料庫使用者sonar和新的資料庫sonar備用:

su postgres
psql -U postgres
CREATE USER sonar WITH PASSWORD 'sonar';
CREATE DATABASE sonar WITH OWNER sonar ENCODING 'UTF8'

這樣就建立了一個名稱為sonar,使用者名稱為sonar並且密碼也是sonar的資料庫。

安裝SonarQube服務

在安裝SonarQube服務之前,可以參考Prerequisites and Overview調整系統引數,這些引數其實大部分和ElasticSearch有關,檢視引數:

## 一個程式可以擁有的VMA(虛擬記憶體區域)的數量上限
sysctl vm.max_map_count
## 同時開啟的檔案數目上限 
sysctl fs.file-max
## 可以開啟的檔案描述符的上限
ulimit -n
## 可以啟動執行緒的數量上限
ulimit -u

如果當前的會話是root使用者,可以直接通過下面的命令去修改這四個引數:

sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 4096

否則需要手動修改/etc/security/limits.conf檔案,在檔案尾部新增:

* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096

修改/etc/sysctl.conf檔案,在檔案尾部新增:

vm.max_map_count=262144
fs.file-max=65536

/etc/security/limits.conf/etc/sysctl.conf更新完畢後必須重啟伺服器

接著新增一個使用者sonarqube(根本原因是ElasticSearch不能用root使用者啟動):

adduser sonarqube
# 這一步需要輸入密碼,這裡密碼也暫定sonarqube
passwd sonarqube
# 分配許可權
chown -R sonarqube:sonarqube /data/sonarqube

接著下載和安裝SonarQube

mdkir /data/sonarqube
cd /data/sonarqube
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.3.1.34397.zip
uzip sonarqube-8.3.1.34397.zip

修改配置/data/sonarqube/sonarqube-8.3.1.34397/conf/sonar.properties新增下面的屬性:

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonar

完成所有配置之後,可以嘗試控制檯啟動SonarQube服務:

cd /data/sonarqube/sonarqube-8.3.1.34397/bin/linux-x86-64
./sonar.sh console

如果啟動正常,日誌如下:

然後Ctrl C退出控制檯,使用./sonar.sh start後臺啟動SonarQube服務即可。

這裡歸類一下可能會遇到的問題:

  • 提示root使用者不能啟動的問題,是因為ElasticSearch不允許使用root使用者啟動,新建一個普通使用者即可。
  • 提示部分資料夾無訪問許可權,一般是因為新建的普通使用者沒有分配SonarQube所在目錄的寫許可權。
  • 提示檔案描述符或者執行緒數量限制,一般是因為沒有修改vm.max_map_countfs.file-maxulimit -nulimit -u引數導致。

SonarQube使用

SonarQube管理員的初始化賬號密碼都為admin,如果需要修改密碼或者分配不同許可權的使用者,可以在管理員的選單欄中完成。

訪問http://192.168.56.200:9000進入SonarQubeWebUI,可以先到外掛市場安裝一個漢化外掛Chinese Pack,安裝外掛完成後重啟服務即可實現漢化。

SonarQube提供不同型別的SonarScanner用於程式碼掃描和結果提交,這裡以Maven為例。Mavensettings.xml需要引入下面的配置(注意父標籤已經存在,重複新增父標籤會導致異常):

<settings>
    <pluginGroups>
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
    </pluginGroups>
    <profiles>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- Optional URL to server. Default value is http://localhost:9000 -->
                <sonar.host.url>
                  <!-- 這個位置需要替換成SonarQube服務地址,例如http://192.168.56.200:9000 -->
                  http://myserver:9000
                </sonar.host.url>
            </properties>
        </profile>
     </profiles>
</settings>

需要被掃描的專案中,需要引入Maven外掛sonar-maven-plugin,當前最新版本為:

<plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>3.7.0.1746</version>
</plugin>

完成配置後,只需要在專案中執行命令進行掃描即可,首次執行會比較緩慢,因為需要下載大量的規則庫和外掛:

# 不指定外掛版本執行
mvn clean install
mvn sonar:sonar

# 或者指定外掛版本執行
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:${外掛的版本號}:sonar

此外,可以通過pom檔案中的<properties>指定SonarQube的引數,如:

<properties>
   <sonar.host.url>[...]</sonar.host.url>
   <ssonar.projectKey>[...]</sonar.projectKey>
   <sonar.projectName>[...]</sonar.projectName>
   <sonar.projectVersion>[...]</sonar.projectVersion>
   <sonar.login>[...]</sonar.login>
   <sonar.password>[...]</sonar.password>
   <sonar.sourceEncoding>[...]</sonar.sourceEncoding>
   ......
</properties>

專案掃描結果提交後,可以在http://192.168.56.200:9000/projects看到專案列表:

點選進去就可以看到專案掃描後的詳細報告和統計:

小結

質量管理是DevOps中的一個重要環節,SonarQube是一個十分優秀的程式碼質量管理開放平臺,筆者之前遷移服務到某雲,雲上的流水線配置可以通過外掛形式引入SonarQube服務,這一點起到了低成本高收益的效果。

參考資料:

個人部落格

(本文完 c-1-d e-a-20200517)

相關文章