sonar和gitlab-ci集成

背景介紹

我們知道使用 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é)果爹谭,詳情查看該插件文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榛搔,一起剝皮案震驚了整個(gè)濱河市诺凡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌践惑,老刑警劉巖腹泌,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尔觉,居然都是意外死亡凉袱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門侦铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专甩,“玉大人,你說我怎么就攤上這事钉稍〉佣悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵贡未,是天一觀的道長(zhǎng)种樱。 經(jīng)常有香客問我,道長(zhǎng)俊卤,這世上最難降的妖魔是什么嫩挤? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮消恍,結(jié)果婚禮上岂昭,老公的妹妹穿的比我還像新娘。我一直安慰自己狠怨,他們只是感情好约啊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布邑遏。 她就那樣靜靜地躺著,像睡著了一般棍苹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵汰,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天枢里,我揣著相機(jī)與錄音,去河邊找鬼蹂午。 笑死栏豺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豆胸。 我是一名探鬼主播奥洼,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晚胡!你這毒婦竟也來了灵奖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤估盘,失蹤者是張志新(化名)和其女友劉穎瓷患,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遣妥,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擅编,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箫踩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爱态。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖境钟,靈堂內(nèi)的尸體忽然破棺而出锦担,到底是詐尸還是另有隱情,我是刑警寧澤慨削,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布吆豹,位于F島的核電站,受9級(jí)特大地震影響理盆,放射性物質(zhì)發(fā)生泄漏痘煤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一猿规、第九天 我趴在偏房一處隱蔽的房頂上張望衷快。 院中可真熱鬧,春花似錦姨俩、人聲如沸蘸拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调窍。三九已至宝冕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邓萨,已是汗流浹背地梨。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缔恳,地道東北人宝剖。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像歉甚,于是被迫代替她去往敵國和親万细。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容