一、背景介紹html
咱們知道使用 SonarQube 能夠在平常開發中檢測代碼質量,除了使用 IDE 上集成 SonarLint 插件檢測外,若是咱們想針對代碼託管在 Gitlab 上每次 commit 的文件作代碼檢測,能夠不能夠呢?答案是確定的,咱們可使用 Sonar GitLab Plugin 插件完成,該插件會針對每次提交修改的文件,添加註釋行,同時添加本次提交的代碼檢測結果的評論。咱們還能夠配合 gitlab-ci 完成每次 commit 時,添加的代碼檢測 Pipelines stage 流程,來控制代碼檢測流程是否經過。git
二、環境、軟件準備github
本次演示環境,我是在虛擬機 Linux Centos7 和本機 Mac OX 上操做,如下是安裝的軟件及版本:bash
注意:咱們將代碼託管在 GitLab 上,這裏 GitLab 基於 Docker 安裝,因此須要安裝 Docker,本次還須要演示 跟 gitlab-runner 配合使用,因此也須要安裝 gitlab-runner,這裏 Docker、SonarQube、GitLab、gitlab-runner 的安裝忽略。maven
三、Sonar GitLab Plugin 安裝gitlab
在 SonarQube 上安裝該插件安裝方式很簡單。測試
方式一:能夠直接下載 sonar-gitlab-plugin-2.1.0 該插件,放到 <sonarqube_install_dir>/extensions/plugins
目錄,重啓 SonarQube 便可。url
方式二:admin 登陸 SonarQube,點擊 配置 —> 系統 —> 更新中心 —> Available —> Search,輸入 GitLab,在列表中點擊 install 安裝,安裝完畢後重啓 SonarQube 便可。spa
注意:該插件 sonar-gitlab-plugin 兼容 SonarQube 的版本信息以下.net
SonarQube | sonar-gitlab-plugin | Last version |
---|---|---|
<version> < 5.4 |
<version> <= 1.6.6 |
1.66 |
5.4 <= <version> < 5.6 |
<version> = 1.7.0 |
1.7.0 |
<version> >= 5.6 |
<version> > 1.7.0 |
2.1.0 |
由於我本機 SonarQube 版本爲 6.5,因此這裏我選擇 2.1.0 最新版本插件。
四、配置使用說明
4.1 配置 GitLab 通用帳戶
這裏爲了方便統一管理,咱們在 GitLab 上註冊一個通用帳號:sonarQube,做爲對接 SonarQube 的統一帳戶,註冊過程略,獲取Token方式入下:
sonarQube 登陸,點擊 setting —> Account —> Private Token,獲取的 User Token 爲下邊插件配置使用。同時還須要將 SonarQube 加到項目成員或項目所屬項目組成員裏面去,這樣纔能有權限 comment 和添加註釋行。
4.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),其餘配置默認便可。
4.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: - hwy auto_test: stage: test script: ci/auto_test.sh except: - master tags: - hwy sonar_analyze: stage: test script: - ci/sonar_analyze.sh only: - master tags: - hwy
sonar_preview:
stage: test
script:
- ci/sonar_preview.sh
except:
- master
tags:
- hwy
auto_test:
stage: test
script: ci/auto_test.sh
except:
- master
tags:
- hwy
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
#!/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.236.65.36: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
#!/bin/bash
mvn --batch-mode sonar:sonar \
-Dsonar.host.url=http://10.236.65.36: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.236.65.36: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
#!/bin/bash
mvn --batch-mode verify sonar:sonar \
-Dsonar.host.url=http://10.236.65.36: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
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 使用該插件,也能夠直接使用命令行的方式返回結果,詳情查看該插件文檔。
參考資料