一、Sonar的作用
Sonar是一個用於代碼質量檢查的開源工具,採用B/S架構,幫助檢查代碼缺陷,改善代碼質量,提高開發速度。可以從七個維度檢查代碼質量:
- 複雜度分佈(complexity):代碼複雜度過高將難以理解;
- 重複代碼(duplications):程序彙總包含大量複製、粘貼的代碼導致代碼臃腫,sonar可以展示源碼中重複嚴重的地方;
- 單元測試統計(unit tests):統計並展示單元測試覆蓋率,開發或者測試可以清楚測試代碼的覆蓋情況;
- 代碼規則檢查(coding rules):通過Findbugs,PMD,CheckStyle等檢查代碼是否符合規範;
- 註釋率(comments):若代碼註釋過少,特別是人員變動後,其他人接收比較難;若註釋過多,又不利於閱讀;
- 潛在的Bug(potential bugs):通過Findbugs,PMD,CheckStyle等檢測潛在的bug;
- 結構與設計(architecture & design):找出循環、展示包與包、類與類之間的依賴、檢查程序之間的耦合度;
Sonar通過插件形式,可以支持Java、C/C++、JavaScripts等等二十幾種語言的代碼質量管理和檢測。
通過客戶端插件分析源代碼,sonar客戶端可以採用IDE插件、Sonar-Scanner插件、Ant插件和Maven插件方式,並通過各種不同的分析機制對項目源碼進行分析和掃描,並把分析掃描後的結果上傳到sonar數據庫,通過sonar web界面對分析結果進行管理。
二、SonarQube平臺的組成
SonarQube平臺由4個組件組成。
1、SonarQube Server,啓動3個主要程序:
- Web Server,供開發、管理人員瀏覽高質量的快照並配置SonarQube實例;
- SearchServer based on Elasticsearch,執行來自頁面的查詢請求;
- Compute EngineServer,處理代碼分析報告並將其保存在SonarQube數據庫中;
2、一個用來存儲的SonarQube數據庫:
- SonarQube實例的配置(安全性,插件設置等);
- 項目,視圖等的質量快照;
3、SonarQube插件
- 服務器上安裝了多個SonarQube插接,可能包括language, SCM, integration, authentication, and governance 插件;
4、在構建/持續集成服務器上運行一個或多個SonarScanner,以分析項目;
三、環境
1、服務器列表
服務器IP | 系統 | 安裝組件 |
---|---|---|
192.168.0.111 | CentOS7.6 | Jenkins-2.213,sonarqube-8.3.1.34397,sonar-scanner-cli-4.3.0.2102 |
192.168.0.123 | CentOS7.6 | Gitlab |
192.168.0.125 | CentOS7.6 | PosterSQL |
Jenkins和Gitlab這邊不再贅述安裝過程。
2、安裝包
- sonarqube安裝包:https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.3.1.34397.zip
- cli安裝包:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.3.0.2102-linux.zip
下載好安裝包之後,上傳至服務器中。
我這邊也是將這兩個安裝包上傳到了百度雲上。
3、JDK和數據庫版本要求
這裏需要特別說明一下,每個版本sonarqube的官方介紹說明還是要好好看一下的。不同版本的sonarqube所支持的JDK和數據庫也不同。
從7.9版本開始的變化非常大:
- 不再支持MySQL數據庫
- JDK的最低要求爲11
官網查看一下,其實已經寫的很清楚了:
所以這裏選擇用PosterSQL 12
作爲數據庫,詳細安裝步驟在後續的步驟中。
由於之前安裝Jenkins時用的JDK8,所以還需要安裝一個JDK11,但是不用去修改環境變量,等等修改sonarqube的配置文件制定JDK的目錄即可。
四、安裝PostgreSQL
PostgreSQL的安裝,其實已經在之前的PostgreSQL-12安裝和簡單操作中講的很詳細了,有需要的可以移步過去,但是爲了方便,我還是把安裝的這一部分給拷貝過來吧。
1、安裝
# 添加yum源
$ yum -y install https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安裝PostgreSQL
$ yum -y install postgresql12 postgresql12-server postgresql12-contrib
# 檢查版本信息
$ psql --version
psql (PostgreSQL) 12.3
2、初始化數據庫
這裏需要注意一下,初始化的時候可以指定postgresql的數據目錄哦!
1)使用默認數據目錄
yum安裝的postgresql的默認數據目錄爲/var/lib/pgsql/12/data
,直接初始化就行
/usr/pgsql-12/bin/postgresql-12-setup initdb
2)使用自己規劃好的數據目錄
如果已經規劃好別的數據目錄,可以在初始化的時候用-D
參數指定數據目錄。
# 新建數據目錄
mkdir -p /data/postgresql/data
# 授權
chown -R postgres:postgres /data/postgresql/data
# 切換到postgres用戶,初始化
$ su - postgres
-bash-4.2$ /usr/pgsql-12/bin/initdb -D /data/postgresql/data
# 修改postgresql的system.service文件
vim /usr/lib/systemd/system/postgresql-12.service
Environment=PGDATA=/data/postgresql/data/
# 重新加載系統服務
systemctl daemon-reload
3、修改訪問權限
要允許遠程登錄,需要修改配置文件中的監聽ip和認證方式。
vim postgresql.conf
# 修改監聽的ip和端口
listen_addresses = '*'
vim pg_hba.conf
#新增下面一行
host all all 0.0.0.0/0 password
4、啓動 postgresql 服務
systemctl enable postgresql-12
systemctl start postgresql-12
systemctl status postgresql-12
postgresql會自動完成以下操作:
-
自動生成一個linux系統用戶
postgres
:管理數據庫的系統用戶 -
數據庫用戶
postgres
:數據庫超級管理員 -
此用戶的默認數據庫爲
postgres
-
可有修改下默認postgres數據庫用戶的密碼:
$ su - postgres -bash-4.2$ psql psql (12.3) Type "help" for help. postgres=# alter role postgres with password '123456'; ALTER ROLE
5、創建sonarqube數據庫並授權
$ su - postgres
-bash-4.2$ psql
# 建立新的數據庫用戶sonar
create user sonar with password 'sonar';
# 爲新用戶建立數據庫
create database sonarqube owner sonar;
# 把新建的數據庫權限賦予新用戶
grant all privileges on database sonarqube to sonar;
五、安裝SonarQube
以下操作將在192.168.0.111
上執行。
1、修改系統配置參數
在linux系統中,必須保證以下要求:
vm.max_map_count
大於或等於262144fs.file-max
大於或等於65536- 運行SonarQube的用戶可以打開至少65536個文件描述符
- 運行SonarQube的用戶可以打開至少4096個線程
按要求修改:
vim /etc/sysctl.conf
#修改下面兩個參數
vm.max_map_count=262144
fs.file-max=65536
vim /etc/security/limits.conf
#增加下面兩行
sonar - nofile 65536
sonar - nproc 4096
#使生效
$ sysctl -p
2、新建普通用戶sonar
因爲sonar裏面包含了elasticsearch,所以安裝的時候需要用普通用戶,不然會報錯can not run elasticsearch as root
。所以這裏新建一個普通用戶sonar。
$ useradd sonar
$ passwd sonar
賦予sonar用戶sudo權限
$ visudo
#增加下面這行
sonar ALL=(ALL) ALL
3、解壓
以下操作在剛剛創建的普通用戶sonar下進行。
$ cd /home/sonar
$ unzip sonarqube-8.3.1.34397.zip
$ mv sonarqube-8.3.1.34397 sonarqube
4、修改sonarqube配置文件
以下操作在剛剛創建的普通用戶sonar下進行。
1)修改數據庫連接信息
vim /home/sonar/sonarqube/conf/sonar.properties
#修改sonarqube的數據庫連接
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://192.168.0.125/sonarqube
#修改持久數據文件(嵌入式數據庫和搜索索引)和臨時文件路徑。可以是絕對路徑,也可以是相對路徑。默認是相對路徑的data和temp。
#我這裏用的是默認的目錄,實際應用中,最好是在較大的分區中新建一個目錄來存放這些數據。提醒一下,新建好目錄之後,需要給sonar用戶授權
sonar.path.data=data
sonar.path.temp=temp
2)修改使用的jdk
vim /home/sonar/sonarqube/conf/wrapper.conf
#修改wrappe.conf使用jdk11
wrapper.java.command=/usr/local/jdk-11.0.7/bin/java
5、新增sonar的systmed服務
cat > /etc/systemd/system/sonarqube.service << EOF
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
User=sonar
Group=sonar
PermissionsStartOnly=true
ExecStart=/home/sonar/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/home/sonar/sonarqube/bin/linux-x86-64/sonar.sh stop
StandardOutput=syslog
LimitNOFILE=65536
LimitNPROC=8192
TimeoutStartSec=5
Restart=always
[Install]
WantedBy=multi-user.target
EOF
6、啓動sonarqube
systemctl daemon-reload
systemctl enable sonarqube
systemctl start sonarqube
systemctl status sonarqube
啓動之後,用瀏覽器訪問192.168.0.111:9000
點擊右上角的login
,默認用戶名密碼爲admin/admin。
六、sonar-scanner安裝
$ cd /home/sonar
$ unzip sonar-scanner-cli-4.3.0.2102-linux.zip
$ mv sonar-scanner-4.3.0.2102-linux sonar-scanner
修改sonar-scanner配置文件
vim /home/sonar/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8
七、配置環境變量
切回到root用戶進行添加。
$vim /etc/profile
#set sonar-quebe and sonar_runner_home
export SONAR_HOME=/home/sonar/sonarqube
export SONAR_RUNNER_HOME=/home/sonar/sonar-scanner
export PATH=$PATH:$SONAR_HOME/bin/linux-x86-64:$SONAR_RUNNER_HOME/bin
#使配置生效
$ source /etc/profile
八、安裝插件
這裏主要安裝一箇中文插件,安裝的方法也很簡單,直接在頁面上操作就行。
點擊Administration
–>Marketplace
,然後在Plugins
的搜索框中輸入chinese進行搜索,然後點擊Install
進行安裝。
安裝完成之後,會提醒重啓服務
點擊Restart Server
進行服務重啓。重啓完之後,刷新一下瀏覽器,發現已經變成中文了。
九、Jenkins構建
1、首先在Jenkins中安裝對應的插件
2、添加用戶
在配置之前,需要在sonar的web中添加一個連接用戶。
這裏創建了一個名爲testuser的用戶,把祕鑰複製下來。然後來到Jenkins中的系統管理
–>系統配置
,在SonarQube servers
這一欄中填入相關參數:
最後的token那裏是點擊右邊的添加
進行添加的,創建一個全局憑證,類型選擇Secret text,並在Secret中填入剛纔生成的令牌。如下:
注意,這裏的Server URL
,應該填寫部署sonar的主機ip,不能寫成localhost,因爲在jenkins的web中點擊soanr的時候會進行跳轉。
3、添加工具
在Jenkins的系統管理
–>全局工具配置
中,添加sonar-scanner工具。
因爲要檢查java項目的質量,所以jdk和maven的配置也少不了
jdk:
maven:
4、創建一個測試項目
創建一個自由風格的項目,名稱叫做sonar-test。
項目配置如下:
其中sonar部分:
Task to run
:定義名稱,自定義即可;
JDK
:選擇剛纔添加的jdk;
Analysis properties
的內容如下:
#項目key(隨意輸入,必填項)
sonar.projectKey=test-sonar
#項目名和版本(必填項)
sonar.projectName=test-sonar
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=UTF-8
#模塊名稱(必填項)
sonar.modules=company
#模塊相關信息(必填項)
company.sonar.projectName=company
company.sonar.language=java
company.sonar.projectBaseDir=.
company.sonar.sources=src/main
company.sonar.tests=src/test
company.sonar.java.binaries=target/classes
保存信息之後,構建一次。
在構建頁面中,可以看到sonar的相關信息。
點擊左側的SonarQube
可以直接跳轉到該項目的sonar結果頁。
5、查看結果
來到sonar頁面中,可以看到剛纔的test-sonar的檢測結果了。
OK,用sonar檢測一個項目源碼質量的工作就完成了。但是還有一些其他的配置需要更加深入的去研究,比如說自定義模板等等。等下次具體用到的時候,再回來更新下。
參考文章:
http://www.eryajf.net/1977.html
https://docs.sonarqube.org/latest/requirements/requirements/
https://blog.csdn.net/qq_42207325/article/details/100998453
https://stackoverflow.com/questions/34065727/error-could-not-complete-symbolic-execution-reached-limit-of-10000-steps