天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

持續(xù)集成之“Everything is code”

  在前文《軟件自我識(shí)別》中,我們討論了如果使軟件做到自我識(shí)別,以促進(jìn)自動(dòng)化部署和版本檢測(cè)等工作。 隨著互聯(lián)網(wǎng)的飛速發(fā)展,以及基礎(chǔ)設(shè)施的改進(jìn),越來越多的業(yè)務(wù)被放在了“云”端。管理數(shù)千臺(tái)服務(wù)器和各種應(yīng)用程序的不同版本已經(jīng)是一種常規(guī)事務(wù)了。那么如果管理好這些機(jī)器和代碼嗎?本文將介紹一些最佳實(shí)踐,來幫助大家更好的完成相關(guān)的事務(wù)。

  一、測(cè)試代碼不是二等公民

  業(yè)務(wù)壓力讓團(tuán)隊(duì)人力顯得有點(diǎn)兒緊張。一天下午,大家在緊張的工作著,新的版本即將發(fā)布了。突然,有兩個(gè)同事的對(duì)話引起了 Joe 的注意。

  “Hi,Sam。過來看一下,我這里有個(gè)自動(dòng)化測(cè)試失敗了。”剛剛加入團(tuán)隊(duì)的測(cè)試人員 Jared 叫了 Sam 一聲。

  “咦?我本地沒有這個(gè)測(cè)試,可我更新過我本地的代碼了呀?”Sam 一臉茫然地應(yīng)到。

  “哦,是嗎?不會(huì)吧。我也是剛剛從 SVN 上更新了代碼。”Jared 說道。

  “Jared,你再更新一下,也許是你在我提交之前更新的呢。。。哦,還是一樣的結(jié)果。那到我的工作站上看一下吧。”

  “噢,原來你把測(cè)試放在了這里。”Sam 恍然大悟的樣子,“我們兩個(gè)人使用的測(cè)試套件版本是不一樣的。根據(jù)用戶的反饋,我們重新修改了產(chǎn)品的一個(gè)小功能,所以,這部分功能的原有自動(dòng)化驗(yàn)收測(cè)試邏輯就不對(duì)了。”。SVN 代碼倉庫的目錄結(jié)構(gòu)如圖 1 所示。

圖 1 產(chǎn)品代碼與測(cè)試代碼分離

  這時(shí),Joe 也湊了過來。“嗯。我們應(yīng)該修改一下我們的代碼在 SVN 中的組織結(jié)構(gòu)。把測(cè)試代碼和產(chǎn)品代碼放在同一個(gè)代碼庫中,做到產(chǎn)品代碼與測(cè)試代碼同源。”

  Jared 問道:“為什么要這么做呢?我在上一家公司的時(shí)候,測(cè)試團(tuán)隊(duì)也是把功能測(cè)試用例放在公司自行開發(fā)的一個(gè)測(cè)試用例管理平臺(tái)上進(jìn)行管理。當(dāng)需要做老版本的回歸測(cè)試(比如 V1.0)時(shí),我們只要在這個(gè)平臺(tái)上勾選上該版本對(duì)應(yīng)的測(cè)試用例,再點(diǎn)擊‘執(zhí)行’按鈕,就可以了。當(dāng)有新版本, 比如 V1.1 時(shí),只要把 V1.0 的所有測(cè)試用例復(fù)制一份,標(biāo)記為 V1.1,并在其上修改就可以了。測(cè)試代碼的組織方式常常是使用目錄結(jié)構(gòu)來分離版本。”如圖 2 所示。

圖 2 以目錄方式對(duì)測(cè)試用例進(jìn)行管理

  Joe 回答到:“你剛才所說的做法,我也在其它公司見過。這種做法常見于使用傳統(tǒng)瀑布開發(fā)模式的團(tuán)隊(duì),即開發(fā)階段與測(cè)試階段分離。在開發(fā)階段,大家并不會(huì)頻繁運(yùn)行相應(yīng)的自動(dòng)化測(cè)試,這些自動(dòng)化測(cè)試是為測(cè)試人員服務(wù)。而在我們這里,自動(dòng)化測(cè)試是為所有人服務(wù)的,開發(fā)人員隨時(shí)都會(huì)運(yùn)行測(cè)試。其實(shí),我們大部分的測(cè)試都已經(jīng)與產(chǎn)品代碼放在了同一個(gè)代碼倉庫中了。只是這一部分是比較老的代碼,需求也一直沒有變化,自動(dòng)化測(cè)試也一直運(yùn)行成功,所以就沒什么動(dòng)力去遷移這部分測(cè)試代碼。”

  Joe 停頓了一下,喝了一口咖啡,接著說道:“當(dāng)我們做到產(chǎn)品代碼和測(cè)試代碼同源時(shí),我們只需要從一個(gè) svn 代碼倉庫中簽出某個(gè)版本的源文件,就同時(shí)得到到產(chǎn)品代碼,以及與該版本相對(duì)應(yīng)的測(cè)試代碼。所以,不會(huì)出現(xiàn)版本不一致,或者需要手工挑選測(cè)試用例的問題。現(xiàn)在服務(wù)器很多,應(yīng)用程序使用灰度放量發(fā)布的方式,在生產(chǎn)環(huán)境中可能會(huì)有多個(gè)版本。假如正在運(yùn)行的某個(gè)版本出現(xiàn)了問題,需要修復(fù),那么,我們很容易就能拿到與其對(duì)應(yīng)的所有代碼。因此,不能把測(cè)試代碼作為代碼中的二等公民,而是應(yīng)該得到與產(chǎn)品代碼同樣的重視。我們代碼庫中的目錄結(jié)構(gòu)是這樣的。”如圖 3 所示。

