1、sonar資源與工作原理
資源
sonarqube-8.2.0.32929.zip (sonarqube-9+版本,除了soanrqube本身需要jdk11,貌似掃描的工程也要jdk11,待確認)
postgresql-10.18-1-linux-x64-binaries.tar.gz
jdk-11.0.12_linux-x64_bin.tar.gz
sonar-scanner-cli-4.6.2.2472-windows.zip
部署機器,使用虛擬機,IP : 192.168.25.135
工作原理
sonarqube是一個web應用,用來存儲掃描結果,供遠程訪問查看等。
sonar-scanner是掃描代碼的工具,將掃描結果上傳到sonarqueb服務器
sonarLint是一個插件,安裝到集成開發工具中IDEA,eclipse,可實時進行代碼掃描
sonarqube、sonar-scanner使用java語言開發,運行時需要jre環境
2、安裝postgreSQL
sonarqube需要數據庫,默認使用M2數據庫,7.9版本後不再支持mysql數據庫,本文使用postgreSQL數據庫。
創建postgres用戶/用戶組
groupadd postgres
useradd -g postgres postgres
postgreSQL部署在postgres用戶HOME目錄
解壓postgreSQL到
/home/postgres/pgsql
創建數據庫目錄
mkdir /home/postgres/data
初始化數據庫
/home/postgres/pgsql/bin/initdb -D /home/postgres/data/
也可以使用相對路徑(下同)
本文將postgreSQL和sonarqube部署在同一臺機器上,
如果postgreSQL和sonarqube部署在不同的機器上,則需要修改postgreSQL配置,允許遠程連接postgreSQL
修改/home/postgres/data/pg_hba.conf文件,在文件最後增加一行,該配置允許所有遠程機器連接。其中32是指IPv4網絡,如果使用的網絡是IPv6網絡改爲64
host all all 0.0.0.0/32 password
也可以指定ip連接。
修改/home/postgres/data/postgresql.conf 文件,
listen_addresses = '*'
啓動
/home/postgres/pgsql/bin/pg_ctl -D /home/postgres/data -l pgsql.log start
參數-D指定初始化的數據目錄,-l指定日誌文件
/home/postgres/pgsql/bin/pg_ctl -D /home/postgres/data stop
本地登錄postgreSQL數據庫
/home/postgres/pgsql/bin/psql
創建sonarqube需要的database,user等
postgres=# create user sonar with password 'sonar' ;
CREATE ROLE
postgres=# create database sonarqube owner sonar ;
CREATE DATABASE
postgres=# grant all on database sonarqube to sonar ;
GRANT
注意:每行sql語句的分號前有一空格。
3、sonarqube安裝配置
創建sonar用戶和用戶組,sonarqube中的Elasticsearch 不能使用root用戶啓動。
sonarqube 7.8版本後需要jdk11,貌似sonarqube9++,被掃描的java工程也需要jdk11,未驗證
jdk11解壓到
/home/sonar/jdk-11.0.6
sonarqube解壓到
/home/sonar/sonarqube-8.2.0.32929
sonarqube配置jdk11
/home/sonar/sonarqube-8.2.0.32929/conf/wrapper.conf
配置文件中
配置項,指定使用jdk11,高版本sonarqube必須使用jdk11
wrapper.java.command=/home/sonar/jdk-11.0.6/bin/java
sonarqube配置數據源
/home/sonar/sonarqube-8.2.0.32929/conf/sonar.properties
文件中找到postgresql的配置
sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonarqube?currentSchema=public
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
soanrqube機器參數調整
/etc/sysctl.conf文件最後添加一行,ElasticSearch需要該參數,至少262144
vm.max_map_count=262144
使修改參數生效
sysctl -p
修改機器open files,max user processes參數,改爲65536,如何修改此處不贅述。
查看open files ,max user processes 參數
ulimit -a
啓動sonarqube
/home/sonar/sonarqube-8.2.0.32929/bin/linux-x86-64/sonar.sh start
sonarqube端口默認9000,可在sonarqube-8.2.0.32929/conf/sonar.properties配置文件中修改
sonar.web.port=9000
訪問 http://192.168.25.135:9000,本文sonarqube部署在虛擬機192.168.25.135中。
4、sonar-scanner掃描代碼
下載sonar-scanner
sonar-scanner是掃描代碼的工具,sonar-scanner有多種,包括原生的,maven版本,gradle版本,ant版本,jenkins版本等
原生版本可以掃描任何工程,maven版本可以讓maven工具在構建工程的過程中調起sonar-scanner,其他版本類似。
4.1 準備工程
本地創建工程 demo-sonar,本文使用demo-sonar工程名
D:\workspace\test-demo\demo-sonar
sonarqube創建新項目,本文中project key使用工程名demo-sonar,project key很重要,sonar-scanner會使用。
點擊Set Up進入下一步,生成project的 token,該token是sonar-scanner與sonarqube交互時的認證方式之一。
輸入token的name,點擊Generate按鈕生成token,本文使用工程名demo-sonar作爲token的name,
生成token: 3f2a887f97da1e1a4edc7b98aa16700ba098532c
4.1 原生sonar-scanner使用
本文使用windows版本演示如何使用sonar-scanner
下載sonar-scanner-4.2.0.1873-windows
本文將sonar-scanner-4.2.0.1873-windows.zip解壓到
D:\DEV_ENV\sonar-scanner
配置環境變量,將如下目錄加入path
D:\DEV_ENV\sonar-scanner\sonar-scanner-4.2.0.1873-windows\bin
sonar-scanner的配置文件位於
$HOME/conf/sonar-scanner.properties
文件常用配置
#必選參數,sonarqube的url地址,默認http://localhost:9000
sonar.host.url=http://localhost:9000
#必選參數,項目標識,由字母、數字、和至少有一個非數字組成
sonar.projectKey=
#可選參數,在sonarqube界面上顯示的項目名稱
sonar.projectName=
#可選參數,項目版本
sonar.projectVersion=
#可選參數,該參數可用登陸sonarqube的用戶名/密碼,也可以使用sonarqube上創建的project token進行認證。
sonar.login=
#可選參數,如果sonar.login使用sonarqube的用戶名進行認證,則該參數爲sonarqube對應的用戶名的密碼
sonar.password=
#可選參數,sonar-scanner連接sonarqube的時間
sonar.ws.timeout=
#可選參數,sonar-scanner掃描的代碼目錄
sonar.sources=
#可選參數,掃描工程的字符編碼
sonar.sourceEncoding=
#可選參數,設置使用sonar-scanner觸發的分析的工作目錄(版本大於 2.0)。
sonar.working.directory=
#可選參數,項目描述
sonar.projectDescription=
#可選參數,項目主頁
sonar.links.homepage=
#可選參數,項目源存儲庫
sonar.links.scm=
#可選參數,如果自動檢測不起作用,此參數可用於顯式告訴 sonarqube 在項目上使用的 scm
sonar.scm.provider=
使用token掃描示例配置
sonar.host.url=http://192.168.25.135:9000
sonar.projectKey=demo-sonar
sonar.login=3f2a887f97da1e1a4edc7b98aa16700ba098532c
sonar.password=
sonar.sources=D:/workspace/test-demo/demo-sonar
sonar.sourceEncoding=UTF-8
sonar.working.directory=
使用sonarqube用戶名密碼掃描示例配置
sonar.host.url=http://192.168.25.135:9000
sonar.projectKey=demo-sonar
sonar.login=admin
sonar.password=123456
sonar.sources=D:/workspace/test-demo/demo-sonar
sonar.sourceEncoding=UTF-8
sonar.working.directory=
執行掃描,使用命令行
C:\Users>sonar-scanner.bat
配置文件sonar-scanner.properties中的參數也可以直接指定,如:
sonar-scanner.bat -Dsonar.host.url=http://192.168.25.135:9000/ -Dsonar.projectKey=demo-sonar -Dsonar.login=3f2a887f97da1e1a4edc7b98aa16700ba098532c -Dsonar.password= -Dsonar.sources=D:\workspace\test-demo\demo-sonar
4.2 maven版本sonar-scanner使用
在maven的settings文件中配置sonar相關參數,也可以配置在工程的pom文件中,本文配置在maven的settings文件中。
<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>http://192.168.25.135:9000</sonar.host.url>
<sonar.projectKey>demo-sonar</sonar.projectKey>
<sonar.login>admin</sonar.login>
<sonar.password>123456</sonar.password>
<sonar.sourceEncoding>UTF-8</sonar.sourceEncoding>
</properties>
</profile>
</profiles>
</settings>
使用maven命令掃描
mvn clean compile sonar:soanr
可指定sonar插件版本
mvn clean compile org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar
可以在mvn命令中指定sonar參數,覆蓋settings文件或工程pom文件中的配置
mvn clean compile sonar:sonar -Dsonar.host.url=http://192.168.25.135:9000 -Dsonar.java.binaries=target/sonar -Dsonar.sorceEncoding=UTF-8 -Dsonar.login=admin -Dsonar.password=123456
也可以換行
mvn clean compile sonar:sonar \
-Dsonar.host.url=http://192.168.25.135:9000 \
-Dsonar.java.binaries=target/sonar \
-Dsonar.sorceEncoding=UTF-8 \
-Dsonar.login=admin \
-Dsonar.password=123456
sonarLint使用
sonarLint是一個集成開發工具的插件,只能在集成開發工具中使用
sonarLint可以掃描工程,將掃描結果在本地顯示,供開發人員參考,也可以給sonarLint配置sonarQube,將掃描結果上傳到sonarqube上
sonarLint配置、使用較簡單,不贅述。