背景介紹
我們知道使用 SonarQube 可以在日常開發(fā)中檢測(cè)代碼質(zhì)量被廓,除了使用 IDE 上集成 SonarLint 插件檢測(cè)外拜鹤,如果我們想針對(duì)代碼托管在 Gitlab 上每次 commit 的文件做代碼檢測(cè)看杭,可以不可以呢惭等?答案是肯定的褒纲,我們可以使用 Sonar GitLab Plugin 插件完成翁狐,該插件會(huì)針對(duì)每次提交修改的文件类溢,添加注釋行,同時(shí)添加本次提交的代碼檢測(cè)結(jié)果的評(píng)論露懒。我們還可以配合 gitlab-ci 完成每次 commit 時(shí)闯冷,添加的代碼檢測(cè) Pipelines stage 流程,來控制代碼檢測(cè)流程是否通過懈词。
環(huán)境蛇耀、軟件準(zhǔn)備
本次演示環(huán)境,我是在虛擬機(jī) Linux Centos7 和本機(jī) Mac OX 上操作坎弯,以下是安裝的軟件及版本:
Docker:version 1.12.6
SonarQube:version 6.5
sonar-gitlab-plugin:version 2.1.0
GitLab:version Community Edition 9.1.4
gitlab-runner:version 1.11.2
注意:我們將代碼托管在 GitLab 上纺涤,這里 GitLab 基于 Docker 安裝译暂,所以需要安裝 Docker,本次還需要演示 跟 gitlab-runner 配合使用撩炊,所以也需要安裝 gitlab-runner外永,這里 Docker、SonarQube拧咳、GitLab象迎、gitlab-runner 的安裝忽略。
Sonar GitLab Plugin 安裝
在 SonarQube 上安裝該插件安裝方式很簡(jiǎn)單呛踊。
方式一:可以直接下載sonar-gitlab-plugin-2.1.0該插件砾淌,放到<sonarqube_install_dir>/extensions/plugins目錄,重啟 SonarQube 即可谭网。
方式二:admin 登錄 SonarQube汪厨,點(diǎn)擊 配置 —> 系統(tǒng) —> 更新中心 —> Available —> Search,輸入 GitLab愉择,在列表中點(diǎn)擊 install 安裝劫乱,安裝完畢后重啟 SonarQube 即可。
注意:該插件 sonar-gitlab-plugin 兼容 SonarQube 的版本信息如下
SonarQubesonar-gitlab-pluginLast version
<version>< 5.4<version><= 1.6.61.66
5.4 <=<version>< 5.6<version>= 1.7.01.7.0
<version>>= 5.6<version>> 1.7.02.1.0
因?yàn)槲冶緳C(jī) SonarQube 版本為 6.5锥涕,所以這里我選擇 2.1.0 最新版本插件衷戈。
配置使用說明
1.配置 GitLab 通用賬戶
這里為了方便統(tǒng)一管理,我們?cè)?GitLab 上注冊(cè)一個(gè)通用賬號(hào):sonarQube层坠,作為對(duì)接 SonarQube 的統(tǒng)一賬戶殖妇,注冊(cè)過程略,獲取Token方式入下:
sonarQube 登錄破花,點(diǎn)擊 setting —> Account —> Private Token谦趣,獲取的 User Token 為下邊插件配置使用。同時(shí)還需要將 SonarQube 加到項(xiàng)目成員或項(xiàng)目所屬項(xiàng)目組成員里面去座每,這樣才能有權(quán)限 comment 和添加注釋行前鹅。
2.?配置 sonar-gitlab-plugin 插件
admin 登錄 SonarQube,點(diǎn)擊 配置 —> 通用配置 —> GitLab —> Reporting —> 設(shè)置 GitLab User Token 以及 GitLab url峭梳。
注意:GitLab url 為配置的 GitLab 服務(wù)地址(本機(jī) GitLab 地址:http://10.236.65.148)舰绘,GitLab User Token 為 GitLab 上用戶的 Token(這里使用上邊統(tǒng)一賬戶 sonarQube Token),其他配置默認(rèn)即可葱椭。
3.?配置 gitlab-runner
這里忽略 GitLab CI Runner 安裝過程捂寿,詳情參考之前文章Docker搭建自己的Gitlab CI Runner寫的比較詳細(xì)。這里我們以一個(gè) Maven Project:mavenDemo 為例演示挫以,我們配置.gitlab-ci.yml來實(shí)現(xiàn) sonar-gitlab-plugin 插件添加注釋行和檢測(cè)結(jié)果評(píng)論者蠕,以及 Pipeline Stage 代碼檢測(cè)流程是否通過窃祝。
配置 .gitlab-ci.yml
sonar_preview:
? stage: test
? script:
??? -ci/sonar_preview.sh
? except:
??? -master
? tags:
??? -wwyl
auto_test:
? stage: test
? script: ci/auto_test.sh
? except:
??? -master
? tags:
??? -wwyl
sonar_analyze:
? stage: test
? script:
??? -ci/sonar_analyze.sh
? only:
??? -master
? tags:
??? -hwy
說明:這里我們把 Pipeline 流程分為兩種掐松,一種是除了 master 分支的踱侣,進(jìn)行 sonar_preview (sonar 預(yù)覽) 以及 auto_test (模擬自動(dòng)化測(cè)試),另一種只針對(duì) master 分支大磺,進(jìn)行 sonar_analyze (sonar 分析)抡句,大概意思就是對(duì)非 master 分支進(jìn)行日常模擬自動(dòng)化測(cè)試和使用 Sonar Gitlab 插件添加注釋行和檢測(cè)結(jié)果評(píng)論以及本次提交代碼質(zhì)量是否通過,對(duì) master 分支上線前走一次靜態(tài)代碼檢測(cè)杠愧。每個(gè)步驟操作內(nèi)容如下待榔。
新增ci/auto_test.sh文件
#!/bin/bash
COMMITTER=$(git log -1 --format=%cE)
echo ${COMMITTER}
if [ $? -eq 0 ]; then
???? echo "do something for auto_test here."
???? echo "auto_test over."
fi?
說明:這里模擬自動(dòng)化測(cè)試腳本,具體使用時(shí)自己配置流济。
新增ci/sonar_analyze.sh文件
#!/bin/bash
mvn --batch-mode sonar:sonar \
??? -Dsonar.host.url=http://10.10.10.3:9000 \
??? -Dsonar.login=wanyang3 \
??? -Dsonar.password=****** \
??? -Dsonar.issuesReport.html.enable=true \
??? -Dsonar.analysis.mode=preview \
??? -Dsonar.preview.excludePlugins=issueassign,scmstats
if [ $? -eq 0 ]; then
??? echo "sonarqube code-analyze over."
fi
說明:這里 sonar.host.url 為本機(jī)或遠(yuǎn)程 SonarQube 服務(wù)地址锐锣,sonar.login & sonar.password
為賬戶和密碼,也可以使用 token绳瘟。后邊的幾個(gè)參數(shù)可參考之前文章SonarQube 插件之 Issues Report & SonarLint 的配置及使用說明雕憔。
新增ci/sonar_preview.sh文件
#!/bin/bash
mvn --batch-mode verify sonar:sonar \
??? -Dsonar.host.url=http://10.10.10.3:9000 \
??? -Dsonar.login=wanyang3 \
??? -Dsonar.password=****** \
??? -Dsonar.analysis.mode=preview \
??? -Dsonar.gitlab.project_id=$CI_PROJECT_ID \
??? -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \
??? -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
if [ $? -eq 0 ]; then
??? echo "sonarqube code-analyze-preview over."
fi
說明:sonar.gitlab.*參數(shù)為插件可使用變量,每個(gè)變量有不同的用處糖声,具體可參考Sonar Gitlab Plugins properties斤彼,$CI_PROJECT_ID,$CI_COMMIT_SHA蘸泻,$CI_COMMIT_REF_NAME等變量為 GitLab CI 變量琉苇,可以在 CI 流程中直接使用這些變量,具體可參考GitLab CI Variables悦施。
好了并扇,配置完成之后,我們現(xiàn)在可以修改并提交代碼抡诞,看看效果吧拜马。這里在 develop 分支故意寫一些垃圾代碼,驗(yàn)證下插件是否能夠正確添加注釋行以及添加檢測(cè)結(jié)果評(píng)論沐绒,master 分支做一下提交驗(yàn)證下之前 sonar 靜態(tài)代碼檢測(cè)結(jié)果俩莽。
cd mavenDemo
git checkout develop
添加垃圾代碼如下
...
String txt = "Hello world";
System.out.println(txt.substring(15));
int result = 1/0;
...
git commit -am "modify code"
git push
提交完畢之后,我們?nèi)?GitLab 該項(xiàng)目下查看 Pipelines 狀態(tài)乔遮、每個(gè) stage 的執(zhí)行日志以及本次提交的文件插件添加的注釋行和檢測(cè)結(jié)果評(píng)論吧扮超。
說明: 從上圖我們可以看到整個(gè) pipelines 狀態(tài)是 Failed 狀態(tài),因?yàn)?Sonar 檢測(cè)結(jié)果中有嚴(yán)重級(jí)別的 bug 不能通過蹋肮,這也正是我們想要的結(jié)果出刷。還有我們?cè)?i>.gitlab-ci.yml文件中配置了非 master 分支執(zhí)行 auto_test、sonar_preview 兩步操作坯辩,圖上可以看出有三步操作馁龟,那是因?yàn)樽詈笠徊绞?External 外部的 sonarqube 增加的檢測(cè)步驟。
說明:從上圖可以看出 sonar-gitlab 插件針對(duì)有問題的代碼行增加了注釋行漆魔,同時(shí)增加了本次 commit 的文件的檢測(cè)結(jié)果的評(píng)論坷檩,一目了然却音。
好了,通過這個(gè)插件配合 GitLab CI 我們可以很方便的做到對(duì)日常每次提交做代碼檢測(cè)矢炼,大大提高了我們代碼質(zhì)量系瓢,當(dāng)然要想寫出高質(zhì)量代碼還得靠我們自己的哈,這里只不過是再做了一次代碼檢測(cè)句灌,避免意外情況導(dǎo)致的代碼錯(cuò)誤夷陋。同時(shí),我們可以把這個(gè)流程做到日常開發(fā)持續(xù)集成步驟中胰锌,也是大有裨益的骗绕。
另外,如果我們不想使用 GitLab CI 使用該插件资昧,也可以直接使用命令行的方式返回結(jié)果爹谭,詳情查看該插件文檔。