今天,人們希望比以往更快地看到他們最喜歡的應(yīng)用程序與最新的花里胡哨。開(kāi)發(fā)人員花費(fèi)數(shù)年時(shí)間開(kāi)發(fā)和發(fā)布新軟件產(chǎn)品的日子已經(jīng)一去不復(fù)返了。因此,每個(gè)軟件開(kāi)發(fā)公司都需要一個(gè)有效的 DevOps 管道來(lái)跟上客戶的需求。本文介紹了 DevOps 管道的基本概念,管道如何在 DevOps 環(huán)境中工作,并解釋了代碼在部署到生產(chǎn)之前必須經(jīng)過(guò)的階段。

什么是 DevOps 管道?
DevOps 管道是開(kāi)發(fā) (Dev) 和運(yùn)營(yíng) (Ops) 團(tuán)隊(duì)實(shí)施的一組實(shí)踐,用于更快、更輕松地構(gòu)建、測(cè)試和部署軟件。管道的主要目的之一是保持軟件開(kāi)發(fā)過(guò)程的組織和重點(diǎn)。不過(guò),“管道”一詞可能有點(diǎn)誤導(dǎo)。汽車廠的裝配線可能是一個(gè)更合適的類比,因?yàn)?軟件開(kāi)發(fā)是一個(gè)連續(xù)的循環(huán)。
在制造商向公眾發(fā)布汽車之前,它必須通過(guò)無(wú)數(shù)的組裝階段、測(cè)試和質(zhì)量檢查。工人必須建造底盤(pán)、添加電機(jī)、車輪、車門、電子設(shè)備和完成油漆工作,以使其對(duì)客戶具有吸引力。DevOps 管道的工作方式類似。
在向用戶發(fā)布應(yīng)用程序或新功能之前,您首先必須編寫(xiě)代碼。然后,確保它不會(huì)導(dǎo)致任何可能導(dǎo)致應(yīng)用程序崩潰的致命錯(cuò)誤。避免這種情況涉及運(yùn)行各種測(cè)試以找出任何錯(cuò)誤、錯(cuò)別字或錯(cuò)誤。最后,一旦一切按預(yù)期工作,您就可以將代碼發(fā)布給用戶。從這個(gè)簡(jiǎn)化的解釋中,您可以得出結(jié)論,DevOps 管道由構(gòu)建、測(cè)試和部署階段組成。
DevOps 管道的組件
為確保代碼從一個(gè)階段無(wú)縫移動(dòng)到下一個(gè)階段,需要實(shí)施多種 DevOps 策略和實(shí)踐。其中最重要的是 持續(xù)集成 和 持續(xù)交付(CI/CD)。
持續(xù)集成
持續(xù)集成 (CI) 是一種將來(lái)自多個(gè)開(kāi)發(fā)人員的小塊代碼盡可能頻繁地集成到共享代碼存儲(chǔ)庫(kù)中的方法。使用 CI 策略,您可以自動(dòng)測(cè)試代碼中的錯(cuò)誤,而無(wú)需等待其他團(tuán)隊(duì)成員貢獻(xiàn)他們的代碼。CI 的主要好處之一是它可以幫助大型團(tuán)隊(duì)防止所謂的 集成地獄。
在軟件開(kāi)發(fā)的早期,開(kāi)發(fā)人員必須等待很長(zhǎng)時(shí)間才能提交代碼。這種延遲顯著增加了代碼集成沖突和錯(cuò)誤代碼部署的風(fēng)險(xiǎn)。與舊的做事方式相反,CI 鼓勵(lì)開(kāi)發(fā)人員每天提交他們的代碼。因此,他們可以更快地發(fā)現(xiàn)錯(cuò)誤,并最終花費(fèi)更少的時(shí)間來(lái)修復(fù)它們。CI 的核心是 中央源代碼控制系統(tǒng)。它的主要目的是幫助團(tuán)隊(duì)組織他們的代碼、跟蹤更改并啟用自動(dòng)化測(cè)試。
在典型的 CI 設(shè)置中,每當(dāng)開(kāi)發(fā)人員將新代碼推送到共享代碼存儲(chǔ)庫(kù)時(shí),自動(dòng)化就會(huì)啟動(dòng)以將新代碼和現(xiàn)有代碼編譯到構(gòu)建中。如果構(gòu)建過(guò)程失敗,開(kāi)發(fā)人員會(huì)收到警報(bào),通知他們哪些代碼行需要重做。確保只有高質(zhì)量的代碼通過(guò)管道是至關(guān)重要的。因此,每次有人向共享存儲(chǔ)庫(kù)提交新代碼時(shí),都會(huì)重復(fù)整個(gè)過(guò)程。

