sonar和gitlab-ci集成

背景介紹

我們知道使用 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 使用該插件,也可以直接使用命令行的方式返回結果,詳情查看該插件文檔。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容