CI/CD 的出現(xiàn)改變了開(kāi)發(fā)人員和測(cè)試人員發(fā)布軟件的方式妹懒。本文是描述這一變化的系列文章第一篇, 這些文章將提供各種工具和流程的講解,以幫助開(kāi)發(fā)人員更好的使用 CI/CD肋僧。
從最初的瀑布模型, 到后來(lái)的敏捷開(kāi)發(fā)控淡, 再到今天的DevOps嫌吠, 這是現(xiàn)代開(kāi)發(fā)人員構(gòu)建出色產(chǎn)品的技術(shù)路線。 隨著 DevOps 的興起掺炭,出現(xiàn)了持續(xù)集成辫诅,持續(xù)交付(CI/CD)和持續(xù)部署的新方法, 而傳統(tǒng)的軟件開(kāi)發(fā)和交付方式在迅速變得過(guò)時(shí)涧狮。過(guò)去的敏捷時(shí)代里炕矮, 大多數(shù)公司的軟件發(fā)布周期是每月、每季度甚至每年(還記得那些日子嗎者冤?)吧享, 而在現(xiàn)在 DevOps 時(shí)代,每周譬嚣、每天甚至每天多次都是常態(tài)钢颂。 當(dāng) SaaS 成為業(yè)界主流后尤其如此,您可以輕松地動(dòng)態(tài)更新應(yīng)用程序拜银, 而無(wú)需強(qiáng)迫用戶下載更新組件殊鞭。很多時(shí)候遭垛,用戶甚至都不會(huì)注意到正在發(fā)生變化。
開(kāi)發(fā)團(tuán)隊(duì)通過(guò)軟件交付流水線(Pipeline)實(shí)現(xiàn)自動(dòng)化操灿,以縮短交付周期锯仪, 大多數(shù)團(tuán)隊(duì)都有自動(dòng)化流程來(lái)檢查代碼并部署到新環(huán)境。 我們一直在關(guān)注自動(dòng)化測(cè)試流程趾盐,但這將在之后的文章中介紹庶喜。 今天,我們將介紹什么是 CI/CD/CD 救鲤,以及現(xiàn)代軟件公司如何使用工具將部署代碼的流程自動(dòng)化久窟。
持續(xù)集成注重將各個(gè)開(kāi)發(fā)者的工作集合到一個(gè)代碼倉(cāng)庫(kù)中,通常每天會(huì)進(jìn)行幾次本缠, 主要目的是盡早發(fā)現(xiàn)集成錯(cuò)誤斥扛,使團(tuán)隊(duì)更加緊密結(jié)合,更好地協(xié)作丹锹。持續(xù)交付的目的是最小化部署或發(fā)布過(guò)程中團(tuán)隊(duì)固有的摩擦稀颁, 它的實(shí)現(xiàn)通常能夠?qū)?gòu)建部署的每個(gè)步驟自動(dòng)化,以便任何時(shí)刻能夠安全地完成代碼發(fā)布(理想情況下)楣黍。持續(xù)部署是一種更高程度的自動(dòng)化匾灶,無(wú)論何時(shí)代碼有較大改動(dòng), 都會(huì)自動(dòng)進(jìn)行構(gòu)建/部署租漂。
以上的每一個(gè)階段都是交付流水線的一部分阶女。Humble 和 Ferley在他們的書(shū)作《持續(xù)交付:通過(guò)自動(dòng)化構(gòu)建、測(cè)試和部署實(shí)現(xiàn)可靠軟件版本發(fā)布》中解釋說(shuō): "對(duì)軟件的每次更改都要經(jīng)過(guò)一個(gè)復(fù)雜的過(guò)程才能發(fā)布窜锯,該過(guò)程包括多個(gè)測(cè)試和部署階段進(jìn)行軟件的構(gòu)建张肾。 反過(guò)來(lái)看,這個(gè)過(guò)程需要許多人之間的合作锚扎,甚至可能需要幾個(gè)團(tuán)隊(duì)間合作吞瞪。 部署流水線對(duì)這一過(guò)程進(jìn)行建模,并且它的持續(xù)集成和發(fā)布管理工具能讓您在代碼從版本控制轉(zhuǎn)移到各種測(cè)試和部署時(shí)驾孔, 查看和控制每次更改的過(guò)程芍秆。"
持續(xù)集成(CI)
通過(guò)持續(xù)集成,開(kāi)發(fā)人員能夠頻繁地將其代碼集成到公共代碼倉(cāng)庫(kù)的主分支中翠勉。 開(kāi)發(fā)人員能夠在任何時(shí)候多次向倉(cāng)庫(kù)提交作品妖啥,而不是獨(dú)立地開(kāi)發(fā)每個(gè)功能模塊并在開(kāi)發(fā)周期結(jié)束時(shí)一一提交。
這里的一個(gè)重要思想就是讓開(kāi)發(fā)人員更快更对碌、頻繁地做到這一點(diǎn)荆虱,從而降低集成的開(kāi)銷。 實(shí)際情況中,開(kāi)發(fā)人員在集成時(shí)經(jīng)常會(huì)發(fā)現(xiàn)新代碼和已有代碼存在沖突怀读。 如果集成較早并更加頻繁诉位,那么沖突將更容易解決且執(zhí)行成本更低。
當(dāng)然菜枷,這里也有一些權(quán)衡苍糠,這個(gè)流程不提供額外的質(zhì)量保障。 事實(shí)上啤誊,許多組織發(fā)現(xiàn)這樣的集成方式開(kāi)銷更大岳瞭,因?yàn)樗鼈円蕾嚾斯ご_保新代碼不會(huì)引起新的 bug 或者破壞現(xiàn)有代碼。 為了減少集成期間的摩擦蚊锹,持續(xù)集成依賴于測(cè)試套件和自動(dòng)化測(cè)試瞳筏。 然而,要認(rèn)識(shí)到自動(dòng)化測(cè)試和持續(xù)測(cè)試是完全不同的這一點(diǎn)很重要枫耳,我們會(huì)在文章結(jié)尾處詳細(xì)說(shuō)明乏矾。
CI 的目標(biāo)是將集成簡(jiǎn)化成一個(gè)簡(jiǎn)單孟抗、易于重復(fù)的日常開(kāi)發(fā)任務(wù)迁杨, 這樣有助于降低總體的構(gòu)建成本并在開(kāi)發(fā)周期的早期發(fā)現(xiàn)缺陷。 要想有效地使用 CI 必須轉(zhuǎn)變開(kāi)發(fā)團(tuán)隊(duì)的習(xí)慣凄硼,要鼓勵(lì)頻繁迭代構(gòu)建铅协, 并且在發(fā)現(xiàn) bug 的早期積極解決。
持續(xù)交付(CD)實(shí)際上是 CI 的擴(kuò)展摊沉,其中軟件交付流程進(jìn)一步自動(dòng)化狐史,以便隨時(shí)輕松地部署到生成環(huán)境中。 成熟的持續(xù)交付方案也展示了一個(gè)始終可部署的代碼庫(kù)说墨。使用 CD 后骏全,軟件發(fā)布將成為一個(gè)沒(méi)有任何緊張感的例行事件。 開(kāi)發(fā)團(tuán)隊(duì)可以在日常開(kāi)發(fā)的任何時(shí)間進(jìn)行產(chǎn)品級(jí)的發(fā)布尼斧,而不需要詳細(xì)的發(fā)布方案或者特殊的后期測(cè)試姜贡。
CD 集中依賴于部署流水線,團(tuán)隊(duì)通過(guò)流水線自動(dòng)化測(cè)試和部署過(guò)程棺棵。此流水線是一個(gè)自動(dòng)化系統(tǒng)楼咳, 可以針對(duì)構(gòu)建執(zhí)行一組漸進(jìn)的測(cè)試套件。CD 具有高度的自動(dòng)化烛恤,并且在一些云計(jì)算環(huán)境中也易于配置母怜。
在流水線的每個(gè)階段,如果構(gòu)建無(wú)法通過(guò)關(guān)鍵測(cè)試會(huì)向團(tuán)隊(duì)發(fā)出警報(bào)缚柏。否則苹熏,將繼續(xù)進(jìn)入下一個(gè)測(cè)試, 并在連續(xù)通過(guò)測(cè)試后自動(dòng)進(jìn)入下一個(gè)階段。流水線的最后一個(gè)部分會(huì)將構(gòu)建部署到和生產(chǎn)環(huán)境等效的環(huán)境中轨域。 這是一個(gè)整體的過(guò)程缕陕,因?yàn)闃?gòu)建、部署和環(huán)境都是一起執(zhí)行和測(cè)試的疙挺,它能讓構(gòu)建在實(shí)際的生產(chǎn)環(huán)境可部署和可驗(yàn)證扛邑。
AWS 上提供了可靠的當(dāng)前 CI/CD 的展示,亞馬遜是云計(jì)算的提供商之一铐然,提供出色的 CI/CD 流水線環(huán)境和實(shí)驗(yàn)過(guò)程蔬崩, 有眾多開(kāi)發(fā)資源可供選擇,您可以將它們?cè)谝粋€(gè)易于配置和監(jiān)控的流水線中組合起來(lái)搀暑。
許多人認(rèn)為持續(xù)交付的吸引力主要在于沥阳,它自動(dòng)化了從提交代碼到倉(cāng)庫(kù),再到測(cè)試和發(fā)布產(chǎn)品過(guò)程的所有步驟自点。 這是構(gòu)建和測(cè)試過(guò)程細(xì)致的自動(dòng)化桐罕,但是如何發(fā)布以及發(fā)布什么仍然是需要人工操作,持續(xù)部署可以改變這一點(diǎn)桂敛。
持續(xù)部署(CD)
持續(xù)部署擴(kuò)展了持續(xù)交付功炮,以便軟件構(gòu)建在通過(guò)所有測(cè)試時(shí)自動(dòng)部署。在這樣的流程中术唬, 不需要人為決定何時(shí)及如何投入生產(chǎn)環(huán)境薪伏。CI/CD 系統(tǒng)的最后一步將在構(gòu)建后的組件/包退出流水線時(shí)自動(dòng)部署。 此類自動(dòng)部署可以配置為快速向客戶分發(fā)組件粗仓、功能模塊或修復(fù)補(bǔ)丁嫁怀,并準(zhǔn)確說(shuō)明當(dāng)前提供的內(nèi)容。
采用持續(xù)部署的組織可以將新功能快速傳遞給用戶借浊,得到用戶對(duì)于新版本的快速反饋塘淑,并且可以迅速處理任何明顯的缺陷。 用戶對(duì)無(wú)用或者誤解需求的功能的快速反饋有助于團(tuán)隊(duì)規(guī)劃投入蚂斤,避免將精力集中于不容易產(chǎn)生回報(bào)的地方存捺。
隨著 DevOps 的發(fā)展,新的用來(lái)實(shí)現(xiàn) CI/CD 流水線的自動(dòng)化工具也在不斷涌現(xiàn)橡淆。這些工具通常能與各種開(kāi)發(fā)工具配合召噩, 包括像 GitHub 這樣的代碼倉(cāng)庫(kù)和 Jira 這樣的 bug 跟蹤工具。此外逸爵,隨著 SaaS 這種交付方式變得更受歡迎具滴, 許多工具都可以在現(xiàn)代開(kāi)發(fā)人員運(yùn)行應(yīng)用程序的云環(huán)境中運(yùn)行,例如GCP和 AWS师倔。
最受歡迎的自動(dòng)化工具是Jenkins(以前的 Hudson)构韵, 這是一個(gè)由數(shù)百名貢獻(xiàn)者和商業(yè)公司Cloudbees支持的開(kāi)源項(xiàng)目。 Cloudbees 甚至聘請(qǐng)了 Jenkins 的創(chuàng)始人,并提供了一些 Jenkins 培訓(xùn)項(xiàng)目和附加組件疲恢。 除了開(kāi)源項(xiàng)目之外凶朗,還有一些更現(xiàn)代化的商業(yè)產(chǎn)品例如 CircleCI,Codeship 和 Shippable显拳。 這些產(chǎn)品各有優(yōu)缺點(diǎn)棚愤,我鼓勵(lì)開(kāi)發(fā)人員在開(kāi)發(fā)流程中一一嘗試它們,以了解它們?cè)谀沫h(huán)境中的工作方式杂数, 以及它們?nèi)绾闻c您的工具宛畦、云平臺(tái)、容器系統(tǒng)等協(xié)作揍移。
在 mabl 中次和,我們?cè)?a target="_blank">Google Cloud Platform 上進(jìn)行構(gòu)建, 因此那伐,我們正在尋找與 GSP 兼容或者最好是已經(jīng)集成進(jìn) GSO 的產(chǎn)品踏施。我們嘗試過(guò) CircleCI,Codeship 和 Shippable罕邀, 下面有一個(gè)簡(jiǎn)單的表格畅形,展示了每個(gè)工具的一些細(xì)節(jié):
我們最終選擇了Codeship,我認(rèn)為我們的選擇是正確的燃少, 也感謝 Codeship 團(tuán)隊(duì)的支持束亏。