持續(xù)交付
持續(xù)交付 (CD) 是 CI 的擴(kuò)展。它涉及通過(guò)鼓勵(lì)開(kāi)發(fā)人員以增量塊的形式將代碼發(fā)布到生產(chǎn)環(huán)境來(lái)加快發(fā)布過(guò)程。通過(guò) CI 階段后,代碼構(gòu)建將移至?xí)捍鎱^(qū)。在管道中的這一點(diǎn)上,由您決定是將構(gòu)建推送到生產(chǎn)還是保留它以進(jìn)行進(jìn)一步評(píng)估。在典型的 DevOps 場(chǎng)景中,開(kāi)發(fā)人員首先將他們的代碼推送到類似生產(chǎn)的環(huán)境中以評(píng)估其行為方式。但是,新版本也可以立即上線,開(kāi)發(fā)人員只需按一下按鈕即可隨時(shí)部署它。
要充分利用持續(xù)交付,請(qǐng)盡可能頻繁地部署代碼更新。發(fā)布頻率取決于工作流程,但通常是每天、每周或每月。與一次發(fā)布所有更改相比,以更小的塊發(fā)布代碼更容易解??決問(wèn)題。因此,您可以避免瓶頸和合并沖突,從而保持穩(wěn)定、持續(xù)的集成管道流。
持續(xù)部署
持續(xù)交付和持續(xù)部署在許多方面都相似,但兩者之間存在關(guān)鍵差異。雖然持續(xù)交付使開(kāi)發(fā)團(tuán)隊(duì)能夠手動(dòng)部署軟件、功能和代碼更新,但持續(xù)部署就是自動(dòng)化整個(gè)發(fā)布周期。
在持續(xù)部署階段,代碼更新會(huì)自動(dòng)發(fā)布給最終用戶,無(wú)需任何人工干預(yù)。但是,實(shí)施自動(dòng)發(fā)布策略可能很危險(xiǎn)。如果它未能緩解沿途檢測(cè)到的所有錯(cuò)誤,那么不良代碼將被部署到生產(chǎn)環(huán)境中。在最壞的情況下,這可能會(huì)導(dǎo)致應(yīng)用程序中斷或用戶遇到停機(jī)時(shí)間。
僅在發(fā)布次要代碼更新時(shí)才應(yīng)使用自動(dòng)部署。如果出現(xiàn)問(wèn)題,您可以回滾更改而不會(huì)導(dǎo)致應(yīng)用程序出現(xiàn)故障。要充分利用持續(xù)部署的潛力,需要擁有強(qiáng)大的測(cè)試框架,以確保新代碼真正沒(méi)有錯(cuò)誤并準(zhǔn)備好立即部署到生產(chǎn)環(huán)境中。
持續(xù)測(cè)試
持續(xù)測(cè)試是在開(kāi)發(fā)過(guò)程的每個(gè)階段盡可能頻繁地運(yùn)行測(cè)試以在到達(dá)生產(chǎn)環(huán)境之前檢測(cè)問(wèn)題的做法。實(shí)施持續(xù)測(cè)試策略可以快速評(píng)估交付管道中特定候選版本的業(yè)務(wù)風(fēng)險(xiǎn)。
測(cè)試范圍應(yīng)涵蓋功能測(cè)試和非功能測(cè)試。這包括處理應(yīng)用程序和服務(wù)器基礎(chǔ)架構(gòu)的安全和性能方面的運(yùn)行單元、系統(tǒng)、集成和測(cè)試。持續(xù)測(cè)試包括更廣泛的質(zhì)量控制,包括風(fēng)險(xiǎn)評(píng)估和遵守內(nèi)部政策。

