|
在前文《自動(dòng)化部署》中,我們討論了自動(dòng)化部署。通過對(duì)部署操作腳本化、部署驗(yàn)證自動(dòng)化、部署環(huán)境版本控制、生產(chǎn)部署全自動(dòng)化等諸多實(shí)踐,可以讓部署完全處于受控狀態(tài)。然而,作為運(yùn)維人員,是否曾經(jīng)有人走過來問你這樣的問題:“當(dāng)前生產(chǎn)環(huán)境上部署的是哪個(gè)軟件版本?”你是否遇到過這樣的情形,即使手里拿著一個(gè)jar文件或dll文件,也無法知道它到底是哪個(gè)版本。也許你可能認(rèn)為,這算不了什么,到某個(gè)管理平臺(tái)上查一查部署記錄就行了。可是,如果發(fā)現(xiàn)在生產(chǎn)環(huán)境的集群服務(wù)器上,不同機(jī)器上部署的同一個(gè)程序文件(比如.war文件)的大小卻不相同,哪一個(gè)的大小是正確的呢?作為運(yùn)維人員,你當(dāng)時(shí)的心情會(huì)是什么樣呢?
地點(diǎn):運(yùn)維人員辦公室
下午五點(diǎn)鐘,運(yùn)維人員Steven習(xí)慣性地打開線上運(yùn)維監(jiān)控平臺(tái),一頁一頁地快速查看著監(jiān)控?cái)?shù)據(jù)。這已經(jīng)成了他的一個(gè)工作習(xí)慣,只要有新版本上線,他總是經(jīng)常打開監(jiān)控頁面看看。“好像沒什么問題。”他暗自慶幸,“可以正點(diǎn)下班了”。
忽然,他的目光停在了一個(gè)流量曲線上。“為什么波動(dòng)會(huì)這么大呢?”他又查看了其它幾個(gè)相關(guān)曲線,沒有什么問題,但直覺告訴它,可能新版本部署有問題。于是,他開始了更詳細(xì)的跟蹤分析。
時(shí)間隨著電子表的跳動(dòng),一分鐘一分鐘的過去了。終于,Steven站了起來,深深地吸了一口氣。此時(shí),時(shí)鐘已指向晚上八點(diǎn)啦。他發(fā)現(xiàn),在生產(chǎn)環(huán)境的集群中,有五臺(tái)機(jī)器的應(yīng)用程序文件包與其它機(jī)器上的文件包相比,文件大小不一樣。到底哪個(gè)是正確的呢?
Steven首先查了一下部署管理日志系統(tǒng),文件名為abc,正確版本是1.21。可是這兩種文件的文件名都是abc.war。從文件名上沒有什么區(qū)別。無奈,Steven操起電話,把開發(fā)人員Bob從家中叫了回來,一起解決這個(gè)問題。
又經(jīng)過三個(gè)多小時(shí)的忙活,兩個(gè)人終于找到了正確的版本。原來,只有那五臺(tái)機(jī)器上的二進(jìn)制包是正確的,其它機(jī)器上的都不對(duì)。這兩個(gè)版本都屬于1.21,只不過,其中一個(gè)是快上線前修復(fù)bug的一個(gè)測試版本,而另一個(gè)是正式上線版本。它們?cè)诎姹編熘械膔evision只差一個(gè)。可能是誰部署時(shí)不小心搞錯(cuò)了。
地點(diǎn):開發(fā)團(tuán)隊(duì)工作室
第二天一大早,Steven在站會(huì)上把這個(gè)Case通報(bào)了一下,引起了Joe的注意。Joe說道:“我們站會(huì)之后討論一下,怎么避免這類問題的發(fā)生吧。”
于是,站會(huì)后,Joe、Bob、Alice和Steven在一個(gè)角落里坐了下來,并叫來了運(yùn)維主管Tom。
“我們都使用了自動(dòng)化部署,怎么還會(huì)出現(xiàn)這個(gè)問題呢?”Tom不解的問道。
Steven答道:“我查看了一下腳本,這部分沒有做驗(yàn)證,我今天把它加上。不過,這兩個(gè)版本的文件名稱是一樣的,只能在部署前拿到它們的MD5,進(jìn)行比對(duì)驗(yàn)證。”
Alice說道:“我們還可以對(duì)文件名進(jìn)行規(guī)范,在文件名上加入版本號(hào),比如appname-xxx_xxx。”
“這也是解決問題的一個(gè)辦法。但是,你知道,文件是很容易被重命名的。”Joe說道。
Tom又說道:“我們可以把MD5和一些元數(shù)據(jù)信息,比如revision等放到一個(gè)無數(shù)據(jù)描述文件中,并打包在應(yīng)用程序中。比如,在Java領(lǐng)域,所有的.jar, .war 和.ear文件都允許將這些信息放在META-INF/MANIFEST.MF文件中。”
“嗯,這也是種好辦法。但是,如果能讓應(yīng)用程序自我識(shí)別,不是更加直接嗎?”Joe說道。
大家一臉迷惑地看著Joe,不明白他在說什么。
“我們讓應(yīng)用程序告訴我們它是什么版本,不就是自我識(shí)別嘛!”Joe笑道,“其實(shí),這也不是什么新鮮技術(shù),你們一看就明白了。”
Joe打開筆記本,接上了21寸的顯示器,把他們使用的持續(xù)集成和發(fā)布管理工具Cruise的界面打開了,如圖1所示。
圖1 軟件自我識(shí)別版本信息
接著說道:“這是我們用的Cruise服務(wù)器的信息頁面。從這里,我們可以很清楚地看到這個(gè)應(yīng)用程序的運(yùn)行環(huán)境信息,比如Java虛擬機(jī)的版本、操作系統(tǒng)類型與版本、服務(wù)器存儲(chǔ)空間信息、應(yīng)用程序的數(shù)據(jù)庫版本、license信息等等。更重要的是第一行的服務(wù)器版本信息。(1)表示其對(duì)外發(fā)布的版本號(hào);(2)和(3)可能對(duì)應(yīng)著其revision號(hào)。”
“我從來沒有看過這個(gè)頁面。”Bob和Alice同時(shí)說道。
“這里面的信息很多啊。”Steven有點(diǎn)兒興奮的說道,“如果我們的應(yīng)用程序也可以這么做的話,我在這方面的運(yùn)維工作會(huì)輕松很多,因?yàn)槲铱梢园炎詣?dòng)化部署腳本和自動(dòng)化部署驗(yàn)證做得更強(qiáng)大一些。”
Alice說道:“我們的很多組件都以庫文件方式存在,沒有界面,那怎么辦?”
“沒有關(guān)系,”Steven說道:“界面對(duì)自動(dòng)化運(yùn)維來說是次重點(diǎn),最重要的是可以通過一些API以命令行的方式來執(zhí)行。”
Joe點(diǎn)頭說道:“讓我們來總結(jié)一下吧,看看接下來做什么。”
應(yīng)用程序自識(shí)別的應(yīng)用場景與實(shí)現(xiàn)方式
- 可以直接拿到應(yīng)用程序安裝文件或二進(jìn)制包時(shí)
從它的元描述文件(metaData)中查看它來自于哪里。大多數(shù)現(xiàn)代二進(jìn)制格式支持以某種方式做到這一點(diǎn)。比如,你使用Java時(shí),所有的.jar, .war 和.ear文件都允許將這些信息放在META-INF/MANIFEST.MF文件中。如果你是在Windows上,創(chuàng)造性地使用versioninfo resources也能達(dá)到同樣的效果。注意:并不是說把這些信息放在文件名中,因?yàn)樾薷奈募目赡苄院艽蟆?/li> - 當(dāng)你無法拿到正在提供服務(wù)的二進(jìn)制文件時(shí)(比如應(yīng)用程序是一個(gè)遠(yuǎn)端服務(wù),無法直接登錄到服務(wù)器上)
最容易的方法是能夠訪問一個(gè)已知的URL或者服務(wù)調(diào)用API,它能夠告訴你任何你想知道的信息。到底是什么樣的UR或服務(wù)調(diào)用并不重要,只要需要知道這些信息的人知道怎么調(diào)用它就行了。
當(dāng)然,API方式還有更多的用途。
比如,當(dāng)你使用持續(xù)部署實(shí)踐時(shí),你在部署之前可以驗(yàn)證一下將要部署的二進(jìn)制是不是正確的版本。
然后,你可以在部署之后,使用這個(gè)服務(wù)調(diào)用去驗(yàn)證應(yīng)用程序的正確版本是不是啟動(dòng)并運(yùn)行了。
如果有一個(gè)動(dòng)態(tài)更新的系統(tǒng)信息顯示板,你就可以快速且方便地看到哪個(gè)軟件安裝的是哪個(gè)版本,而不用去更新文檔,因?yàn)槲臋n很容易忘記更新。
最后,Steven和開發(fā)團(tuán)隊(duì)一起,商定了一些細(xì)節(jié)。
- 每個(gè)組件的文件名按照如下格式生成:組件名+對(duì)外版本號(hào)+版本庫revision號(hào)。
- 每次構(gòu)建中生成該文件的MD5碼。
- 在打包時(shí),將這些元數(shù)據(jù)信息寫入元數(shù)據(jù)描述文件。由于使用subversion版本控制庫,而且,各組件的代碼庫會(huì)做遷移,所以元數(shù)據(jù)中,至少包含該構(gòu)建版本對(duì)應(yīng)的源代碼svn庫的URL和revision。
- 每個(gè)組件都提供統(tǒng)一的API調(diào)用whoami,要求返回形如NAME0-PUBLIC VERSION:svn URL@revision的自識(shí)別信息。
- Steven根據(jù)上述信息,更新部署腳本,以及自動(dòng)化部署驗(yàn)證測試。
it知識(shí)庫:持續(xù)集成之“軟件自我識(shí)別”,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。