圖 3 測(cè)試代碼與產(chǎn)品代碼同源

  二、配置信息也是代碼

  Alex 此時(shí)也湊了過來,接道:“不只是對(duì)代碼需要一視同仁,配置信息也一樣要放到代碼倉庫中。這方面,我們也是有著痛苦經(jīng)歷的。記得是幾個(gè)月前,那時(shí)候我們的產(chǎn)品還不大,為了快速調(diào)整,我們經(jīng)常在生產(chǎn)環(huán)境中直接修改配置信息,如數(shù)據(jù)庫連接,功能開關(guān)項(xiàng)或者 IP 地址什么的。結(jié)果,每次準(zhǔn)備上線前的測(cè)試時(shí),都要到生產(chǎn)環(huán)境上去下載一份配置信息。有一次,生產(chǎn)環(huán)境上的一臺(tái)機(jī)器出了問題,結(jié)果那臺(tái)機(jī)器上的所有信息都丟了,害得我們到處找,花了很長時(shí)間才把那臺(tái)機(jī)器重新配置好。現(xiàn)在都放在代碼倉庫中,就可靠多了。”

  “配置信息是指哪些呢?”Jared 問道。

  Joe 回答道:“配置信息包括應(yīng)用程序相關(guān)的配置,以及程序部署時(shí)的相關(guān)配置。應(yīng)用程序相關(guān)的配置是指影響應(yīng)用程序行為的配置項(xiàng),比如某個(gè)功能的開關(guān)、數(shù)據(jù)庫連接、緩存的大小等等。程序部署時(shí)的相關(guān)配置是指部署在不同機(jī)器上的程序組件是如何相互連接的,如 IP 地址等等。”

  “那有些配置信息是動(dòng)態(tài)生成的,那怎么把它放到 SVN 中呢?”Jared 接著問道。

  “我們首先要把動(dòng)態(tài)信息與靜態(tài)信息分開。一般對(duì)于動(dòng)態(tài)信息來說,只要把其變動(dòng)的規(guī)則保存在 SVN 中就可以了。” Alex 答道。“比如,某些 IP 地址或內(nèi)部域名是自動(dòng)配置的,那么就把自動(dòng)配置的腳本放到 SVN 中就行了。這樣,一旦出了問題,我們也可以確切地知道,所用的分配規(guī)則是什么樣的。”

  “那生產(chǎn)環(huán)境的配置與測(cè)試環(huán)境的配置不同,與開發(fā)環(huán)境的配置也不同,怎么辦呢?”Jared 窮追不舍。

  “這個(gè)好辦,只要存三份配置,對(duì)應(yīng)三種不同的環(huán)境就可以了。”Joe 笑道,“所以,我們代碼目錄結(jié)構(gòu)是這樣的。”他拿起筆,在紙上畫了一下,如圖 4 所示。

