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