前言
代碼部署是 Web 開(kāi)發(fā)過(guò)程中必不可少的一個(gè)環(huán)節(jié)捕传,伴隨著業(yè)務(wù)的更新迭代泉沾,一個(gè)項(xiàng)目幾乎每天都會(huì)有上線(xiàn)操作上岗。
上線(xiàn)就意味著改變現(xiàn)有的頁(yè)面樣式或功能邏輯凄鼻,這有可能會(huì)影響到用戶(hù)的使用随橘,所以上線(xiàn)部署代碼需要謹(jǐn)慎操作喂分。
但不論如何,還是有可能出現(xiàn)無(wú)法預(yù)料的問(wèn)題机蔗,這個(gè)時(shí)候需要有快速回滾機(jī)制蒲祈,讓線(xiàn)上業(yè)務(wù)不受影響。
因此萝嘁,我們需要一種簡(jiǎn)單高效的辦法來(lái)部署代碼梆掸,既能支持頻繁發(fā)布,又能兼顧安全可靠牙言。
工作流
在部署代碼的過(guò)程中酸钦,涉及到開(kāi)發(fā)機(jī)、Git 倉(cāng)庫(kù)咱枉、預(yù)發(fā)機(jī)卑硫、線(xiàn)上正式業(yè)務(wù)機(jī)等概念,組成的工作流如下圖示意:
1蚕断、提交代碼
當(dāng)在本地開(kāi)發(fā)&測(cè)試完畢后欢伏,將代碼合并到 master 分支,并 Push 到遠(yuǎn)程的 Git 倉(cāng)庫(kù)亿乳。
通常在開(kāi)發(fā)中使用 Git 作為代碼版本管理工具硝拧,通過(guò)創(chuàng)建一個(gè) dev 分支來(lái)進(jìn)行開(kāi)發(fā)工作,在發(fā)布的時(shí)候再將代碼合并到 master 分支葛假,這樣可以保證 master 分支永遠(yuǎn)都是穩(wěn)定的版本障陶。?
git ?push ?origin ?master
2、拉取并部署代碼到預(yù)發(fā)機(jī)
通過(guò)以下命令從 Git 倉(cāng)庫(kù)獲取到最新的代碼
git ?pull
因?yàn)殚_(kāi)發(fā)運(yùn)行環(huán)境和線(xiàn)上運(yùn)行環(huán)境的數(shù)據(jù)庫(kù)聊训、緩存等配置的差異抱究,拉取的代碼一般無(wú)法直接在預(yù)發(fā)機(jī)上直接運(yùn)行。
通常的做法是魔眨,在預(yù)發(fā)機(jī)上執(zhí)行一個(gè) shell 腳本媳维,將線(xiàn)上的配置覆蓋開(kāi)發(fā)環(huán)境的配置酿雪。
cp ? code/path/to/config-dist ? code/path/to/config
預(yù)發(fā)機(jī)的主要作用是留出緩沖的空間遏暴,檢驗(yàn)代碼是否在線(xiàn)上環(huán)境可以正常工作。對(duì)于一個(gè) Web 項(xiàng)目指黎,我們可以設(shè)置域名的 host 配置朋凉,直接訪(fǎng)問(wèn)預(yù)發(fā)機(jī)。
3醋安、同步代碼到線(xiàn)上
一般情況下杂彭,一個(gè) Web 項(xiàng)目都會(huì)有多個(gè)業(yè)務(wù)機(jī)墓毒,通過(guò)負(fù)載均衡將請(qǐng)求流量平均分配的 N 臺(tái)機(jī)器,以提高服務(wù)的承載能力和可用性亲怠。
因此所计,這里面臨著一個(gè)發(fā)布代碼到 N 臺(tái)機(jī)器的問(wèn)題。顯然团秽,我們不能一臺(tái)臺(tái)的發(fā)布主胧,這樣效率太低了。
通常习勤,我們通過(guò)在預(yù)發(fā)機(jī)上執(zhí)行 shell 腳本踪栋,將代碼 Rsync 到 N 臺(tái)機(jī)器上。
rsync ?/path/to/code user@127.0.0.1::path/to/code ?--exclude-list=exclude.list
4图毕、快速回滾
發(fā)布完代碼后夷都,我們會(huì)在預(yù)發(fā)機(jī)的 Git 倉(cāng)庫(kù)上執(zhí)行 :
git ?tag ?v20160522
的命令,記錄此次發(fā)布的版本予颤。
如果在發(fā)布后發(fā)現(xiàn)出了問(wèn)題囤官,可以在預(yù)發(fā)機(jī)的 Git 倉(cāng)庫(kù)執(zhí)行如下命令:
git ?tag ?-l
找出上一次發(fā)布的版本,并回滾代碼:
git ?reset ?--hard ?v20160521
然后蛤虐,再通過(guò)步驟 3 的方式治拿,將回滾的代碼同步到 N 臺(tái)業(yè)務(wù)機(jī)上。
總結(jié)
以上便是實(shí)踐中一種簡(jiǎn)單高效的代碼部署方法笆焰,既可以快速發(fā)布劫谅,又能夠及時(shí)回滾,而且還能兼顧到開(kāi)發(fā)環(huán)境和線(xiàn)上環(huán)境的差異嚷掠。
作者微博/微信 @Ceelog捏检,轉(zhuǎn)載請(qǐng)注明出處 ;)