背景
傳統(tǒng)軟件開發(fā)的瀑布模型已經(jīng)過時(shí)罢浇,敏捷方法正在迅速取而代之雁芙。與DevOps一起舰攒,敏捷幫助開發(fā)和運(yùn)維團(tuán)隊(duì)共同創(chuàng)建了一個(gè)強(qiáng)大且可預(yù)測(cè)的軟件交付方式。作為轉(zhuǎn)變的一部分讥此,在使用正確的工具集時(shí)拢锹,諸如持續(xù)集成(CI)和持續(xù)交付(CD)等高級(jí)方法可以實(shí)現(xiàn)從提交到測(cè)試再到部署的高效交付流水線。
無論是在初創(chuàng)公司還是大型企業(yè)萄喳,轉(zhuǎn)向DevOps都可以減少人為錯(cuò)誤的發(fā)生卒稳。該模型允許研發(fā)維持質(zhì)量,同時(shí)加快端到端交付流程他巨。
什么是DevOps?
DevOps 是一套最佳實(shí)踐方法論充坑,旨在應(yīng)用和服務(wù)的生命周期中促進(jìn)IT技術(shù)人員之間的協(xié)作和交流,最終實(shí)現(xiàn):
持續(xù)整合:從開發(fā)到運(yùn)維和支持的輕松切換染突;
持續(xù)部署:持續(xù)發(fā)布捻爷,或盡可能經(jīng)常的發(fā)布;
持續(xù)反饋:在應(yīng)用和服務(wù)生命周期的各個(gè)階段尋求來自利益相關(guān)者的反饋份企。
CI/CD流水線的4個(gè)階段
考慮一個(gè)用例也榄,其中組織正在構(gòu)建一個(gè)產(chǎn)品,其中有多個(gè)遠(yuǎn)程團(tuán)隊(duì)在不同的微服務(wù)上工作司志。每個(gè)團(tuán)隊(duì)都有自己的服務(wù)路線圖和交付計(jì)劃甜紫。為了實(shí)現(xiàn)集成以實(shí)現(xiàn)強(qiáng)大的交付,CI/CD流水線是必須的骂远。使用CI/CD流水線囚霸,只要開發(fā)團(tuán)隊(duì)對(duì)代碼進(jìn)行更改,流水線中的自動(dòng)化就會(huì)導(dǎo)致在各種環(huán)境中自動(dòng)編譯激才,構(gòu)建和部署拓型。
CI/CD流水線可以分為應(yīng)用程序生命周期的四個(gè)階段额嘿。每個(gè)階段都將在CI/CD中發(fā)揮關(guān)鍵作用《质觯可用的工具將有助于實(shí)現(xiàn)交付的一致性,速度和質(zhì)量钞脂。如下所示揣云,四個(gè)階段是源代碼,構(gòu)建冰啃,測(cè)試和部署邓夕。
1.源代碼
組織將應(yīng)用程序代碼存儲(chǔ)在集中式存儲(chǔ)庫系統(tǒng)中,以支持版本控制阎毅,跟蹤更改焚刚,協(xié)作和審計(jì),以及確保安全性并保持對(duì)源代碼的控制扇调。 此階段的關(guān)鍵元素是版本控制的自動(dòng)化矿咕。 我們可以將其視為CI階段的基線單位。自動(dòng)化涉及監(jiān)視版本控制系統(tǒng)的任何更改和觸發(fā)事件狼钮,例如代碼編譯和測(cè)試碳柱。
假設(shè)你正在與其他團(tuán)隊(duì)成員一起開發(fā)Git存儲(chǔ)庫。每當(dāng)將更改提交到存儲(chǔ)庫時(shí)熬芜,Git webhook都會(huì)觸發(fā)編譯代碼并執(zhí)行單元測(cè)試用例的Jenkins作業(yè)的通知莲镣。如果編譯失敗或測(cè)試用例失敗,則會(huì)自動(dòng)向整個(gè)開發(fā)人員組發(fā)送電子郵件涎拉。
2.構(gòu)建
這是應(yīng)用程序開發(fā)的關(guān)鍵階段瑞侮,當(dāng)完全自動(dòng)化時(shí),它允許開發(fā)團(tuán)隊(duì)每天多次測(cè)試和構(gòu)建他們的版本鼓拧。此階段包括編譯半火,打包和運(yùn)行自動(dòng)化測(cè)試。構(gòu)建自動(dòng)化實(shí)用程序(如Make季俩,Rake慈缔,Ant,Maven和Gradle)用于生成構(gòu)建工件种玛。
然后藐鹤,可以將構(gòu)建工件存儲(chǔ)到工件存儲(chǔ)庫中并部署到環(huán)境中。諸如JFrog Artifactory之類的工件存儲(chǔ)庫解決方案用于存儲(chǔ)和管理構(gòu)建工件赂韵。使用工件存儲(chǔ)庫的主要優(yōu)點(diǎn)是娱节,如果有必要,它們可以恢復(fù)到以前版本的構(gòu)建祭示。高度可用的云存儲(chǔ)服務(wù)(如AWS S3)也可用于存儲(chǔ)和管理構(gòu)建工件肄满。在AWS上運(yùn)行構(gòu)建服務(wù),應(yīng)考慮AWS CodeBuild。 Jenkins是最受歡迎的開源工具之一稠歉,可用于協(xié)調(diào)構(gòu)建過程掰担。
3.測(cè)試
自動(dòng)化測(cè)試在任何應(yīng)用程序開發(fā)--部署周期中都發(fā)揮著重要作用。所需的自動(dòng)化測(cè)試可分為三個(gè)不同的類別:
單元測(cè)試:開發(fā)人員將應(yīng)用程序細(xì)分為小的代碼單元并執(zhí)行測(cè)試怒炸。此測(cè)試應(yīng)該是構(gòu)建過程的一部分带饱,并且可以使用JUnit等工具自動(dòng)執(zhí)行。
集成測(cè)試:在分布式應(yīng)用程序的微服務(wù)領(lǐng)域阅羹,當(dāng)應(yīng)用程序的不同模塊集成時(shí)勺疼,單獨(dú)的組件應(yīng)該工作是很重要的。此階段可能涉及API測(cè)試捏鱼,與數(shù)據(jù)庫集成或其他服務(wù)执庐。此測(cè)試通常是部署和發(fā)布過程的一部分。
功能測(cè)試:這是應(yīng)用程序或產(chǎn)品的端到端測(cè)試导梆,通常作為發(fā)布過程的一部分在登臺(tái)服務(wù)器上執(zhí)行轨淌。它可以通過Selenium等工具實(shí)現(xiàn)自動(dòng)化,以便在不同的Web瀏覽器中高效運(yùn)行看尼。
為了執(zhí)行簡(jiǎn)化的測(cè)試猿诸,JMeter和Selenium等框架工具可以輕松地與Jenkins集成,以自動(dòng)執(zhí)行功能測(cè)試狡忙,作為端到端測(cè)試的一部分梳虽。
4.部署
完成構(gòu)建并完成候選版本的自動(dòng)化測(cè)試后,流水線的最后一個(gè)階段是將新代碼自動(dòng)部署到流水線中的下一個(gè)環(huán)境灾茁。在此階段窜觉,測(cè)試的代碼將部署到暫存或生產(chǎn)環(huán)境。如果新版本在每個(gè)階段都通過了所有測(cè)試北专,則可以將其移動(dòng)到生產(chǎn)環(huán)境中禀挫。有各種部署策略,例如藍(lán)綠部署拓颓,金絲雀部署和就地部署语婴,以便在生產(chǎn)環(huán)境中進(jìn)行部署:
在藍(lán)綠色部署中,將有多個(gè)并行運(yùn)行的生產(chǎn)環(huán)境驶睦。新的“綠色”版本的應(yīng)用程序或服務(wù)與在單獨(dú)的基礎(chǔ)架構(gòu)上運(yùn)行的最后一個(gè)穩(wěn)定的“藍(lán)色”版本并行配置砰左。一旦你的綠色經(jīng)過測(cè)試并準(zhǔn)備就緒,就可以取消配置藍(lán)色场航。
在金絲雀部署中缠导,首先對(duì)較少的節(jié)點(diǎn)進(jìn)行部署,在使用這些節(jié)點(diǎn)進(jìn)行測(cè)試之后溉痢,將部署到所有節(jié)點(diǎn)僻造。
就地部署將代碼直接部署到所有活動(dòng)節(jié)點(diǎn)憋他,并可能導(dǎo)致停機(jī);但是,通過滾動(dòng)更新髓削,您可以減少或消除停機(jī)時(shí)間竹挡。
此外,通過部署立膛,需要考慮三個(gè)關(guān)鍵的自動(dòng)化元素:
??? 云基礎(chǔ)架構(gòu)配置:AWS CloudFormation揪罕,AWS OpsWorks Stacks和Terraform等基礎(chǔ)架構(gòu)管理工具,只需點(diǎn)擊幾下或API調(diào)用旧巾,即可幫助創(chuàng)建模板并將整個(gè)底層應(yīng)用程序堆棧(包括計(jì)算耸序,存儲(chǔ)和網(wǎng)絡(luò))從一個(gè)環(huán)境克隆到另一個(gè)環(huán)境忍些。
??? 使用Chef鲁猩,Puppet和AWS OpsWorks等工具進(jìn)行配置管理自動(dòng)化可確保配置文件處于所需狀態(tài),包括操作系統(tǒng)級(jí)配置參數(shù)(文件權(quán)限罢坝,環(huán)境變量等)廓握。多年來,這些也發(fā)展到自動(dòng)化整個(gè)流程嘁酿,包括代碼流和部署以及基礎(chǔ)架構(gòu)級(jí)別的資源協(xié)調(diào)隙券。
??? 容器化和編排:人們必須等待服務(wù)器引導(dǎo)以部署新版本代碼的日子已經(jīng)一去不復(fù)返了。 Docker等容器用于打包和擴(kuò)展特定服務(wù)闹司,并包含運(yùn)行它所需的一切娱仔。服務(wù)打包可以支持分段和生產(chǎn)之間所需的隔離,并與Kubernetes等編排工具一起游桩,可以幫助自動(dòng)化部署牲迫,同時(shí)降低在不同環(huán)境中移動(dòng)代碼時(shí)的風(fēng)險(xiǎn)。
現(xiàn)在我們已經(jīng)涵蓋了流水線的所有階段借卧,讓我們看看項(xiàng)目實(shí)踐案例盹憎。
流水線使用步驟
1.檢出代碼(GetCode)
目前代碼管理主要使用Gitlab和SVN,通過Jenkins獲取項(xiàng)目代碼庫信息(代碼庫類型铐刘、地址陪每、標(biāo)簽、分支)檢出源代碼镰吵。
2.代碼掃描(CodeScan)
對(duì)接SonarQube做代碼的質(zhì)量檢測(cè)檩禾,SkipSonar參數(shù)為false時(shí),由Sonar-Scanner實(shí)現(xiàn)代碼掃描疤祭。
3.構(gòu)建(Build)
構(gòu)建是一個(gè)打包的過程锌订,常用的打包工具有Maven、Ant画株、Gradle辆飘、Npm啦辐。通過Jekins獲取項(xiàng)目類型執(zhí)行Mvn/Gradle/Ant/Npm打包構(gòu)建,構(gòu)建成功后jar包可以上傳到Nexus制品倉庫蜈项。
4.單元測(cè)試(Test)
根據(jù)編寫的測(cè)試用例完成測(cè)試芹关,通常是以Mvn Test方式執(zhí)行。
5.發(fā)布(Deploy)
SkipDeploy參數(shù)為false的時(shí)候執(zhí)行發(fā)布紧卒,發(fā)布的應(yīng)用服務(wù)器可以是虛擬機(jī)或容器侥衬。
結(jié)論:自動(dòng)化提高工作效率
無論是推動(dòng)提交部署新版本還是在失敗后恢復(fù),自動(dòng)化流程都可以節(jié)省時(shí)間跑芳,保持質(zhì)量轴总,保持一致性,并允許研發(fā)團(tuán)隊(duì)加快和預(yù)測(cè)交付博个。