持續(xù)運(yùn)營(yíng)
擁有全面的持續(xù)運(yùn)營(yíng)策略有助于保持應(yīng)用程序和環(huán)境的最大可用性。目標(biāo)是讓用戶不知道不斷發(fā)布代碼更新、錯(cuò)誤修復(fù)和補(bǔ)丁。持續(xù)運(yùn)營(yíng)策略有助于防止代碼發(fā)布期間出現(xiàn)停機(jī)和可用性問(wèn)題。要獲得持續(xù)運(yùn)營(yíng)的好處,您需要有一個(gè)強(qiáng)大的 自動(dòng)化和編排 架構(gòu),可以處理服務(wù)器、數(shù)據(jù)庫(kù)、容器、網(wǎng)絡(luò)、服務(wù)和應(yīng)用程序的持續(xù)性能監(jiān)控。
DevOps 管道的階段
關(guān)于如何構(gòu)建管道沒(méi)有固定的規(guī)則。DevOps 團(tuán)隊(duì)根據(jù)他們的特定工作流程添加和刪除某些階段。盡管如此,幾乎每個(gè)管道都有四個(gè)核心階段: 開(kāi)發(fā)、 構(gòu)建、 測(cè)試和 部署。可以通過(guò)添加另外兩個(gè)階段( 計(jì)劃 和 監(jiān)控)來(lái)擴(kuò)展該設(shè)置 ,因?yàn)樗鼈冊(cè)趯I(yè)的 DevOps 環(huán)境中也很常見(jiàn)。
計(jì)劃
規(guī)劃階段涉及在開(kāi)發(fā)人員開(kāi)始編碼之前規(guī)劃整個(gè)工作流程。在這個(gè)階段,產(chǎn)品經(jīng)理和項(xiàng)目經(jīng)理起著至關(guān)重要的作用。他們的工作是創(chuàng)建一個(gè)開(kāi)發(fā)路線圖,指導(dǎo)整個(gè)團(tuán)隊(duì)完成整個(gè)過(guò)程。
在從用戶和利益相關(guān)者那里收集反饋和相關(guān)信息后,工作被分解成一個(gè)任務(wù)列表。通過(guò)將項(xiàng)目分割成更小、更易于管理的塊,團(tuán)隊(duì)可以更快地交付結(jié)果、當(dāng)場(chǎng)解決問(wèn)題并更輕松地適應(yīng)突然的變化。在 DevOps 環(huán)境中,團(tuán)隊(duì)在 sprint中工作- 一個(gè)較短的時(shí)間段(通常為兩周),在此期間,各個(gè)團(tuán)隊(duì)成員都在處理分配給他們的任務(wù)。
發(fā)展
在開(kāi)發(fā)階段,開(kāi)發(fā)人員開(kāi)始編碼。根據(jù)編程語(yǔ)言,開(kāi)發(fā)人員在他們的本地機(jī)器上安裝適當(dāng)?shù)?IDE(Python IDE、Java IDE等)、代碼編輯器和其他技術(shù),以實(shí)現(xiàn)最大的生產(chǎn)力。
在大多數(shù)情況下,開(kāi)發(fā)人員必須遵循某些編碼風(fēng)格和標(biāo)準(zhǔn),以確保統(tǒng)一的編碼模式。這使任何團(tuán)隊(duì)成員都更容易閱讀和理解代碼。當(dāng)開(kāi)發(fā)人員準(zhǔn)備好提交他們的代碼時(shí),他們會(huì)向共享源代碼存儲(chǔ)庫(kù)發(fā)出拉取請(qǐng)求。然后,團(tuán)隊(duì)成員可以手動(dòng)審查新提交的代碼,并通過(guò)批準(zhǔn)初始拉取請(qǐng)求將其與主分支合并。

