一種低成本的持續整合即時反饋解決方案

技術小美發表於2017-11-15

 1 持續整合、即時反饋與LavaLamp

即時反饋對於持續整合模式來講非常重要。事實上,它是持續整合的精髓所在。當某一個CI構建任務出現問題時,應當將該失敗資訊即時反饋給相關同學(包括RD、QA和其他關心程式碼CI情況的同學),以便觸發者或其他依賴於該構建過程者及時改正或回滾程式碼,快速迭代解決問題。如果沒有這樣的即時反饋機制,僅僅依賴於人工關注hudson等CI Server介面的話,會造成響應速度變慢且不可控,問題修復週期延長,進而破壞持續整合的有效性。

目前可用的持續整合即時反饋手段很多,包括Email群發、簡訊息群發、RSS訂閱、GTalk通知,甚至Twitter訊息等。其中一種令人耳目一新的解決方案是“LavaLamp”,即我們俗稱的“神燈”。



 



圖1:LavaLamp 神燈



LavaLamp本質上是一盞USB燈,放在一臺靠近持續整合團隊的桌上型電腦上,通過安裝對應的CI Server外掛,能夠使用不同的顏色顯示指定持續整合任務的當前狀態(譬如紅色表示失敗、黃色表示部分失敗、綠色表示成功)。此外它還能在持續整合任務失敗或部分失敗時,以警報聲(Beep)的方式引起注意。LavaLamp還能活躍團隊氣氛,讓持續整合實踐團隊處在一種比較酷的氛圍中,進而調動其成員解決問題的積極性。百度的Ecom部門目前已經有產品線採用了商業化LavaLamp解決方案,在持續整合過程中使用效果不錯,但需要一些資金投入。

毛主席教導我們:“要多快好省地建設社會主義”,而鄧小平同志也教導我們:“不管黑貓白貓,逮著老鼠就是好貓”。

因此,本文將基於hudson平臺(現在已經改名為Jenkins了)探討一種免費的持續整合即時反饋解決方案,能達成與Lavalamp 神燈同樣甚至更好地視覺和聽覺效果,再通過配合其他的即時反饋手段(譬如百度HI群),實現有百度特色的持續整合之路。

2 讓顯示器客串Lavalamp
Lavalamp的思路其實很簡單:把持續整合構建任務的狀態暴露在大眾視線之下,而不是湮沒在CI Server或瀏覽器中。只不過其實現是基於特定裝置(USB燈及其控制器),需要投入一些成本。

那麼,有沒有免費的的視覺效果解決方案呢?當然有!那就是我們們——顯示器。

