標(biāo)題先來一個(gè)近幾年比較火熱的 DevOps丘损,但這個(gè)系列里只講述筆者在實(shí)際工作中從 no-DevOps 到 semi-DevOps 的心路歷程芦拿。
石器時(shí)代
記得剛進(jìn) 大M 的時(shí)候座硕,草草的掃了代碼辖试、體驗(yàn)了一周開發(fā)流程后,我的內(nèi)心幾乎崩潰的,如同一夜回到解放前词顾,各種的純手工作業(yè),手工也就算了碱妆,還是各種粗制濫造肉盹。(大M的員工請(qǐng)勿板磚拍我呀 哇哈哈哈)
主要現(xiàn)象:
- Git 只用 master 分支,開發(fā)和部署都用這master
- Git 使用中疹尾,把圖形化工具當(dāng)成傻瓜相機(jī)用
- 部署工具是用 Git 維護(hù)的一個(gè)jar repository上忍,在工程師本地手工地 maven 打包項(xiàng)目,并拷貝到deployment git 里提交纳本,Production 服務(wù)器部署的時(shí)候采用 git pull 那些 jars 之后重啟服務(wù)的方式
- Java 項(xiàng)目中大量的自研 SNAPSHOT 版本依賴
隨之而來的主要問題:
- Production環(huán)境的bug基本不可能做到純凈的hot-fix窍蓝,因?yàn)橹挥兴械拇a都懟master,當(dāng)你需要修復(fù)1期開發(fā)中產(chǎn)生的線上問題時(shí)繁成,不得不把2期開發(fā)中還沒完成的代碼給帶了上去(畢竟工程師們秉承了把git當(dāng)成“備份工具”來用的優(yōu)良傳統(tǒng)吓笙,每寫幾段代碼就commit一次,拿去測(cè)試環(huán)節(jié)調(diào)試——醉了)
- Git 里時(shí)不時(shí)會(huì)出現(xiàn)魯莽的 merge巾腕,把別人有用的代碼更新給覆蓋了——恐怖
- Git deployment repository 的體積會(huì)越發(fā)的膨脹(大體積 jar 的diff簡直就是完全覆蓋)面睛。你還別嫌棄老一輩革命家的這套“部署工具”,要更新有更新尊搬,要回滾也可以回滾叁鉴,但所有操作都得 git 命令行搞定,你要是改了一些repo里的文件(比如configuration file)佛寿,麻煩就更大了幌墓,還要兩邊同步才行,新手基本是要在 git command 上踩雷的冀泻。
- Java maven 里的 SNAPSHOT 版本概念在開發(fā)里還是有優(yōu)點(diǎn)的常侣,但缺點(diǎn)是一大籮筐:
- 新入職的工程師,剛git clone下的源碼執(zhí)行 "mvn clean install" 一大堆的找不到j(luò)ar弹渔,各種新手不友好胳施,只能一個(gè)個(gè)clone下來maven安裝本地。
- 用于發(fā)布到Production捞附,結(jié)合石器時(shí)代的“手工Maven打包”巾乳,會(huì)有很大的版本控制風(fēng)險(xiǎn)。想象一下鸟召,某個(gè)SNAPSHOT版本的 jar dependency忘記用最新代碼重新 “mvn clean install” 了,那么你當(dāng)前項(xiàng)目 maven打包的時(shí)候就只會(huì)帶上老代碼的依賴氨鹏。同樣的道理欧募,你hot-fix的時(shí)候,當(dāng)初大明湖畔的 SNAPSHOT 已經(jīng)難以找到了仆抵,只能被迫使用當(dāng)前的新代碼跟继。
前面還忘記說了种冬,因?yàn)橥瑫r(shí)維護(hù)了兩個(gè)類似的產(chǎn)品,所以很多代碼都是共用一個(gè)git repo舔糖,但在不同“master”來開發(fā)娱两。這也算是 git的反模式吧,我想大部分項(xiàng)目應(yīng)該不會(huì)遇到這樣的情況金吗。
工業(yè)時(shí)代
要想活兒干得順十兢,工具得順手才行是吧。那么針對(duì)以上石器時(shí)代的問題摇庙,將在下一篇中講述筆者用到的解法旱物。提前預(yù)告一下,主要做了以下幾個(gè)改進(jìn):
- Git 中新建 release 分支卫袒,一個(gè)開發(fā)周期中要發(fā)布的代碼宵呛,將從master “遷移”到 release 分支(用git rebase)。當(dāng)有線上bug需要 hot-fix 時(shí)夕凝,在 release 分支直接修bug宝穗。
- 使用Jenkins 搭建了一個(gè)簡易的 CI 系統(tǒng),配合 AWS S3 和 bash 腳本實(shí)現(xiàn)了build-store-deploy 唯一發(fā)布包的體系
- Java 開發(fā)配合 git release 分支码秉,在release之前將 SNAPSHOT 版本鎖定成 release 版本讽营,并且講pom的版本升級(jí)到新的 SNAPSHOT 版本