Jenkins+sonar實現代碼掃描

一、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 大於或等於262144
  • fs.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章