一、SonarQube的安裝
Sonarqube的運(yùn)行離不開數(shù)據(jù)庫,按照官方建議,本文使用postgresql來作為其數(shù)據(jù)庫。
docker run --name pgdb -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -e POSTGRES_DB=sonar -p 5432:5432 -v E:\docker-volume\postgresql\data:/var/lib/postgresql/data -d postgres
由于Sonarqube依賴ELK的運(yùn)行,默認(rèn)情況下最大虛擬內(nèi)存大小不足以支撐ELK的運(yùn)行,所以我們需要調(diào)大虛擬內(nèi)存的最大內(nèi)存:
# 設(shè)置elk運(yùn)行允許最大內(nèi)存,否則sonarqube無法正常啟動(適合windows Docker Desktop場景)
wsl -d docker-desktop
sysctl -w vm.max_map_count=262144
exit
然后,我們就可以運(yùn)行sonarqube容器了:
docker run --name sq --link pgdb -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://pgdb:5432/sonar -p 9000:9000 -v E:\docker-volume\sonarqube\data:/opt/sonarqube/data -v E:\docker-volume\sonarqube\extensions:/opt/sonarqube/extensions -v E:\docker-volume\sonarqube\logs:/opt/sonarqube/logs -d sonarqube
稍等幾分鐘后訪問localhost:9000,初始賬密為admin/admin,進(jìn)入后會要求立即修改密碼。
初始狀態(tài)下,Sonarqube是英文的,如果需要漢化包,可以在config > marketplace里面搜索chinese漢化插件下載安裝,也可以手動下載安裝,從Releases · xuhuisheng/sonar-l10n-zh (github.com)下載漢化包放到extensions/downloads下面,重啟sonarqube即可漢化,注意要下載和當(dāng)前sonarqube相對應(yīng)的漢化包,否則不兼容會導(dǎo)致不能使用。
然后重啟sonarqube,docker restart sq即可看到漢化版本的sonarqube了。
PS:sonarqube官方的插件網(wǎng)址:SonarQube? Plugins Index (sonarplugins.com)
二、手動創(chuàng)建和分析項(xiàng)目
2.1 方式一
點(diǎn)擊項(xiàng)目,選擇手動新建一個項(xiàng)目,自行輸入顯示名稱、項(xiàng)目標(biāo)識等,

選擇手動分析該項(xiàng)目,自定義一個令牌,一般寫項(xiàng)目英文名稱即可,方便記憶和查找,然后按照步驟走,就會出現(xiàn)如下界面。

然后到本地項(xiàng)目目錄下,執(zhí)行如上紅框中的命令:
mvn clean verify sonar:sonar -Dsonar.projectKey=activity-manage -Dsonar.host.url=http://localhost:9000 -Dsonar.login=1e00f453302829b4c70584c925e88527fff29a32
執(zhí)行完成后,再刷新Sonarqube界面,就能看到本次手動分析上傳的結(jié)果了。

2.2 方式二
如果嫌棄上述方式比較麻煩,畢竟還要手動在sonarqube上創(chuàng)建項(xiàng)目,還可以通過如下方式進(jìn)行:
修改本地maven的setting.xml,增加如下內(nèi)容:
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.login>admin</sonar.login>
<sonar.password>***</sonar.password>
<sonar.host.url>http://localhost:9000</sonar.host.url>
</properties>
</profile>
然后在項(xiàng)目目錄下執(zhí)行mvn sonar:sonar命令,即可將項(xiàng)目分析結(jié)果上傳到sonarqube上了。
2.3 方式三
該種方式適合沒有Maven的場景,首先從官網(wǎng)上下載sonar-scanner掃描器,下載地址:SonarScanner | SonarQube Docs
然后在sonarqube的個人賬戶那邊創(chuàng)建一個token:

當(dāng)前項(xiàng)目增加sonarqube的配置內(nèi)容:sonar-project.properties
sonar.projectKey=java-cicd-test
sonar.projectName=java-cicd-test
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.java.binaries=target/classes
然后在項(xiàng)目根目錄下執(zhí)行命令:
D:\sonar-scanner\sonar-scanner-4.7.0.2747-windows\bin\sonar-scanner.bat -Dsonar.login=54f0c382ef7c0b10f84f5d1c81de7070161d473f
即可對項(xiàng)目進(jìn)行分析并將結(jié)果上傳到sonarqube了。
三、使用sonarlint進(jìn)行分析
IDEA安裝sonarlint是免費(fèi)的,提前安裝好后其內(nèi)置了默認(rèn)的規(guī)則即可對項(xiàng)目進(jìn)行掃描。但是如果需要讓項(xiàng)目開發(fā)團(tuán)隊(duì)所有人的sonarlint具有相同的規(guī)則,就需要和sonarqube進(jìn)行連接了。
在IDEA的File > settings > tools > sonarlint里面點(diǎn)擊加號新建一個連接,填寫信息如下:

