在軟件開(kāi)發(fā)過(guò)程中,我們會(huì)涉及到配置管理、源碼控制、發(fā)布計(jì)劃、審計(jì)、符合性和集成,以及構(gòu)建測(cè)試和部署流程、驗(yàn)收測(cè)試、依賴管理和生產(chǎn)環(huán)境的創(chuàng)建與管理,很多人認(rèn)為這些與確定需求、實(shí)現(xiàn)需求、寫代碼相比,這些活動(dòng)并不那么重要,它只為是軟件開(kāi)發(fā)過(guò)程很小的一部分并且不需求多大的技術(shù)投入。其實(shí)不然,恰恰相反它們會(huì)消耗大量的時(shí)間和精力,而且是成功交付軟件的關(guān)鍵因素。假如沒(méi)有關(guān)注這一方面帶來(lái)的潛在風(fēng)險(xiǎn),就可能耗費(fèi)大量不必要的資金,甚至導(dǎo)致整個(gè)項(xiàng)目嚴(yán)重延期。
如果沒(méi)有持續(xù)集成,我們可能會(huì)遇到下列問(wèn)題:
1、如何將一個(gè)想法以最快的速度交付給用戶。
2、如何協(xié)調(diào)開(kāi)發(fā)人員、測(cè)試人員,以及構(gòu)建和運(yùn)維人員在一起高效地工作。
3、在發(fā)布當(dāng)天是否遇到很多的問(wèn)題,發(fā)布過(guò)程時(shí)候需要很長(zhǎng)的時(shí)間。
4、是否在開(kāi)發(fā)完成之后才發(fā)布軟件,失敗后長(zhǎng)期的加班。
5、如何快速的獲取用戶的反饋,并讓團(tuán)隊(duì)人員及時(shí)的改正。
6、生產(chǎn)環(huán)境是否還是采用的手工部署,還在為不同環(huán)境之間的部署煩惱。
7、在開(kāi)發(fā)過(guò)程中,應(yīng)用程序在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)無(wú)法運(yùn)行,無(wú)法驗(yàn)證每次修改的正確性。
一行代碼的改動(dòng)需要花多長(zhǎng)時(shí)間才能部署上線,處理方式是否可重復(fù)且可靠呢?從決定做某種修改到該修改結(jié)果正式上線的這段時(shí)間稱為周期時(shí)間。對(duì)任何項(xiàng)目而言,它都是一個(gè)極為重要的度量標(biāo)準(zhǔn)。
軟件開(kāi)發(fā)的首要任務(wù)是盡早交付有價(jià)值的軟件并讓客戶滿意,速度是至關(guān)重要的,因?yàn)槲唇桓兜能浖鸵馕吨杀尽H绻荒馨磿r(shí)按量的交付,就會(huì)產(chǎn)生不必要的成本浪費(fèi)。而為了更好的協(xié)調(diào)組內(nèi)人員高效的工作,在整個(gè)交付過(guò)程中,團(tuán)隊(duì)中的每一個(gè)成員都必須對(duì)每一個(gè)交付特性負(fù)責(zé),無(wú)論什么樣的修改都應(yīng)該觸發(fā)反饋流程,反饋應(yīng)該盡快發(fā)出,團(tuán)隊(duì)必須接受反饋,并依據(jù)它作出相應(yīng)的行動(dòng)??焖俚慕桓妒鼓隳軌蝌?yàn)證那些新開(kāi)發(fā)的特性或者修復(fù)的缺陷是否真的有用。
為了達(dá)到短周期、高質(zhì)量的交付目標(biāo),發(fā)布軟件必須自動(dòng)且頻繁化。
自動(dòng)化:構(gòu)建、部署、測(cè)試、發(fā)布
頻繁化:頻繁發(fā)布,每個(gè)發(fā)布版本之間的差異會(huì)很小,大大減少與發(fā)布相關(guān)的風(fēng)險(xiǎn),且容易回滾,頻繁發(fā)布也會(huì)加快反饋速度。每當(dāng)有人提交代碼,就對(duì)整個(gè)應(yīng)用進(jìn)行構(gòu)建,執(zhí)行全面的自動(dòng)化測(cè)試,以驗(yàn)證其正確性。更重要的是,如果構(gòu)建或測(cè)試失敗了,開(kāi)發(fā)團(tuán)隊(duì)就要停下手頭的工作,立即修復(fù)它,時(shí)時(shí)刻刻都要讓正在開(kāi)發(fā)的軟件一直處于可工作的狀態(tài)。
實(shí)現(xiàn)持續(xù)集成,你需要的:
1、版本控制,所有涉及產(chǎn)品的都要加入到版本控制中,包括構(gòu)建與部署腳本。
2、自動(dòng)化構(gòu)建,自動(dòng)化的構(gòu)建整個(gè)過(guò)程,縮短周期時(shí)間(Cycle time)。
3、持續(xù)集成系統(tǒng),Jenkins, ThoughtWorks公司的Go,JeBrains的TeamCity等。
提交代碼必須遵守以下原則:
1、查看構(gòu)建是否成功,如果失敗,停下手頭的工作和團(tuán)隊(duì)中的其他人一起修復(fù)。
2、如果構(gòu)建且測(cè)試全部通過(guò),就從版本控制庫(kù)中的代碼更新到自己的開(kāi)發(fā)環(huán)境上。
3、在自己的修改上重新構(gòu)建,運(yùn)行所有的測(cè)試,確保在自己機(jī)器上的代碼都是正確的且工作正常。
4、如果本地構(gòu)建成功, 再?gòu)陌姹緲?gòu)建庫(kù)中更新代碼到本地, 再做一次構(gòu)建,如果成功的話,就提交本地的修改到版本庫(kù)中。
5、在遠(yuǎn)程持續(xù)集成服務(wù)器上再次構(gòu)建包含你的這次提交的構(gòu)建結(jié)果(通常是自動(dòng)的)。
6、如果構(gòu)建失敗,就停下手中的事,在自己的開(kāi)發(fā)機(jī)上修復(fù)這個(gè)問(wèn)題后,再重新回到步驟3.。
7、構(gòu)建成功,小慶祝一下,并開(kāi)始下一項(xiàng)任務(wù)。
持續(xù)集成縮短從想法到商業(yè)價(jià)值實(shí)現(xiàn)的時(shí)間,減少時(shí)間和降低風(fēng)險(xiǎn),增加反饋,改進(jìn)負(fù)責(zé)交付的開(kāi)發(fā)、測(cè)試和運(yùn)維人員之間的協(xié)作關(guān)系。