事實上,hudson官方網站上已經提供了一個非常好的外掛,名叫Extreme Feedback Panel(簡稱XFPanel,http://wiki.hudson-ci.org/display/HUDSON/eXtreme+Feedback+Panel+Plugin)。顧名思義,該外掛提供了一種特殊格式的hudson檢視,當在瀏覽器上訪問該檢視時,它會將檢視內各個Job的當前狀態以醒目的方式顯示出來。如果使用瀏覽器的全屏功能(按F11切換),就能達到如下圖所示的效果:



 

 



這樣,我們們工位上閒置的LCD顯示器就能成功客串為LavaLamp啦。而且LCD顯示的資訊要比LavaLamp多得多。後者只能通過顏色變化提示,而大家無法獲知是哪個job掛了,具體資訊還是得上CI介面上檢視。而通過XFPanel外掛,團隊成員能一目瞭然各個Job的當前狀況,甚至還能獲知是誰commit程式碼引發了問題,以及QA的Quick Test Case失敗了幾個,這樣更能體現持續整合的速度優勢。

那麼,該如何使用該外掛呢?

首先,請從hudson官方網站下載XFPanel外掛為.hpi檔案,並在hudson的外掛管理介面匯入該外掛,當然別忘了重啟hudson伺服器。這個過程本文不再贅述。

然後,點選新建檢視,並選擇檢視型別為“eXtreme Feedback Panel”,如下圖所示:



 

 



接下來,點選OK,在檢視設定介面進行配置。如下圖所示:



 

 

上述設定完畢後,該Extreme Feedback檢視就算搞定了。請切換到該檢視上,然後按F11鍵,將瀏覽器視窗切換到全屏。此外,你還需要在Windows中設定為“從不關閉顯示器”和“從不休眠”,並關掉螢幕保護程式(如下圖所示)。最後,把顯示器放在大家都能看到的高處。於是一臺功能強悍的顯示器版LavaLamp就誕生啦。



 

 

與Lavalamp相比,使用顯示器的好處是成本為0,且提供的資訊更為豐富,介面也更為醒目。當然,由於顯示器的耗電量要比lavalamp大,因此建議踐行該方法的CI團隊多去開展植樹活動,消除由此帶來的碳足跡。

3 讓音響發出任務失敗報警
僅僅由LCD顯示器顯示出持續整合任務的狀態資訊還是不夠的,因為在工作時大家都很投入,保不準就能及時看到顯示器上那大大的紅色感嘆號。在成熟的解決方案中,當關注的持續整合任務失敗或者部分失敗時,LavaLamp應當隨即發出“嘟——嘟——”的報警音訊,敦促責任人馬上著手解決問題。 而上一節介紹的XFPanel並沒有提供這樣的音訊功能。

Hudson官方網站上也提供了兩個外掛來嘗試解決該問題,分別叫做Hudson Sound 和 Hudson Speak。 二者都是在Job的Notify階段設定,所不同的是,前者能播放提前準備好的.wav音訊,而後者則通過TTS技術將一段文字讀出來。

這兩個外掛雖然很酷,但都要求將hudson伺服器安裝在一臺擁有音效卡裝置的伺服器上,並且最好是Windows伺服器(因為Linux伺服器即便有音效卡,其驅動情況也過於複雜)。當播放報警音訊時,這兩個外掛都只能在Hudson 伺服器本機上播放。也就是說,必須將Hudson伺服器搬到工位附近,而不能放在機房裡。

但在目前百度辦公網環境中,這樣做是不靠譜的,有如下理由:

※辦公網中的Windows機器沒有域名,訪問不便。

 ※ 放在工位上的伺服器很容易斷網、IP失效甚至斷電,讓CI服務的穩定性無從談起。

 ※ 所有辦公網中的計算機都訪問機房都要通過IDC機房隔離,且需要BNAC系統准入,在埠上有層層限制。

 

因此,直接使用Hudson音訊外掛是此路不通的。需要另行尋找其他解決途徑。

通過多次摸索和實驗,基於Hudson提供的Post Build Task外掛(主頁為 http://wiki.hudson-ci.org/display/HUDSON/Post+build+task),我們有了一個解決方案。

Hudson Post Build Task外掛安裝後能在Job配置頁面最後新增一套“Post Build Task”流程。該流程能在Job結束前檢查STDOUT輸出日誌內容,通過一些指定的字串進行匹配。當滿足給定的字串匹配條件時,就會觸發執行指定的指令碼。

因此,這裡我們的思路如下: 通過Post Build Task外掛監視持續整合任務輸出中有沒有“Build Fail”字串,若出現該字串,說明構建失敗,則遠端通過slave.jar執行上一節顯示器所述桌上型電腦上的一段指令碼發出報警聲。


具體做法如下: 

 · 第一步:請下載和安裝Post Build Task外掛,並重啟Hudson伺服器(這裡不再贅述)。

 ·第二步:請將上一節客串Lavalamp的顯示器所屬桌上型電腦(這裡簡稱其為“公告機”)加入Hudson節點池中。建議使用JNLP方式啟動其Slave.jar(這裡也不再贅述如何新增windows節點)。



 

 

·第三步,請建立一個負責發出報警聲的Hudson任務,名為“BuildFail_Notice”。該任務的功能非常簡單——繫結到上述“公告機”,並觸發windows的錄音機程式播放事先準備好的.wav格式報警音訊

 

 

 

 



上述命令中,錄音機的可執行檔案路徑為C:WINDOWSsystem32sndrec32.exe, 在命令列下執行時。使用/play參數列示播放指定檔案,使用/close參數列示播放完畢後退出錄音機程式,而通過/embedding引數來表示後臺方式執行,即不在Windows介面上顯示錄音機程式,以免影響持續整合XFPanel檢視。

請注意,這裡的build step型別應當是Windows Batch指令碼。

完成本步驟後,請將準備好的.wav檔案放在公告機的c:BuildFail.wav路徑處,然後手工觸發該任務,除錯一下,看是否能發出報警音訊。

·第四步,在各個需要失敗報警的Hudson任務中,增加Post Build Task步驟,其意圖是:當匹配到Build Fail或其他能表徵Job失敗的日誌時,就通過Hudson CLI命令列方式呼叫第三步準備好的失敗音訊報警任務。其Post Build Task配置如下圖所示。其中:

* 需要提前將hudson-cli.jar包放到各個Hudson Slave節點上去,該Jar包在hudson.war中可以找到;

* 呼叫hudson-cli.jar包時,-s參數列示hudson伺服器的URL地址,請根據自己部署hundson環境的實際情況填寫

* 呼叫hudson-cli.jar包時,使用build參數列示要構建一個任務,後面跟著被執行的任務名。在這裡要執行的就是負責發報警音訊的BuildFail_Notice任務。

* 在這裡,你還可以配置更多的字串匹配條件,並通過AND或者OR關係將他們組裝起來,成為一套更復雜的觸發條件。此外,還能為不同的觸發條件觸發不同的指令碼,譬如為Fail的任務觸發一個聲音,再為Unstable的任務觸發另一種聲音。



 

 

完成上述四個步驟後,一套不花一分錢的音訊觸發解決方案就搞定了。該方案看上去有些複雜,但設定起來其實一點也不麻煩。而且,其靈活性非常強,譬如:

 #你可以錄下自己的聲音作為持續整合報警音

 #你可以為不同的持續整合任務提供不同的報警音,這樣光聽到聲音就知道是哪個任務掛掉了

 #你可以為同一個持續整合任務的不同狀態觸發不同的報警音,這樣聽聲音就知道該任務是哪個失敗狀態了

 #你可以為某個特定的字串觸發報警音,而不僅僅侷限於任務失敗場景,譬如當執行Case成功率低於50%的時候再發出報警

 #等等…… 總之,只有想不到,沒有做不到!

你或許要問,為什麼不能直接使用遠端呼叫的方式觸發windows發報警音呢?You are right,通過SSH、Python rpyc乃至自己手寫Daemon的方式來遠端觸發播放報警音訊看上去更為直截了當,但在實踐過程中會碰到問題,那就是“IDC隔離”。

所謂IDC隔離,是將百度辦公網段和伺服器網段隔離開來,從辦公網只能訪問伺服器網段的有限範圍的埠,而從伺服器網段則能訪問辦公網段的任意埠,即單向埠隔離。這樣就帶來一個問題:目前Hudson伺服器是位於伺服器網段內的一臺Linux伺服器上,而負責播放失敗報警的Windows桌上型電腦則位於百度大廈的辦公網段中。以SSH遠端呼叫為例,當從Hudson伺服器直接發起SSH請求到這臺windows桌上型電腦時,根據Socket基本規則,Hudson伺服器訪問的是Windows桌上型電腦的22埠,而後者則訪問前者動態分配的埠。這個動態分配的client埠範圍是無法限定的,基本不會落在IDC隔離所允許的埠視窗範圍內。因此,造成從Linux伺服器直接向辦公網桌上型電腦發遠端呼叫請求會失敗。

而Hudson的slave.jar機制不存在上述問題,因為Slave.jar是主動去連Hudson伺服器的指定埠的,只要將hudson伺服器的監聽埠設定在視窗範圍內,則各個節點的Slave.jar就都能連上去並執行hudson要求的任務。

綜上所述,我們不得不捨近求遠,採用了一個看似曲折,實則曲徑通幽的解決方式。

4 後話
其實即時反饋的方式有很多。譬如最簡單的就是群發郵件。此外還可以通過即時通訊軟體、安裝在桌面上監聽軟體、手機、RSS訂閱等方式實現任務狀態的即時廣播提醒。你可以根據自己的需求,安裝對應的hudson外掛來使用這些功能。這些外掛可在hudson官方網站找到,URL為:http://wiki.hudson-ci.org/display/HUDSON/Plugins#Plugins-Buildnotifiers

但這些解決方案中,都沒有提到我們們百度人每天必用的Baidu HI,也不包括QQ等國產IM軟體。有志於hudson外掛的同學可以考慮為這些國產IM軟體開發對應的外掛,讓我們們的IM軟體業去露露臉。

其實除了外掛之外,我們也可以通過其他方式來在Baidu HI群上自動發出任務狀態通知。大體思路是:

 ·step1:為某一專案的持續整合專門註冊一個baidu hi賬號,並加入該專案的hi群

 ·step2:基於Sikuli或Watin或其他Web端自動化工具,編寫一段指令碼,訪問http://web.im.baidu.com/,用該賬號登陸併傳送通知到專案Hi群中

 ·step3:使用Post build task外掛,當匹配到符合條件的情況是,呼叫step2的指令碼,訪問網頁版百度HI發出通知訊息。 如果伺服器無法直接訪問外網,可參考前面解決音訊問題的思路,將該指令碼排程到辦公網環境的一臺桌上型電腦上執行。

總而言之,在持續整合的道路中,只有想不到,沒有做不到。同學們,發揮你們的聰明才智和創造力,讓我們的持續整合之路走得更加意氣風發,更加樂趣無窮!

baiduqaqablog@baidu.com

【本文轉自百度測試技術空間http://hi.baidu.com/baiduqa/blog/item/338063153719271cc93d6d21.html

本文轉自百度技術51CTO部落格,原文連結:http://blog.51cto.com/baidutech/744431,如需轉載請自行聯絡原作者


相關文章