在傳統(tǒng)IT項(xiàng)目開發(fā)過程中,團(tuán)隊(duì)最害怕的便是在交付前的集成測試階段突然發(fā)現(xiàn)bug而導(dǎo)致項(xiàng)目延遲甚至項(xiàng)目失敗。而如今,憑借先進(jìn)的持續(xù)集成技術(shù),我們可以在開發(fā)過程中及時(shí)判斷開發(fā)趨勢,發(fā)現(xiàn)開發(fā)漏洞并做出有效的判斷。每天進(jìn)行多次集成,每次集成通過自動(dòng)化的構(gòu)建進(jìn)行驗(yàn)證,從而盡早發(fā)現(xiàn)集成錯(cuò)誤,極大程度地保證了項(xiàng)目開發(fā)的進(jìn)程與質(zhì)量。在下文中,我們將詳細(xì)討論如何通過SonarQube代碼質(zhì)量管理系統(tǒng)以及Jenkins工具實(shí)現(xiàn)自動(dòng)化持續(xù)集成。
開發(fā)團(tuán)隊(duì)的協(xié)作中不可避免的存在以下問題:
1. 新手。項(xiàng)目組的實(shí)習(xí)生由于初來乍到對于軟件開發(fā)經(jīng)驗(yàn)不足,而項(xiàng)目在人手又不夠的情況下直接將新人拉入正式環(huán)境工作,為項(xiàng)目埋下不規(guī)范代碼的隱患。
2. 人員流動(dòng)。老員工維護(hù)的模塊可能不易于新員工的維護(hù),由于工作交接不到位、水平層次和編碼習(xí)慣不同的原因造成低質(zhì)量代碼的出現(xiàn)。
3. 代碼規(guī)范意識薄弱或者疏忽。有些開發(fā)人員可能沒有接受過專門的質(zhì)量培訓(xùn),或者在編碼時(shí)疏忽了一些規(guī)則,隨意編寫不規(guī)范的代碼。
以上問題會(huì)導(dǎo)致項(xiàng)目的維護(hù)效率低下,代碼交接變得困難,有潛在的性性能和安全問題等等。因此,代碼質(zhì)量審查是現(xiàn)代開發(fā)團(tuán)隊(duì)必不可少的過程。
如何解決:
代碼復(fù)查(Code Review)是很不錯(cuò)的一個(gè)解決方案,即讓項(xiàng)目Leader或者有經(jīng)驗(yàn)的員工專門對成員的代碼進(jìn)行復(fù)查。但是代碼復(fù)查的人力代價(jià)太大,試想將項(xiàng)目有經(jīng)驗(yàn)的員工拉取做代碼復(fù)查,開發(fā)進(jìn)度勢必會(huì)受到影響,而且軟件項(xiàng)目通常是龐大的,其工作量可想而知。因此,在人工之外,我們討論一種利用機(jī)器的自動(dòng)化代碼審查工具SonarQube。
SonarQube利刃:
SonarQube為代碼的質(zhì)量管理提供了一個(gè)平臺,對傳統(tǒng)的靜態(tài)檢測如PMD和findBugs等工具進(jìn)行整合,并且提供了豐富而強(qiáng)大的插件,以適用于各種語言的代碼質(zhì)量分析。
支持的語言:Java, C/C++, Objective-C, C#, PHP, Flex, Groovy, JavaScript, Python, PL/SQL, COBOL等。
支持安卓代碼審查
審查重復(fù)代碼,代碼標(biāo)準(zhǔn),單元測試,測試覆蓋率,代碼復(fù)雜度,潛在的bug,多余的注釋,代碼設(shè)計(jì)和結(jié)構(gòu)等,提供多方面的報(bào)告。
記錄評審歷史,提供多種視圖的評估報(bào)告圖表。
提供完全的自動(dòng)化分析:可以和Maven,Ant,Gradle整合,也可以整合持續(xù)集成工具,如Jenkins。
可以使用插件擴(kuò)展
通過實(shí)現(xiàn)SQALE(基于軟件生命周期的質(zhì)量評定)來評估技術(shù)債務(wù)。
(圖1.SonarQube分析結(jié)果概覽)
但是SonarQube的配置和部署相對而言依舊繁瑣,為了進(jìn)一步解放人力,我們使用Jenkins將SonarQube的分析過程封裝起來,達(dá)到代碼質(zhì)量審查階段的持續(xù)集成。
Jenkins指揮中心:
Jenkins是一款優(yōu)秀的開源持續(xù)集成工具,可以實(shí)現(xiàn)代碼的編譯,測試,部署,監(jiān)控等各種工作的自動(dòng)化執(zhí)行。也有各種各樣的插件可以供開發(fā)人員封裝使用。
Jenkins為軟件開發(fā)提供了持續(xù)集成的服務(wù)。支持主流的代碼管理工具如CVS,Subversion,Git等。可以構(gòu)建Ant,Maven項(xiàng)目,執(zhí)行任意的shell腳本和windows批處理。
Jenkins的構(gòu)建可以通過多種方式觸發(fā):
版本控制系統(tǒng)中的一次代碼提交
設(shè)置cron表達(dá)式以定時(shí)執(zhí)行
當(dāng)其它項(xiàng)目構(gòu)建時(shí)觸發(fā)
通過請求一個(gè)特定的URL
協(xié)同作戰(zhàn)
作戰(zhàn)目標(biāo):
配置Jenkins,拉取(pull)項(xiàng)目代碼到Jenkins服務(wù)器,指揮Maven執(zhí)行構(gòu)建和單元測試。完成后指揮SonarQube質(zhì)量分析,SonarQube會(huì)將分析結(jié)果上傳至Sonar服務(wù)器,此間我們要編寫腳本獲取該分析結(jié)果的URL,將Jenkins的所有構(gòu)建測試分析結(jié)果email給代碼所有者和項(xiàng)目Leader。
實(shí)戰(zhàn)開始:
在Jenkins服務(wù)器上安裝Git,Maven,SonarQuber Scanner等軟件,并配置好。
配置SonarQube的路徑和用戶名密碼。
安裝Jenkins的Git插件,SonarQube插件
創(chuàng)建一個(gè)任務(wù),配置任務(wù)的Git地址,分支信息等,點(diǎn)擊Add post-build step按鈕選擇InvokeStandalone SonarQube Analysis,對于Maven項(xiàng)目來說,默認(rèn)支持sonar分析,所以直接構(gòu)建即可,但是其它項(xiàng)目需要配置Analysis Properties。具體配置可以參考官方資料。
在控制臺中我們可以看到項(xiàng)目被構(gòu)建,執(zhí)行單元測試,執(zhí)行Sonar分析。執(zhí)行順利的話會(huì)得到EXECUTION SUCCESS的提示,并貼出Sonar的鏈接地址。
使用腳本,處理控制臺信息并發(fā)送郵件。
立即構(gòu)建,搞定!靜靜等待郵箱的郵件就行了。
后續(xù)
看到這里,讀者們是不是發(fā)現(xiàn)Jenkins的部署和配置相對而言依舊繁瑣呢?如何再一次解放人力,將Jenkins的部署和配置完全自動(dòng)化呢?通過編寫腳本,結(jié)合使用Puppet我們甚至可以實(shí)現(xiàn)自己的Jenkins和SonarQube集群,一鍵部署一鍵配置。以后的文章再詳細(xì)討論。
值得一提的是,新致開發(fā)云通過docker鏡像為大家提供SonarQube和Jenkins的一鍵部署功能,開發(fā)團(tuán)隊(duì)能夠從繁瑣的配置工作中解脫出來,方便開發(fā)團(tuán)隊(duì)實(shí)現(xiàn)秒級部署開發(fā)環(huán)境與測試環(huán)境。使用SonarQube來review我們的代碼,提高代碼質(zhì)量;使用Jenkins來實(shí)現(xiàn)持續(xù)集成,從而為項(xiàng)目開發(fā)團(tuán)隊(duì)提高了持續(xù)交付的能力。