DevOps敏捷開發(fā)實(shí)踐

背景

傳統(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ǔ)庫(kù)系統(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ǔ)庫(kù)。每當(dāng)將更改提交到存儲(chǔ)庫(kù)時(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ǔ)庫(kù)中并部署到環(huán)境中。諸如JFrog Artifactory之類的工件存儲(chǔ)庫(kù)解決方案用于存儲(chǔ)和管理構(gòu)建工件。使用工件存儲(chǔ)庫(kù)的主要優(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ù)庫(kù)集成或其他服務(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)目代碼庫(kù)信息(代碼庫(kù)類型、地址、標(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制品倉(cāng)庫(kù)。

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è)交付。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容