背景介紹
我們知道使用 SonarQube 可以在日常開發中檢測代碼質量,除了使用 IDE 上集成 SonarLint 插件檢測外,如果我們想針對代碼托管在 Gitlab 上每次 commit 的文件做代碼檢測,可以不可以呢?答案是肯定的,我們可以使用 Sonar GitLab Plugin 插件完成,該插件會針對每次提交修改的文件,添加注釋行,同時添加本次提交的代碼檢測結果的評論。我們還可以配合 gitlab-ci 完成每次 commit 時,添加的代碼檢測 Pipelines stage 流程,來控制代碼檢測流程是否通過。
環境、軟件準備
本次演示環境,我是在虛擬機 Linux Centos7 和本機 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 上安裝該插件安裝方式很簡單。
方式一:可以直接下載sonar-gitlab-plugin-2.1.0該插件,放到<sonarqube_install_dir>/extensions/plugins目錄,重啟 SonarQube 即可。
方式二:admin 登錄 SonarQube,點擊 配置 —> 系統 —> 更新中心 —> Available —> Search,輸入 GitLab,在列表中點擊 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
因為我本機 SonarQube 版本為 6.5,所以這里我選擇 2.1.0 最新版本插件。
配置使用說明
1.配置 GitLab 通用賬戶
這里為了方便統一管理,我們在 GitLab 上注冊一個通用賬號:sonarQube,作為對接 SonarQube 的統一賬戶,注冊過程略,獲取Token方式入下:
sonarQube 登錄,點擊 setting —> Account —> Private Token,獲取的 User Token 為下邊插件配置使用。同時還需要將 SonarQube 加到項目成員或項目所屬項目組成員里面去,這樣才能有權限 comment 和添加注釋行。
2.?配置 sonar-gitlab-plugin 插件
admin 登錄 SonarQube,點擊 配置 —> 通用配置 —> GitLab —> Reporting —> 設置 GitLab User Token 以及 GitLab url。
注意:GitLab url 為配置的 GitLab 服務地址(本機 GitLab 地址:http://10.236.65.148),GitLab User Token 為 GitLab 上用戶的 Token(這里使用上邊統一賬戶 sonarQube Token),其他配置默認即可。
3.?配置 gitlab-runner
這里忽略 GitLab CI Runner 安裝過程,詳情參考之前文章Docker搭建自己的Gitlab CI Runner寫的比較詳細。這里我們以一個 Maven Project:mavenDemo 為例演示,我們配置.gitlab-ci.yml來實現 sonar-gitlab-plugin 插件添加注釋行和檢測結果評論,以及 Pipeline Stage 代碼檢測流程是否通過。
配置 .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 分支的,進行 sonar_preview (sonar 預覽) 以及 auto_test (模擬自動化測試),另一種只針對 master 分支,進行 sonar_analyze (sonar 分析),大概意思就是對非 master 分支進行日常模擬自動化測試和使用 Sonar Gitlab 插件添加注釋行和檢測結果評論以及本次提交代碼質量是否通過,對 master 分支上線前走一次靜態代碼檢測。每個步驟操作內容如下。
新增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?
說明:這里模擬自動化測試腳本,具體使用時自己配置。
新增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 為本機或遠程 SonarQube 服務地址,sonar.login & sonar.password
為賬戶和密碼,也可以使用 token。后邊的幾個參數可參考之前文章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.*參數為插件可使用變量,每個變量有不同的用處,具體可參考Sonar Gitlab Plugins properties,$CI_PROJECT_ID,$CI_COMMIT_SHA,$CI_COMMIT_REF_NAME等變量為 GitLab CI 變量,可以在 CI 流程中直接使用這些變量,具體可參考GitLab CI Variables。
好了,配置完成之后,我們現在可以修改并提交代碼,看看效果吧。這里在 develop 分支故意寫一些垃圾代碼,驗證下插件是否能夠正確添加注釋行以及添加檢測結果評論,master 分支做一下提交驗證下之前 sonar 靜態代碼檢測結果。
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
提交完畢之后,我們去 GitLab 該項目下查看 Pipelines 狀態、每個 stage 的執行日志以及本次提交的文件插件添加的注釋行和檢測結果評論吧。
說明: 從上圖我們可以看到整個 pipelines 狀態是 Failed 狀態,因為 Sonar 檢測結果中有嚴重級別的 bug 不能通過,這也正是我們想要的結果。還有我們在.gitlab-ci.yml文件中配置了非 master 分支執行 auto_test、sonar_preview 兩步操作,圖上可以看出有三步操作,那是因為最后一步是 External 外部的 sonarqube 增加的檢測步驟。
說明:從上圖可以看出 sonar-gitlab 插件針對有問題的代碼行增加了注釋行,同時增加了本次 commit 的文件的檢測結果的評論,一目了然。
好了,通過這個插件配合 GitLab CI 我們可以很方便的做到對日常每次提交做代碼檢測,大大提高了我們代碼質量,當然要想寫出高質量代碼還得靠我們自己的哈,這里只不過是再做了一次代碼檢測,避免意外情況導致的代碼錯誤。同時,我們可以把這個流程做到日常開發持續集成步驟中,也是大有裨益的。
另外,如果我們不想使用 GitLab CI 使用該插件,也可以直接使用命令行的方式返回結果,詳情查看該插件文檔。