然后下一步輸入認(rèn)證方式,我這里選擇賬戶密碼模式,輸入自己sonarqube的賬密保存即可,然后一路next直至finish。
剛才是新建連接,然后我們需要將IDEA中的當(dāng)前項(xiàng)目和sonarqube上的項(xiàng)目進(jìn)行綁定,所以首先我們得在sonarqube上新建一個項(xiàng)目,此處略過,參考上一步:

如此即可將sonarqube上設(shè)置的檢查規(guī)則同步到IDEA的sonarlint上了,實(shí)現(xiàn)開發(fā)人員代碼檢查規(guī)則的一致性。
注意,sonarlint并不能將檢查結(jié)果上傳到sonarqube,想一想也能理解,每個開發(fā)人員的代碼都可能不同,如果可以上傳的話以誰的為準(zhǔn)呢,而且開發(fā)人員IDEA中的代碼是不穩(wěn)地不可交付狀態(tài),掃描結(jié)果上傳到sonarqube也沒什么意義??梢詤⒖迹?a target="_blank">Bind to SonarQube or SonarCloud · SonarSource/sonarlint-intellij Wiki · GitHub
四、自定義檢查規(guī)則
4.1 創(chuàng)建新的質(zhì)量配置
從sonarqube的插件市場在線或者離線安裝PMD、CheckStyle等代碼檢查插件,具體步驟在第一部分已經(jīng)說過了。
然后質(zhì)量配置 > 創(chuàng)建,填寫新的質(zhì)量配置內(nèi)容如下:

如果需要繼承系統(tǒng)默認(rèn)的檢查規(guī)則,則上級可以選擇默認(rèn)的Sonar way。然后就進(jìn)入該新的質(zhì)量配置界面,可以看到左邊規(guī)則面板上,所有規(guī)則都是未激活狀態(tài),此時(shí)我們就可以自定義需要激活哪些規(guī)則。
點(diǎn)擊”更多激活規(guī)則“,在左側(cè)面板中找到想要使用的PMD規(guī)則,然后點(diǎn)擊”激活alibaba code guide“表示將該P(yáng)MD的268條規(guī)則添加到我們自己新建的質(zhì)量配置中,然后再將該質(zhì)量配置設(shè)置為默認(rèn),以后掃描Java應(yīng)用時(shí)就會使用該條質(zhì)量配置了。

4.2 創(chuàng)建新的自定義檢查規(guī)則
sonarqube還允許我們自己創(chuàng)建檢查規(guī)則,比如檢查類中是否存在作者信息、檢查不允許出現(xiàn)某些敏感詞等,這些規(guī)則是現(xiàn)有內(nèi)置規(guī)則和其它插件規(guī)則中所沒有的,使用場景比較少,后面有時(shí)間再研究。
五、其它配置
4.1 整合Gitlab
Sonarqube整合Gitlab主要就如下四個功能:
- 實(shí)現(xiàn)使用Gitlab賬號免密登錄sonarqube;
- 導(dǎo)入Gitlab中的項(xiàng)目到sonarqube中;
- 配合Gitlab CICD將sonarqube集成在流水線中對代碼質(zhì)量進(jìn)行分析;
- 針對每次合并代碼報(bào)告質(zhì)量門禁和代碼指標(biāo);
這些功能好像都沒什么使用場景,特別是在如今Jenkins+Gitlab實(shí)現(xiàn)DevOps的情況下,后面有機(jī)會再研究,也可以參考官方的使用文檔自行研究:
GitLab Integration | SonarQube Docs
4.3 整合Jenkins
可將sonarqube整合到Jenkins的Pipeline流水線中對代碼質(zhì)量進(jìn)行分析,這塊內(nèi)容是現(xiàn)在DevOps的主流,將在后續(xù)《Jenkins+Gitlab搭建CICD流程進(jìn)階》中再詳細(xì)介紹。