持續(xù)交付,持續(xù)部署,傻傻分不清楚(持續(xù)交付 持續(xù)部署)
前言
“持續(xù)交付與持續(xù)部署,到底誰(shuí)應(yīng)該包含誰(shuí)?”
曾經(jīng)在內(nèi)部的培訓(xùn)課上提出這個(gè)問(wèn)題,曾經(jīng)就類似的問(wèn)題和張樂(lè)討論過(guò),也曾經(jīng)在某“德無(wú)哦普斯”群里和趙衛(wèi)溝通過(guò)。
但是在準(zhǔn)備DevOps Professional課件的過(guò)程中,再一次顛覆了原先的理解,不得不給張樂(lè)發(fā)微信說(shuō) “暈菜了”。
用了一晚上時(shí)間,仔細(xì)翻看DevOps Handbook相關(guān)內(nèi)容,在網(wǎng)上也查閱了大量資料,試圖去解讀這兩個(gè)概念的含義,以及背后的原因。
Jez Humble說(shuō),“在過(guò)去的5年里,人們對(duì)持續(xù)交付和持續(xù)部署的區(qū)別有所誤解。的確,我自己對(duì)兩者的看法和定義也發(fā)生了改變。每個(gè)組織都應(yīng)該根據(jù)自己的需求做出選擇。我們不應(yīng)該關(guān)注形式,而應(yīng)該關(guān)注結(jié)果:部署應(yīng)該是無(wú)風(fēng)險(xiǎn)、按需進(jìn)行的一鍵式操作。”
本文不去爭(zhēng)辯持續(xù)交付的定義,關(guān)鍵是在這個(gè)概念背后,都有哪些實(shí)踐,以及原因和產(chǎn)生的結(jié)果。比叫什么更重要的是為什么。
“持續(xù)交付:發(fā)布可靠軟件的系統(tǒng)方法”
持續(xù)交付是最早由Jez Humble和David Farley提出,并在“持續(xù)交付:發(fā)布可靠軟件的系統(tǒng)方法”一書中對(duì)其實(shí)現(xiàn)進(jìn)行系統(tǒng)說(shuō)明。
全書并沒(méi)有找到明確的持續(xù)交付定義,原書英文版書名是“Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation”。自然的,持續(xù)交付是將部署自動(dòng)化包含在內(nèi)的,而且也把Release和Delivery關(guān)聯(lián)在一起。
這里的自動(dòng)化部署,更多的是部署流水線,不是持續(xù)部署的概念。
在Jez Humble的以下文章中,對(duì)他為什么會(huì)選擇Continuous Delivery有詳盡的描述?https://continuousdelivery.com/2010/08/continuous-delivery-vs-continuous-deployment/
事實(shí)上,continuous deployment的概念是Timothy Fitz,在Jez的Continuous Delivery出版的前一年2009年提出的。Jez認(rèn)為:
“What makes continuous deployment special is deploying every change that passes the automated tests (and optionally a short QA gate)?to production. Continuous deployment is the practice of releasing every good build to users - a more accurate name might have been "continuous release”.” ?因此此處的持續(xù)部署是將所有通過(guò)自動(dòng)化測(cè)試以及QA環(huán)境的構(gòu)建,自動(dòng)發(fā)布給客戶的動(dòng)作,Jez說(shuō)更準(zhǔn)確的名稱應(yīng)該是“持續(xù)發(fā)布”(又引入一個(gè)詞匯,進(jìn)一步混亂)。
“Continuous delivery is about putting the release schedule in the hands of the business, not in the hands of IT”
持續(xù)交付更像是一個(gè)業(yè)務(wù)行為,而不是技術(shù)行為。
“So when can you say you're doing continuous delivery? I'd say it's when you could flip a switch to go to continuous deployment if you decided that was the best way to deliver value to your customers.”
所以持續(xù)交付是在部署到生產(chǎn)環(huán)境之前,加了一個(gè)業(yè)務(wù)判斷,決定是否交付給客戶,然后一鍵部署到生產(chǎn)環(huán)境。這一定義與隨后的大部分文檔相似,包括DevOps Handbook。
Martin Fowler的持續(xù)交付
https://martinfowler.com/bliki/ContinuousDelivery.html
Martin 2013年的持續(xù)交付文章中,也對(duì)持續(xù)交付與持續(xù)部署進(jìn)行了比較。觀點(diǎn)與Jez的相似,同時(shí)也援引了Jez的文章。
持續(xù)部署是自動(dòng)化的將一切變更放到生產(chǎn)環(huán)境,而持續(xù)交付則有判斷決策過(guò)程,并直接說(shuō)“?In order to do Continuous Deployment you must be doing Continuous Delivery.”
“Continuous Delivery is sometimes confused with Continuous Deployment.Continuous Deployment?means that every change goes through the pipeline and automatically gets put into production, resulting in many production deployments every day. Continuous Delivery just means that you are able to do frequent deployments but may choose not to do it, usually due to businesses preferring a slower rate of deployment. In order to do Continuous Deployment you must be doing Continuous Delivery.”
對(duì)持續(xù)交付與持續(xù)部署的關(guān)系,Martin也承認(rèn)兩個(gè)概念容易造成困惑,持續(xù)部署代表將所有變更自動(dòng)通過(guò)流水線推到生產(chǎn)環(huán)境,持續(xù)交付則意味著你有能力這樣做,但可以基于業(yè)務(wù)選擇不這樣做。
所以我不覺(jué)得兩者有誰(shuí)包含誰(shuí),兩者在這個(gè)層面講,一個(gè)是技術(shù)領(lǐng)域,一個(gè)是業(yè)務(wù)領(lǐng)域。
喬梁的持續(xù)交付
而同時(shí)期喬梁的演講資料中,持續(xù)交付的說(shuō)明,被定義為交付業(yè)務(wù)價(jià)值,而不是IT內(nèi)部團(tuán)隊(duì)之間的交付。
并且進(jìn)一步描寫說(shuō),持續(xù)部署是一個(gè)技術(shù)操作,持續(xù)交付是一個(gè)業(yè)務(wù)行為(此處的持續(xù)交付,更像是前面Jez說(shuō)的發(fā)布概念)。
IBM的持續(xù)交付
IBM在2014年前后的持續(xù)交付方案中,將Continuous Delivery持續(xù)交付,等同于端到端的DevOps,所以自然的,交付的是端到端的價(jià)值,至于是否自動(dòng)并沒(méi)有說(shuō)明,同時(shí)持續(xù)發(fā)布與部署被包含在整個(gè)持續(xù)交付的方案中。
DevOps Handbook上對(duì)持續(xù)交付、持續(xù)部署的定義
DevOps Handbook是2015年出版的,上面也有對(duì)持續(xù)交付和持續(xù)部署的說(shuō)明,此處不詳述,在后面有具體內(nèi)容。也是我目前較為認(rèn)同或者遵循的一個(gè)定義。
維基百科上的持續(xù)交付
https://en.wikipedia.org/wiki/Continuous_delivery
維基百科上的描述也有些不清不楚,對(duì)CD的定義中,最后一句話用了“repeatable deployment process”,似乎持續(xù)交付應(yīng)該包含部署,只是沒(méi)有用持續(xù)部署:
Continuous delivery (CD) is a software engineering approach in which teams produce software in short cycles, ensuring that the software can be reliably released at any time.[1] It aims at building, testing, and releasing software with greater speed and frequency. The approach helps reduce the cost, time, and risk of delivering changes by allowing for more incremental updates to applications in production. A straightforward and repeatable deployment process is important for continuous delivery.
在后面有關(guān)“Relationship to continuous deployment”段落中,直接引用了前面說(shuō)過(guò)的Martin Fowler的文章
https://martinfowler.com/bliki/ContinuousDelivery.html
此外,關(guān)于“Relationship to DevOps”段落中,DevOps是端到端的產(chǎn)品持續(xù)交付,而CD是后段的Dev to Ops,即狹義的DevOps概念。
Continuous delivery and DevOps are similar in their meanings and are often conflated, but they are two different concepts. DevOps has a broader scope, and centers around the cultural change, specifically the collaboration of the various teams involved in software delivery (developers, operations, quality assurance, management, etc.), as well as automating the processes in software delivery. Continuous delivery, on the other hand, is an approach to automate the delivery aspect, and focuses on bringing together different processes and executing them more quickly and more frequently. Thus, DevOps can be a product of continuous delivery, and CD flows directly into DevOps.
Jez Humble 2018年的持續(xù)交付
在Jez Humble今年北京站DevOpsDays閉門培訓(xùn)的內(nèi)容中,對(duì)Continuous Delivery的定義,尤其是與Continuous Deployment的關(guān)系有了不一樣的解讀。在培訓(xùn)現(xiàn)場(chǎng),大家還就此定義與Jez有過(guò)一番討論。
同時(shí),Jez對(duì)持續(xù)交付的定義是:The ability to get changes—features, configuration changes, bug?fixes, experiments—into production or into the hands of users?safelyand?quickly?in a?sustainable?way.
從整個(gè)講座的內(nèi)容來(lái)看,Continuous Delivery更像是后半段的DevOps,即從CI開(kāi)始到發(fā)布為止。
前面林林總總說(shuō)了這么多持續(xù)交付的各種定義,各種出處,目的是從不同的視角看各個(gè)大師對(duì)持續(xù)交付的詮釋。
對(duì)于持續(xù)交付以及持續(xù)部署等概念的解讀,個(gè)人認(rèn)為核心就是一句話:將技術(shù)行為與業(yè)務(wù)決策解耦。
目前較為認(rèn)同的是DevOps Handbook上對(duì)持續(xù)交付、持續(xù)部署的定義
“持續(xù)交付是指,所有開(kāi)發(fā)人員都在主干上進(jìn)行小批量工作,或者在短時(shí)間存在的特性分支上工作,并且定期向主干合并,同時(shí)始終讓主干保持可發(fā)布狀態(tài),并能做到在正常工作時(shí)段里按需進(jìn)行一鍵式發(fā)布。開(kāi)發(fā)人員在引入任何回歸錯(cuò)誤時(shí)(包括缺陷、性能問(wèn)題、安全問(wèn)題、可用性問(wèn)題等),都能快速得到反饋。一旦發(fā)現(xiàn)這類問(wèn)題,就立即加以解決,從而保持主干始終處于可部署狀態(tài)。”
“持續(xù)部署是指,在持續(xù)交付的基礎(chǔ)上,由開(kāi)發(fā)人員或運(yùn)維人員自助式的定期向生產(chǎn)環(huán)境部署優(yōu)質(zhì)的構(gòu)建版本,這通常意味著每天每人至少做一次生產(chǎn)環(huán)境部署,甚至每當(dāng)開(kāi)發(fā)人員提交代碼變更時(shí),就觸發(fā)一次自動(dòng)化部署。”
“持續(xù)交付是持續(xù)部署的前提,就像持續(xù)集成是持續(xù)交付的前提條件一樣。”
這里面涉及到的有幾個(gè)層面:持續(xù)集成、持續(xù)交付、持續(xù)部署,以及持續(xù)發(fā)布。
持續(xù)集成
持續(xù)集成的概念沒(méi)有什么歧義,要求每當(dāng)開(kāi)發(fā)人員提交了新代碼之后,就對(duì)整個(gè)應(yīng)用進(jìn)行構(gòu)建,并對(duì)其執(zhí)行全面的自動(dòng)化測(cè)試集合。根據(jù)構(gòu)建和測(cè)試結(jié)果,我們可以確定新代碼和原有代碼是否正確的集成在一起。
如果失敗,開(kāi)發(fā)團(tuán)隊(duì)就要停下手中的工作,立即修復(fù)它。(這正是豐田安燈系統(tǒng)的實(shí)踐)
(以下幾張圖出自如下鏈接,對(duì)持續(xù)集成、持續(xù)交付、持續(xù)部署等描述相對(duì)比較清晰。https://www.mindtheproduct.com/2016/02/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/)
持續(xù)集成的目的是讓正在開(kāi)發(fā)的軟件始終處于可工作狀態(tài)。同時(shí)強(qiáng)調(diào),代碼的提交是一種溝通方式,而既然是溝通就需要頻繁,下圖中代碼的提交過(guò)程,事實(shí)上就是各條分支之間的對(duì)話過(guò)程。
持續(xù)交付
Continuous Delivery (CD) ?持續(xù)交付是持續(xù)集成的延伸,將集成后的代碼部署到類生產(chǎn)環(huán)境,確保可以以可持續(xù)的方式快速向客戶發(fā)布新的更改。如果代碼沒(méi)有問(wèn)題,可以繼續(xù)手工部署到生產(chǎn)環(huán)境中。
持續(xù)部署
如果真的想獲得持續(xù)交付的好處,應(yīng)該盡早部署到生產(chǎn)環(huán)境,以確保可以小批次發(fā)布,在發(fā)生問(wèn)題時(shí)可以輕松排除故障。
于是有了持續(xù)部署。持續(xù)部署是在持續(xù)交付的基礎(chǔ)上,把部署到生產(chǎn)環(huán)境的過(guò)程自動(dòng)化。
持續(xù)測(cè)試
持續(xù)測(cè)試是貫穿整個(gè)內(nèi)部研發(fā)流程始終的,從持續(xù)集成到持續(xù)部署,都有自動(dòng)化測(cè)試的存在。
“沒(méi)有自動(dòng)化測(cè)試,持續(xù)集成就只能產(chǎn)生一大堆沒(méi)有經(jīng)過(guò)編譯并且不能正確運(yùn)行的垃圾”。自動(dòng)化測(cè)試是持續(xù)集成的基礎(chǔ),同樣也是其他實(shí)踐的基礎(chǔ),越靠前的測(cè)試越應(yīng)該自動(dòng)化。
測(cè)試是獲取反饋?zhàn)钣行У姆绞剑瑥牟渴鹆魉€中,能夠看到在不同的環(huán)節(jié),不同環(huán)境上運(yùn)行的不同層面的測(cè)試。
從理想的測(cè)試自動(dòng)化金字塔來(lái)看,截止到持續(xù)交付階段,在開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境以及類生產(chǎn)環(huán)境,已經(jīng)把開(kāi)發(fā)內(nèi)部需要運(yùn)行的所有測(cè)試全都跑完了。
所以在這個(gè)點(diǎn),從技術(shù)的層面上講,代碼是可以被部署到生產(chǎn)環(huán)境的;從業(yè)務(wù)的層面上講,需要判斷是否發(fā)布特性給用戶,以獲取最終的用戶反饋。
將部署與發(fā)布解耦
讓上帝的歸上帝,凱撒的歸凱撒。
需要將部署和發(fā)布解耦,部署和發(fā)布是不同的動(dòng)作。部署更多是一個(gè)技術(shù)行為,而發(fā)布更多是業(yè)務(wù)決策。
不要把技術(shù)與業(yè)務(wù)決策混為一談。部署與發(fā)布的解耦過(guò)程,也就是前面講到的技術(shù)與業(yè)務(wù)的解耦過(guò)程。
-部署:在特定的環(huán)境上安裝制定版本的軟件。部署可能與某個(gè)特性的發(fā)布有關(guān),也可能無(wú)關(guān)。
-發(fā)布:把一個(gè)/組特性提供給(部分或全部)客戶的過(guò)程。
要實(shí)現(xiàn)部署與發(fā)布解耦,需要代碼和環(huán)境架構(gòu)能夠滿足:特性發(fā)布不需要變更應(yīng)用的代碼。
如果混淆了部署和發(fā)布,就很難界定誰(shuí)對(duì)結(jié)果負(fù)責(zé)。
而這恰恰是傳統(tǒng)的運(yùn)維人員不愿意頻繁發(fā)布的原因,因?yàn)橐坏┎渴穑纫獙?duì)技術(shù)的部署負(fù)責(zé),又要對(duì)業(yè)務(wù)的發(fā)布負(fù)責(zé)。
解耦部署和發(fā)布,可以提升開(kāi)發(fā)人員和運(yùn)維人員快速部署的能力,通過(guò)技術(shù)指標(biāo)衡量;同時(shí)產(chǎn)品負(fù)責(zé)人承擔(dān)發(fā)布成功與否的責(zé)任,通過(guò)業(yè)務(wù)指標(biāo)衡量。
按需部署,視技術(shù)的需要進(jìn)行部署,通過(guò)部署流水線將不同的環(huán)境進(jìn)行串聯(lián),設(shè)置不同的檢查與反饋。
按需發(fā)布,讓特性發(fā)布成為業(yè)務(wù)和市場(chǎng)決策,而不是技術(shù)決策。
“持續(xù)部署更適用于交付線上的Web服務(wù),而持續(xù)交付適用于幾乎任何對(duì)質(zhì)量、交付速度和結(jié)果的可預(yù)測(cè)性有要求的低風(fēng)險(xiǎn)部署和發(fā)布場(chǎng)景,包括嵌入式系統(tǒng)、商用現(xiàn)貨產(chǎn)品和移動(dòng)應(yīng)用。”
從理論上講,通過(guò)持續(xù)交付,已經(jīng)可以決定每天、每周、每?jī)芍馨l(fā)布一次,或者滿足業(yè)務(wù)需求的任何頻度。
而對(duì)于互聯(lián)網(wǎng)應(yīng)用,從持續(xù)交付走到持續(xù)部署,只是一個(gè)按鍵決策,是否將其自動(dòng)化的過(guò)程。持續(xù)交付,更像是沒(méi)有特性開(kāi)關(guān)支持之下的業(yè)務(wù)決策。
當(dāng)有了低風(fēng)險(xiǎn)發(fā)布的各種手段,例如基于環(huán)境的藍(lán)綠部署、金絲雀發(fā)布;以及基于應(yīng)用的特性開(kāi)關(guān)、黑啟動(dòng)等;尤其是特性開(kāi)關(guān),使得部署到生產(chǎn)環(huán)境,并不意味著特性的發(fā)布,具體何時(shí)發(fā)布,對(duì)誰(shuí)發(fā)布,都可以由業(yè)務(wù)決定。
也就是說(shuō),從技術(shù)上可以支撐持續(xù)的部署,同時(shí)與業(yè)務(wù)決策進(jìn)行解耦。
所以此時(shí)只需要視不同的業(yè)務(wù)場(chǎng)景,來(lái)決定是否以及打開(kāi)哪些特性開(kāi)關(guān),持續(xù)部署已經(jīng)幾乎可以完全脫離業(yè)務(wù)層面。
持續(xù)交付、持續(xù)部署、持續(xù)發(fā)布,更多的是技術(shù)行為與業(yè)務(wù)決策的區(qū)別。
John Allspaw說(shuō),“我不知道,在過(guò)去5年里的每一天,發(fā)生過(guò)多少次部署…我根本就不在乎,黑啟動(dòng)已經(jīng)讓每個(gè)人的信心大到幾乎對(duì)它冷漠的程度”。
解耦不是分家,最終整體團(tuán)隊(duì)的衡量,還是要由業(yè)務(wù)形成閉環(huán)。持續(xù)發(fā)布是以持續(xù)部署為基礎(chǔ),持續(xù)部署提供技術(shù)能力,使得業(yè)務(wù)呢個(gè)個(gè)根據(jù)市場(chǎng)需要,隨時(shí)進(jìn)行特性發(fā)布,或是進(jìn)行特性實(shí)驗(yàn)。
正是因?yàn)榧夹g(shù)的支持,持續(xù)部署到生產(chǎn)環(huán)境,才能讓業(yè)務(wù)前所未有的具備如此靈活的能力,任何業(yè)務(wù)的決策,可以不再如此緊耦合的依賴于IT。
引用:
Jez Humble “Continous Delivery 1-day tutorial"
喬梁 “持續(xù)交付精要”
《DevOps Handbook》
《持續(xù)交付:發(fā)布可靠軟件的系統(tǒng)方法》
(其他參考均在文中加注了鏈接)
軟件開(kāi)發(fā)平臺(tái) DevCloud 軟件開(kāi)發(fā)云 DevOps
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。