建造
DevOps 管道的構(gòu)建階段至關(guān)重要,因?yàn)樗试S開(kāi)發(fā)人員在代碼中的錯(cuò)誤進(jìn)入管道并導(dǎo)致重大災(zāi)難之前檢測(cè)到它們。在新編寫(xiě)的代碼與共享存儲(chǔ)庫(kù)合并后,開(kāi)發(fā)人員會(huì)運(yùn)行一系列自動(dòng)化測(cè)試。在典型的場(chǎng)景中,拉取請(qǐng)求會(huì)啟動(dòng)一個(gè)自動(dòng)化過(guò)程,將代碼編譯成構(gòu)建 - 可部署的包或可執(zhí)行文件。
請(qǐng)記住,某些編程語(yǔ)言不需要編譯。例如,用 Java 和 C編寫(xiě)的應(yīng)用程序 需要編譯才能運(yùn)行,而用 PHP 和 Python編寫(xiě)的應(yīng)用程序 則不需要。如果代碼有問(wèn)題,構(gòu)建會(huì)失敗,并且會(huì)通知開(kāi)發(fā)人員這些問(wèn)題。如果發(fā)生這種情況,初始拉取請(qǐng)求也會(huì)失敗。開(kāi)發(fā)人員每次提交到共享存儲(chǔ)庫(kù)時(shí)都會(huì)重復(fù)此過(guò)程,以確保只有無(wú)錯(cuò)誤的代碼繼續(xù)沿管道傳輸。
測(cè)試
如果構(gòu)建成功,則進(jìn)入測(cè)試階段。在那里,開(kāi)發(fā)人員運(yùn)行手動(dòng)和自動(dòng)測(cè)試以進(jìn)一步驗(yàn)證代碼的完整性。在大多數(shù)情況下, 會(huì)執(zhí)行用戶驗(yàn)收測(cè)試 。人們以最終用戶的身份與應(yīng)用程序進(jìn)行交互,以確定代碼在將其發(fā)送到生產(chǎn)環(huán)境之前是否需要進(jìn)行額外的更改。在這個(gè)階段,執(zhí)行安全、性能和負(fù)載測(cè)試也 很常見(jiàn)。
部署
當(dāng)構(gòu)建到達(dá) Deploy 階段時(shí),軟件已準(zhǔn)備好推送到生產(chǎn)環(huán)境。如果代碼只需要較小的更改,則使用自動(dòng)部署方法。但是,如果應(yīng)用程序經(jīng)歷了大修,則首先將構(gòu)建部署到類似生產(chǎn)的環(huán)境中,以監(jiān)控新添加的代碼的行為方式。在發(fā)布重大更新時(shí),實(shí)施 藍(lán)綠部署策略 也很常見(jiàn)。
藍(lán)綠色部署意味著擁有兩個(gè)相同的生產(chǎn)環(huán)境,其中一個(gè)環(huán)境托管當(dāng)前應(yīng)用程序,而另一個(gè)環(huán)境托管更新版本。要將更改發(fā)布給最終用戶,開(kāi)發(fā)人員可以簡(jiǎn)單地將所有請(qǐng)求轉(zhuǎn)發(fā)到適當(dāng)?shù)姆?wù)器。如果出現(xiàn)問(wèn)題,開(kāi)發(fā)人員可以簡(jiǎn)單地恢復(fù)到以前的生產(chǎn)環(huán)境,而不會(huì)導(dǎo)致服務(wù)中斷。
監(jiān)視器
在 DevOps 管道的最后階段,運(yùn)營(yíng)團(tuán)隊(duì)努力工作,持續(xù)監(jiān)控基礎(chǔ)架構(gòu)、系統(tǒng)和應(yīng)用程序,以確保一切順利運(yùn)行。他們從日志、分析和監(jiān)控系統(tǒng)以及用戶反饋中收集有價(jià)值的數(shù)據(jù),以發(fā)現(xiàn)任何性能問(wèn)題。在 Monitor 階段收集的反饋用于提高 DevOps 管道的整體效率。在每個(gè)發(fā)布周期之后調(diào)整管道以消除潛在的瓶頸或其他可能阻礙生產(chǎn)力的問(wèn)題是一種很好的做法。

