一種devops實踐方法的總結(jié)献起。
remote repos
- 推薦放置于github
- 最新可部署代碼放置于master分支投慈。由項目代碼的code master掌管奕翔,其他人不允許直接push到這個分支哟冬。
- spec design. architecture(如果不是獨(dú)立的role念赶,那么所有承擔(dān)此角色的人要一起來討論spec的設(shè)計)。
- developer開新分支怖竭,根據(jù)spec編寫unit-test和implementation code锥债。此處可以采用Test-driven development。自行進(jìn)行功能測試痊臭,包含unit-test以及end-2-end test哮肚。撰寫部署腳本。git push广匙。然后到github創(chuàng)建pull request并請求code master進(jìn)行1-to-1 code review允趟,review通過由master merge代碼。
spec design
spec design要由architecturer role / group來完成鸦致,包含:
- api定義
- 函數(shù)名稱(名稱的自解釋性非常重要3奔簟!)
- 業(yè)務(wù)邏輯分唾,即函數(shù)應(yīng)該完成的功能
- 入?yún)⒚Q抗碰,數(shù)據(jù)結(jié)構(gòu)定義,默認(rèn)值等
- 返回結(jié)果的數(shù)據(jù)結(jié)構(gòu)鳍寂,數(shù)據(jù)結(jié)構(gòu)中的每個字段的名字改含、屬性、默認(rèn)值等
- 異常定義迄汛,異常代碼捍壤,異常信息
- 特性定義,比如冪等性(應(yīng)該冪等還是不冪等鞍爱?)鹃觉、健壯性(是否應(yīng)該積極拋出異常,還是默默容錯睹逃?)盗扇、副作用(是否應(yīng)該是pure的祷肯?是否應(yīng)該stateless?)疗隶,等等
- model定義
- model的命名
- 數(shù)據(jù)結(jié)構(gòu)定義佑笋,數(shù)據(jù)結(jié)構(gòu)中的每個字段的名字、屬性斑鼻、默認(rèn)值等
- 數(shù)據(jù)遷移定義(比如django的migrations)
架構(gòu)師最好統(tǒng)一把migrations生成(避免硬分叉沖突)蒋纬,并把prototype也落實成代碼,以便dev直接在其中補(bǔ)齊邏輯實現(xiàn)即可坚弱。
補(bǔ)充:對于存在ORM migrate的架構(gòu)蜀备,推薦把model升級和code升級分成兩步,先migrate model(形成一個commit point)荒叶,確保沒問題之后再upgrade code碾阁,這樣,如果第二步失敗需要回滾些楣,則只需要回滾到第一步的commit point脂凶。
建議由architecturer (dev arch)來做。
deployment
- 由devops完成(或分擔(dān)此角色的人共同完成愁茁,結(jié)對)
- 規(guī)劃代碼部署位置艰猬,推薦在/opt/{APP_NAME}
- git pull
- 重啟服務(wù),比如對于systemd守護(hù)的服務(wù)埋市,使用sudo service SERVICE_NAME restart
- 查看服務(wù)狀態(tài),包括但不限于:
- service XXX status 查看systemd service的狀態(tài)
- ps aux | grep XXX 查看進(jìn)程運(yùn)行否
- netstat -na | grep XXX 查看服務(wù)是否正在監(jiān)聽相關(guān)端口
- APP自身的status查看方法
- 最后一定要做一次生產(chǎn)環(huán)境的end-2-end test命贴!
rollback
如果部署失敗需要回滾道宅,可以使用git,具體方法是:
- git log找到上一次部署的commit
- git checkout LAST_COMMIT -b rollback
- 此時代碼切換到rollback分支胸蛛,且filesystem上的code files回復(fù)到LAST_COMMIT的狀態(tài)
- 重啟服務(wù)污茵。檢查狀態(tài)。做end-2-end test葬项。確迸⒌保回滾成功。
然后民珍,開始騰出手來仔細(xì)檢查為何master的code部署失敗襟士。fix并重新部署。
成功后嚷量,刪除rollback分支陋桂。