自動化的高效團(tuán)隊開發(fā)環(huán)境
這兩天無意翻到幾個月前的Evernote筆記,看到了當(dāng)時對團(tuán)隊開發(fā)環(huán)境的一些想法。可惜后來種種,這一想法未能得到實(shí)踐,只能將其完善后公諸于眾,立此存照,日后有空可以一試。
考慮這套開發(fā)環(huán)境是因為我們遇到了這些問題:
開發(fā)人員的環(huán)境并不統(tǒng)一:dev在osx,ubuntu 11.10和ubuntu 12.04上工作,而ux在windows下工作,協(xié)調(diào),解決問題不太方便,尤其是一個bug在A的系統(tǒng)出現(xiàn),卻在自己的環(huán)境下無法復(fù)用。
無法即刻搭建和線上同版本的環(huán)境,解決線上問題。小團(tuán)隊節(jié)奏很快,當(dāng)前的工作目錄可能和線上版本差幾天的代碼(diff可能已經(jīng)是巨量),所以當(dāng)線上出問題時,將工作環(huán)境切換過去非常耗時(尤其是數(shù)據(jù)庫發(fā)生變化時)。
為新員工構(gòu)建開發(fā)環(huán)境耗時且問題重重。這和第一點(diǎn)有些類似,即在ubuntu下工作的構(gòu)建開發(fā)環(huán)境的流程在osx下會break。尤其是后期我們不斷有開發(fā)人員轉(zhuǎn)換系統(tǒng)到osx下。
當(dāng)時正好看到一篇關(guān)于 vagrant 的文章,感覺這正是我想要的救命稻草。
2、理想的開發(fā)環(huán)境
我心目中理想的開發(fā)環(huán)境應(yīng)該是這樣子的:
編輯環(huán)境和運(yùn)行/測試環(huán)境分離。這意味著開發(fā)人員,不管是dev還是ux,可以使用任何她喜歡的系統(tǒng)進(jìn)行內(nèi)容的編輯,而其產(chǎn)出可以無縫地運(yùn)行在另一個統(tǒng) 一的環(huán)境。無縫是很重要的體驗,如果分離意味著在兩個系統(tǒng)顯示地頻繁切換,那還不如不分離;在此基礎(chǔ)上的統(tǒng)一的環(huán)境則讓大家在同一個上下文中交流。
開發(fā)人員可以同時工作在好幾個版本下。在途客圈,一個relase(或者一個scrum)以兩周為周期,一周開發(fā),一周測試,然后就上線,如圖所示:
這意味著在任何一周,開發(fā)人員同時工作在3個不同的branch上,以week 3第一天為例:Dalian已經(jīng)部署到線上,Edingburgh交付測試,而Florence正在開發(fā)中。開發(fā)人員能夠無痛地在這三個環(huán)境中任意切換, 就像任務(wù)調(diào)度一樣,保存上下文,切換到另一個branch,開始工作。作為小團(tuán)隊,我們不希望甚至不可能將有限的人員切成三份來運(yùn)作,所以應(yīng)該通過工具支 持這種開發(fā)狀態(tài)。
能很好地支持持續(xù)集成。travis-ci.org 跑跑開源項目還可以,但商業(yè)項目就免了,而且其每次構(gòu)建都rebuild整套環(huán)境這個效率太低。
3、構(gòu)建理想的開發(fā)環(huán)境
存在的問題和期望的解決方案已經(jīng)擺出來了,接下來就是如何實(shí)現(xiàn)的問題。這種場景是典型的虛擬機(jī)大展拳腳的地方,VmWare會很欣慰地擺出VDI + vSphere的解決方案。不過小團(tuán)隊人少錢緊,自然只能尋找免費(fèi)的替代品,即之前提到的 vagrant。
什么是VAGRANT?
我對它的不太確切的理解是:一套自動化創(chuàng)建,部署和使用虛擬機(jī)的工具。vagrant 原生支持virtualbox,這就足夠了。通過一系列CLI命令,我們可以很方便地操作虛擬機(jī)。
創(chuàng)建并運(yùn)行虛擬機(jī):
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box $ vagrant init lucid32 $ vagrant up |
登入虛擬機(jī):
$ vagrant ssh |
打包虛擬機(jī):
$ vagrant package --vagrantfile Vagrantfile.pkg |
更詳細(xì)的 vagrant 使用說明請參考其文檔,這里就不詳細(xì)介紹。
如何使用VAGRANT構(gòu)建理想的開發(fā)環(huán)境
在這個模型中,大家交流的基礎(chǔ)是虛擬機(jī)。虛擬機(jī)隨時被創(chuàng)建,隨時又銷毀,有一個box服務(wù)器 vagrant repo 來統(tǒng)一存儲所有box并提供上傳/下載服務(wù)。box服務(wù)器提供兩類box:
基準(zhǔn)box。每天半夜從GitHub pull相應(yīng)branch的代碼,并輔以對應(yīng)的database,自動打包成一個基準(zhǔn)box。每個活躍的branch每天都會有一個新的基準(zhǔn)box。基準(zhǔn)box保存一周足矣。大家新的一天工作的基礎(chǔ)是基準(zhǔn)box。
PR box。解決線上問題時,和QA,CI交流使用的box。
任意一個box都是一個沙箱,它包含和線上環(huán)境同版本的操作系統(tǒng),運(yùn)行環(huán)境。同時里面有對應(yīng)branch的代碼庫和數(shù)據(jù)庫。數(shù)據(jù)庫采用線上數(shù)據(jù) 庫的一個子集,可以讓系統(tǒng)正常運(yùn)行即可。box和用戶的host OS間可以共享目錄,比如說代碼的目錄,這樣可以讓用戶通過host OS上的個性化編輯環(huán)境撰寫代碼。此外,box里的port和host OS的port要能一一映射,這樣用戶完全具有本地的測試體驗。
詳細(xì)的環(huán)境和工作場景參見下圖:
適用場景
這樣的開發(fā)環(huán)境能滿足本地辦公團(tuán)隊,甚至遠(yuǎn)程辦公團(tuán)隊的需要。
同一個地點(diǎn)辦公的團(tuán)隊,vagrant repo 服務(wù)器可以放在本地,以獲得最好的下載速度。
異地辦公或者服務(wù)于開源項目的松散團(tuán)隊,可以把 bagrant repo 放在一個公網(wǎng)服務(wù)器,讓參與者都能訪問(安全性不在本文討論)。訪問速度的問題可以通過本地緩存來解決,這樣在多人下載同一個box時會有近乎本地訪問的體驗。
4、免責(zé)聲明
如引文所述,本文想法尚未來得及實(shí)踐,所以不保證能正常運(yùn)行,所以 “try it at your own risk”。筆者個人覺得這個想法的靠譜率在90%以上。