圖 4 以業(yè)務(wù)為核心組織產(chǎn)品結(jié)構(gòu)

  三、腳本文件也是源代碼

  “嗨,Joe。這里的 script 目錄里面放什么的呢?” Jared 問道。

  “哦,這個(gè)目錄是放所有我們用到的腳本的。” Alex 笑著說,“以前大家在測(cè)試、部署等工作中寫了很多腳本,用在各自的工作中。現(xiàn)在我們統(tǒng)一放在這個(gè)目錄中,這樣所有人都可以使用相同的腳本做相同的事情。比如,當(dāng)開發(fā)人員在自己調(diào)試時(shí),只要執(zhí)行部署腳本 autodeploy,它就會(huì)從開發(fā)配置目錄 (conf/dev)中讀取相關(guān)配置,部署好開發(fā)調(diào)試環(huán)境。而測(cè)試人員使用同一個(gè)部署腳本 autodeploy,它就會(huì)從測(cè)試配置目錄(conf/test)目錄中讀取相關(guān)配置,部署好測(cè)試環(huán)境,生產(chǎn)環(huán)境部署也運(yùn)行同一個(gè)腳本,只不過說生產(chǎn)環(huán)境配置而已。”

  “這樣不錯(cuò)。我們的腳本在最終向生產(chǎn)環(huán)境部署之前就已經(jīng)被測(cè)試過很多次啦。” Jared 笑道。

  四、數(shù)據(jù)也是代碼嗎?

  “我們有點(diǎn)跑題了,回到我們最開始遇到的那個(gè)測(cè)試問題上吧。” Jared 說,“那個(gè)測(cè)試失敗,除了功能的小改動(dòng)以外,log 里還有一些異常,好象是數(shù)據(jù)格式問題。”

  “嗯,這部分測(cè)試用到的數(shù)據(jù)放在一個(gè)固定的共享目錄中了。可是,雖然文件名沒有變化,但其中的數(shù)據(jù)格式已經(jīng)改了。也就是說,這份測(cè)試代碼與測(cè)試數(shù)據(jù)存在不一致性。” Joe 說道。

  Alex 接道,“嗯,我們現(xiàn)在把數(shù)據(jù)也放到了代碼倉庫中。”

  Jared 一臉狐疑,問道:“數(shù)據(jù)那么大,怎么放到代碼倉庫中呢?SVN 保存大數(shù)據(jù)并不高效,而且占用空間也比較大呀。”

  “Alex 只說了完了一半。其實(shí),我們是把大數(shù)據(jù)放在了一個(gè)我們自行開發(fā)的版本控制系統(tǒng)中了。當(dāng)把一份大數(shù)據(jù)放在其上時(shí),該系統(tǒng)會(huì)返回唯一的一個(gè)標(biāo)識(shí) ID,我們把它放在了這個(gè)產(chǎn)品代碼的 conf 目錄中。這樣,當(dāng)簽出某個(gè)版本的代碼時(shí),你就可以直接拿到對(duì)應(yīng)的大數(shù)據(jù)了。如果大數(shù)據(jù)修改了,那只要把它再次放到那個(gè)大數(shù)據(jù)存儲(chǔ)系統(tǒng)中,然后把返回的唯一標(biāo)識(shí)更新到對(duì)就應(yīng)的 conf 目錄中就行了。”Joe 補(bǔ)充道。“如果沒有這樣一個(gè)大數(shù)據(jù)庫版本管理系統(tǒng),也可以使用共享目錄,只不過,每個(gè)子目錄下保存一份數(shù)據(jù),把這個(gè)子目錄地址放在 SVN 里,也就行了。”

  “對(duì)于數(shù)據(jù)庫結(jié)構(gòu)的修改,我們還有另外一種方法,就是利用類似于 DBmaintain 或是 DBDeploy 這樣的工具。把每一次數(shù)據(jù)庫結(jié)構(gòu)的變更都寫到一個(gè)數(shù)據(jù)庫腳本,并把它們和代碼放到一起。這樣,升級(jí)過程就由這些工具就完成了。”

  五、Everything is code

  “哦,我明白了。”Jared 說道,“就是圍繞我們的服務(wù)或產(chǎn)品,將所有的東西進(jìn)行版本管理。這樣,所有的內(nèi)容都只有唯一的一個(gè)源,所有人都可以拿到同樣的信息,而且自動(dòng)化工作也非常容易了。”

  “是的。而且,當(dāng)完成這一步以后,所有的事情自然都成為可跟蹤可追溯的了。”Joe 笑道:“這也算是一個(gè)額外的收益吧。”

it知識(shí)庫持續(xù)集成之“Everything is code”,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久精品国产96精品亚洲 | 无套内射无矿码免费看黄 | 色姐妹久久综合在线av | 青草国产在线视频免费 | 暖暖 视频 免费 高清 在线观看 | 亚洲无遮挡无码A片在线 | 天天躁日日躁狠狠躁AV麻豆 | 99re这里只有精品视频 | 欧美Av无码高清在线 | 一个人在线观看免费视频 | 99精品电影 | 24小时日本在线观看片免费 | 成人a视频片在线观看免费 成人a毛片久久免费播放 | 办公室里呻吟的丰满老师电影 | xxxxxx视频| 娇女的呻吟亲女禁忌h16 | 午夜办公室在线观看高清电影 | bl 纯肉 高Hbl被强文 | 国产激情文学 | 成人国产在线24小时播放视频 | 女教师二十三歳 | 真实农村女人野外自拍照片 | 丝袜美女被啪啪不带套漫画 | 国产露脸A片国语露对白 | 久久麻豆亚洲AV成人无码国产 | 国产精品亚洲高清一区二区 | 国产36d在线观看 | 全免费a级毛片免费看 | 真实的强视频免费网站 | 欧美丰满熟妇BBB久久久 | 亚洲色综合中文字幕在线 | 欧美在线看欧美视频免费 | 无码区国产区在线播放 | 最近免费中文MV在线字幕 | c了瑜伽老师嗷嗷叫一节课视频 | 国产成人综合在线观看网站 | 伊人久久天堂 | 日韩精品欧美亚洲高清有无 | 成人影院午夜久久影院 | 久久精品一区二区影院 | 中文字幕成人免费高清在线 |