SonarQube搭建手記
前提
這篇文章記錄的是SonarQube
服務搭建的詳細過程,應用於雲遷移後的PipleLine
的代碼掃描環節。
筆者有軟件版本升級強迫症,一般喜歡使用軟件的最新版本,編寫此文的時候(2020-05-17
)SonarQube
的最新版本為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
應用,需要本地安裝JDK
。自SonarQube
的7.9
版本開始放棄支持MySQL
數據庫,8.3.1
版本下只支持內存模式、PostgreSQL
、Microsoft SQL Server
和Oracle
四種存儲引擎。筆者調研過,持久化模式下,三種數據庫中PostgreSQL
的安裝相對簡便。下面會詳細記錄基於二進制文件安裝SonarQube
服務的過程。
軟件(系統) | 版本 |
---|---|
CentOS |
7.x |
OpenJDK |
11.x |
PostgreSQL |
12.x |
SonarQube |
8.3.1 |
筆者在測試的虛擬機(局域網IP
為192.168.56.200
)上關閉了防火牆,如果防火牆開啟需要開放對應的端口號。
安裝JDK11
OpenJDK
的安裝比較簡單:
mdkir /data/openjdk
cd /data/openjdk
wget //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 //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 //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_count
、fs.file-max
、ulimit -n
和ulimit -u
參數導致。
SonarQube使用
SonarQube管理員的初始化賬號密碼都為admin,如果需要修改密碼或者分配不同權限的用戶,可以在管理員的菜單欄中完成。
訪問//192.168.56.200:9000
進入SonarQube
的WebUI
,可以先到插件市場安裝一個漢化插件Chinese Pack
,安裝插件完成後重啟服務即可實現漢化。
SonarQube
提供不同類型的SonarScanner
用於代碼掃描和結果提交,這裡以Maven
為例。Maven
的settings.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 //localhost:9000 -->
<sonar.host.url>
<!-- 這個位置需要替換成SonarQube服務地址,例如//192.168.56.200:9000 -->
//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>
項目掃描結果提交後,可以在//192.168.56.200:9000/projects
看到項目列表:
點擊進去就可以看到項目掃描後的詳細報告和統計:
小結
質量管理是DevOps
中的一個重要環節,SonarQube
是一個十分優秀的代碼質量管理開放平台,筆者之前遷移服務到某雲,雲上的流水線配置可以通過插件形式引入SonarQube
服務,這一點起到了低成本高收益的效果。
參考資料:
個人博客
(本文完 c-1-d e-a-20200517)