如何創(chuàng)建 DevOps 管道
現(xiàn)在您已經(jīng)更好地了解了 DevOps 管道是什么以及它是如何工作的,讓我們探索創(chuàng)建 CI/CD 管道時(shí)所需的步驟。
設(shè)置源代碼控制環(huán)境
在您和團(tuán)隊(duì)開(kāi)始構(gòu)建和部署代碼之前,請(qǐng)確定源代碼的存儲(chǔ)位置。 GitHub 是迄今為止最受歡迎的代碼托管網(wǎng)站。GitLab 和 BitBucket 是強(qiáng)大的替代品。
要開(kāi)始使用 GitHub,請(qǐng)打開(kāi)一個(gè)免費(fèi)帳戶并創(chuàng)建一個(gè)共享存儲(chǔ)庫(kù)。要將代碼推送到 GitHub,首先 在本地機(jī)器上安裝 Git 。完成代碼編寫(xiě)后,將其推送到共享源代碼存儲(chǔ)庫(kù)。如果多個(gè)開(kāi)發(fā)人員正在開(kāi)發(fā)同一個(gè)項(xiàng)目,其他團(tuán)隊(duì)成員通常會(huì)在將新代碼與主分支合并之前手動(dòng)查看新代碼。
設(shè)置構(gòu)建服務(wù)器
一旦代碼在 GitHub 上,下一步就是對(duì)其進(jìn)行測(cè)試。針對(duì)代碼運(yùn)行測(cè)試有助于防止向用戶部署錯(cuò)誤、錯(cuò)誤或拼寫(xiě)錯(cuò)誤。許多測(cè)試可以確定代碼是否可以生產(chǎn)。決定運(yùn)行哪些分析取決于項(xiàng)目的范圍和用于運(yùn)行應(yīng)用程序的編程語(yǔ)言。
創(chuàng)建構(gòu)建的兩個(gè)最流行的解決方案是 Jenkins 和 Travis-CI。Jenkins 是完全免費(fèi)和開(kāi)源的,而 Travis-CI 是一個(gè)托管解決方案,也是免費(fèi)的,但僅適用于開(kāi)源項(xiàng)目。要開(kāi)始運(yùn)行測(cè)試, 請(qǐng)?jiān)诜?wù)器上安裝 Jenkins 并將其連接到 GitHub 存儲(chǔ)庫(kù)。然后,您可以將 Jenkins 配置為在每次更改共享存儲(chǔ)庫(kù)中的代碼時(shí)運(yùn)行。它編譯代碼并創(chuàng)建一個(gè)構(gòu)建。在構(gòu)建過(guò)程中,Jenkins 會(huì)在遇到任何問(wèn)題時(shí)自動(dòng)發(fā)出警報(bào)。
運(yùn)行自動(dòng)化測(cè)試
有許多測(cè)試,但最常見(jiàn)的是 單元測(cè)試、 集成測(cè)試和 功能測(cè)試。根據(jù)開(kāi)發(fā)環(huán)境,最好安排 自動(dòng)測(cè)試一個(gè) 接一個(gè)地運(yùn)行。通常,您希望在測(cè)試過(guò)程開(kāi)始時(shí)運(yùn)行最短的測(cè)試。例如,您將在功能測(cè)試之前運(yùn)行單元測(cè)試,因?yàn)樗鼈兺ǔP枰鄷r(shí)間才能完成。如果構(gòu)建順利通過(guò)測(cè)試階段,您可以將代碼部署到生產(chǎn)環(huán)境或類似生產(chǎn)環(huán)境以進(jìn)行進(jìn)一步評(píng)估。
部署到生產(chǎn)
在將代碼部署到生產(chǎn)環(huán)境之前,首先設(shè)置服務(wù)器基礎(chǔ)架構(gòu)。例如,要部署 Web 應(yīng)用程序,您需要 安裝像 Apache 這樣的 Web 服務(wù)器。假設(shè)應(yīng)用程序?qū)⒃谠浦羞\(yùn)行,您很可能會(huì)將其部署到虛擬機(jī)。對(duì)于需要物理硬件的全部處理潛力的應(yīng)用程序,您可以部署到專用服務(wù)器或 裸機(jī)云服務(wù)器。

部署應(yīng)用程序有兩種方法—— 手動(dòng) 或 自動(dòng)。首先,最好手動(dòng)部署代碼以了解部署過(guò)程。后來(lái),自動(dòng)化可以加快這個(gè)過(guò)程,但只有你有信心,才會(huì)有障礙阻止糟糕的代碼最終進(jìn)入生產(chǎn)環(huán)境。將代碼發(fā)布到生產(chǎn)環(huán)境是一個(gè)簡(jiǎn)單的過(guò)程。最簡(jiǎn)單的部署方法是配置構(gòu)建服務(wù)器以執(zhí)行自動(dòng)將代碼發(fā)布到生產(chǎn)環(huán)境的腳本。
結(jié)束時(shí)
現(xiàn)在您了解什么是 devops 管道以及它如何幫助加快您的軟件開(kāi)發(fā)生命周期。然而,這只是冰山一角。DevOps 管道是一個(gè)廣泛的主題,每個(gè)組織都會(huì)有自己的方式將其集成到他們的工作流程中。最終目標(biāo)是創(chuàng)建一個(gè)可重復(fù)的系統(tǒng),利用自動(dòng)化并實(shí)現(xiàn)持續(xù)改進(jìn),以幫助更快、更輕松地交付高質(zhì)量的產(chǎn)品。






