溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

發(fā)布時(shí)間:2021-12-22 16:18:31 來源:億速云 閱讀:200 作者:小新 欄目:云計(jì)算

這篇文章主要為大家展示了“Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線”這篇文章吧。

在《構(gòu)建環(huán)境容器化》中,我們開始了構(gòu)建持續(xù)集成流水線的第一步工作——構(gòu)建系統(tǒng)(Build System)的創(chuàng)建。我們分析了【Build】這一環(huán)節(jié)的常見的三大挑戰(zhàn)——依賴管理、管理環(huán)境依賴、復(fù)雜項(xiàng)目的漫長(zhǎng)構(gòu)建時(shí)間,以及如何用傳統(tǒng)工具與方法解決這些問題。接著,我們分享了如何利用Docker創(chuàng)建容器化的構(gòu)建系統(tǒng)以更輕松地解決那些傳統(tǒng)挑戰(zhàn),包括如何將構(gòu)建環(huán)境容器化、如何使用Docker打包應(yīng)用程序、如何使用Docker Compose創(chuàng)建構(gòu)建環(huán)境,最終創(chuàng)造一個(gè)可重復(fù)的、集中管理的、良好隔離的、并行化的構(gòu)建系統(tǒng)。

現(xiàn)在我們已經(jīng)將【Build】系統(tǒng)創(chuàng)建好了,那么在本文中,我們將為示例的應(yīng)用創(chuàng)建一個(gè)持續(xù)集成流水線。這樣我們既可以確保遵循最佳實(shí)踐,又可以確保彼此沖突的那些變化不會(huì)相互作用、引發(fā)問題。不過,在我們?yōu)榇a建立持續(xù)集成之前,我們先花一點(diǎn)時(shí)間討論如何將代碼劃分到分支中。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

分支模式

在我們實(shí)現(xiàn)持續(xù)集成流水線的自動(dòng)化時(shí),一個(gè)需要考慮的重點(diǎn)是團(tuán)隊(duì)遵循的開發(fā)模式。這個(gè)模式通常由團(tuán)隊(duì)如何使用版本控制系統(tǒng)來決定。由于我們的應(yīng)用程序托管在git倉庫中,因此我們使用git-flow模型進(jìn)行分支、版本化以及發(fā)布我們的應(yīng)用程序。它是基于git倉庫上最常用的模型之一。簡(jiǎn)而言之,該模型的思想是維護(hù)兩個(gè)分支:一個(gè)開發(fā)(者)分支,一個(gè)主分支。每當(dāng)我們想開發(fā)新功能時(shí),就會(huì)從開發(fā)分支創(chuàng)建出新的分支,并在功能開發(fā)完成時(shí),將它合并回來。所有功能分支都有開發(fā)人員單獨(dú)管理。一旦將代碼提交到開發(fā)分支,CI服務(wù)器將負(fù)責(zé)確保分支始終能夠編譯、通過自動(dòng)化測(cè)試并且可以在服務(wù)器上進(jìn)行QA測(cè)試和評(píng)審。當(dāng)我們準(zhǔn)備進(jìn)行發(fā)布時(shí),可以從開發(fā)分支創(chuàng)建一個(gè)發(fā)布,并將其合并到主分支中。被發(fā)布的特定的commit hash也會(huì)使用版本號(hào)進(jìn)行標(biāo)記。被標(biāo)記好的發(fā)布項(xiàng)接著就可以被推送到Staging/Beta或者生產(chǎn)環(huán)境中。

下面我們將使用git-flow工具來幫助管理我們的git分支。安裝git-flow請(qǐng)參考這里的說明:https://github.com/nvie/gitflow/wiki/Installation。安裝好git-flow,你就可以通過下面所示的git flow init命令配置你的倉庫。Git flow會(huì)問一些問題,我們建議你使用默認(rèn)的設(shè)置即可。執(zhí)行過git-flow命令后,它將創(chuàng)建一個(gè)開發(fā)分支(如果原先沒有開發(fā)分支的話),并將其檢出作為工作分支。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

現(xiàn)在,我們使用git flow輸入git flow feature start [feature-name]命令創(chuàng)建一個(gè)新功能。通常做法是用ticket/issue id用作功能的名稱。比如,如果你使用的是Jira處理ticket,那么ticket id(例如,MSP-123)就可以作為功能名稱。你還會(huì)發(fā)現(xiàn)當(dāng)你使用git-flow創(chuàng)建新功能時(shí),它將自動(dòng)切換到功能分支。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

到了這一步,你可以去完成該功能所需的全部?jī)?nèi)容,然后運(yùn)行自動(dòng)化測(cè)試套件以確保一切正常運(yùn)轉(zhuǎn)。一旦你準(zhǔn)備好發(fā)布工作,只需告訴git-flow去完成這一功能即可。根據(jù)你對(duì)該功能的實(shí)際需要,你想要進(jìn)行多少次提交都可以。在我的這個(gè)示例中,從我們的目的來看,我們只需更新README文件,并通過輸入“git flow feature finish MSP-123”來完成更新。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

需要注意的是,git flow合并了開發(fā)分支的功能,刪除了功能分支并且返回到了開發(fā)分支。此時(shí),你可以將開發(fā)分支推送到遠(yuǎn)程倉庫(git push origin develop:develop)。 當(dāng)你提交了開發(fā)分支,CI服務(wù)器就會(huì)接管持續(xù)集成流水線。對(duì)于更大的團(tuán)隊(duì)來說,一種更合適的模式是在完成功能之前將功能分支推送到遠(yuǎn)程,讓它們經(jīng)評(píng)審(review)后,使用pull request來合并到開發(fā)分支中。

使用Jenkins創(chuàng)建CI流水線

在這一節(jié),我們假設(shè)你已啟動(dòng)并運(yùn)行了一個(gè)Jenkins集群。如果沒有的話,你可以在這里使用官方的Jenkins鏡像:https://hub.docker.com/_/jenkins/ ,在這里可以看到更多關(guān)于建立可擴(kuò)展Jenkins集群的內(nèi)容:https://rancher.com/deploying-a-scalable-jenkins-cluster-with-docker-and-rancher/ 。在你有了運(yùn)行的Jenkins集群后,我們需要在Jenkins服務(wù)器上安裝下面的插件和依賴項(xiàng):

Jenkins Plugins 2.32.2+

  • Git Parameter Plugin 0.8.0+

  • Parameterized Trigger Plugin 2.33+

  • Copy Artifact Plugin 1.38.1+

  • Build Pipeline Plugin 1.5.6+

  • Mask Passwords Plugin 2.9+

    Docker 1.13.1+

    Docker Compose 1.11.1+

安裝好需要的插件后,我們就可以在【Build流水線】中創(chuàng)建最初的三個(gè)任務(wù):編譯、打包和集成測(cè)試。這些將作為我們持續(xù)集成和部署系統(tǒng)的起點(diǎn)。

構(gòu)建應(yīng)用

序列中的第一個(gè)任務(wù)將會(huì)在每次提交后從源碼控制中檢出最新的代碼并且確保其可編譯。它還會(huì)運(yùn)行單元測(cè)試。如果要在我們的示例項(xiàng)目中設(shè)置第一個(gè)任務(wù),選擇New Item->Freestyle Project。進(jìn)入項(xiàng)目配置視圖中,選擇General選項(xiàng)卡以及“The project is parameterized”選項(xiàng)。添加一個(gè)叫做GO_AUTH_VERSION的git參數(shù),將參數(shù)類型設(shè)置為Branch(分支)或者Tag(標(biāo)記)。接下來選擇Advanced配置參數(shù),使用Tag Filter設(shè)置獲取匹配“v”的所有標(biāo)記(比如v2.0)。將Default Value設(shè)置成develop(開發(fā)分支)。這將有助于從Git獲取版本標(biāo)簽列表,并為該任務(wù)填充選項(xiàng)菜單。如果該任務(wù)要在沒有給定值的情況下自動(dòng)觸發(fā),那么GO_AUTH_VERSION默認(rèn)設(shè)成develop(開發(fā))分支。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

接下來,在Source Code Management選項(xiàng)卡部分添加倉庫url,指定分支為${GO_AUTH_VERSION},這樣手動(dòng)構(gòu)建時(shí)將會(huì)使用git參數(shù)來選擇分支或標(biāo)記進(jìn)行構(gòu)建及設(shè)置輪詢間隔。這樣一來,Jenkins就會(huì)持續(xù)追蹤我們開發(fā)分支的未來所有更改,在我們的CI(和CD)流水線中自動(dòng)觸發(fā)第一個(gè)任務(wù)。這里要注意的是,GO_AUTH_VERSION的默認(rèn)值(比如開發(fā)分支)將用于自動(dòng)檢測(cè)到的更改。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

現(xiàn)在在Build選項(xiàng)卡部分選擇Add Build Step > Execute Shell并從本章前面部分復(fù)制docker run命令粘貼到這。這樣可以從Github獲得最新的代碼,并將代碼構(gòu)建到go-auth可執(zhí)行文件中。這里需要安裝并運(yùn)行docker。如果你使用的是Linux服務(wù)器,可能還需要在docker客戶機(jī)命令中添加sudo以便能夠訪問docker守護(hù)進(jìn)程。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

在構(gòu)建步驟之后,我們需要添加兩個(gè)后續(xù)步驟,其中Archive the Artifacts(工件歸檔)將go-auth二進(jìn)制文件和幫助腳本歸檔到項(xiàng)目中。我們?cè)谌蝿?wù)中需要指定下列的工件進(jìn)行歸檔。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

接著我們使用Trigger parameterized builds(觸發(fā)器參數(shù)化構(gòu)建)啟動(dòng)流水線中的下一個(gè)任務(wù),如下圖所示。在添加Trigger parameterized build時(shí),請(qǐng)確保是從Add Parameters中添加的Current build parameters。這樣可以讓當(dāng)前任務(wù)的全部參數(shù)(比如GO_AUTH_VERSION)用于下一個(gè)任務(wù)。請(qǐng)留意在Trigger parameterized build部分中用于下游任務(wù)的參數(shù)名稱,我們將在下面的步驟中用到。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

構(gòu)建任務(wù)的日志輸出應(yīng)該像下面展示的這樣。你可以看到我們使用了docker化的容器來執(zhí)行構(gòu)建。構(gòu)建時(shí)將使用go fmt來修復(fù)代碼中任何格式的不一致,并且執(zhí)行我們的單元測(cè)試。如果出現(xiàn)測(cè)試失敗或者編譯不通過,Jenkins就會(huì)檢測(cè)到失敗。此外,你應(yīng)該通過email或者chat integrations(例如Hipchat或者Slack)設(shè)置通知,這樣在構(gòu)建失敗時(shí)就能通知到你的團(tuán)隊(duì),快速地修復(fù)它。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

打包應(yīng)用

代碼編譯通過了,接下來我們就能將它打包進(jìn)Docker容器中。創(chuàng)建打包任務(wù)的方式是,選擇New Item > Freestyle Project并給你的第二個(gè)任務(wù)起一個(gè)名稱,該名稱對(duì)應(yīng)于在先前任務(wù)中指定的內(nèi)容。和之前一樣,該任務(wù)也是一個(gè)帶有GO_AUTH_VERSION參數(shù)的參數(shù)化構(gòu)建。要注意的是,這里和所有后續(xù)的任務(wù)中,GO_AUTH_VERSION只是一個(gè)默認(rèn)值為develop(開發(fā)分支)的string參數(shù)。我們希望它的值是從上游傳過來的。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

和之前一樣,添加構(gòu)建步驟來執(zhí)行shell。注意這里你不需要指定SCM設(shè)置,因?yàn)槲覀儗那耙粋€(gè)構(gòu)建生成的工件中提取所需的二進(jìn)制文件和腳本。注意一下,我們這里是先創(chuàng)建未標(biāo)記的usman/go-auth,之后再重新標(biāo)記,這樣我們就可以在后面執(zhí)行集成測(cè)試,搭建好未打標(biāo)記的容器環(huán)境。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

為了構(gòu)建Docker容器,我們還需要前一步中構(gòu)建的可執(zhí)行文件。為此,我們?cè)黾右粋€(gè)構(gòu)建步驟復(fù)制上游構(gòu)建中的工件。這樣可以保證我們有可用于Docker構(gòu)建命令的可執(zhí)行文件,該命令可以打包到Docker容器中。注意這里我們選擇了flatten目錄來保證所有工件都復(fù)制到當(dāng)前項(xiàng)目的根目錄中。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

我們一直在使用GO_AUTH_VERSION變量標(biāo)記我們正在構(gòu)建的鏡像。在默認(rèn)情況下,開發(fā)分支的變更,總會(huì)構(gòu)建usman/go-auth:develop并覆蓋現(xiàn)有的鏡像。在下一章中,我們會(huì)發(fā)布應(yīng)用程序的新版本并重新審視這個(gè)流水線。

和之前相同,使用了Trigger parameterized builds下(包含了Current build parameters)的后構(gòu)建(post-build)來觸發(fā)流水線中的下一個(gè)任務(wù),該任務(wù)將使用我們剛剛構(gòu)建好的Docker容器以及在之前章節(jié)中詳述的Docker Compose來執(zhí)行集成測(cè)試。

執(zhí)行集成測(cè)試

接下來是執(zhí)行集成測(cè)試,先要?jiǎng)?chuàng)建一個(gè)新任務(wù)。和打包任務(wù)相同,新任務(wù)是一個(gè)使用GO_AUTH_VERSION string變量的參數(shù)化構(gòu)建。然后從構(gòu)建任務(wù)中復(fù)制工件。這一次我們將使用上面的Docker Compose模板來搭建一個(gè)多容器測(cè)試環(huán)境,并對(duì)我們的代碼執(zhí)行集成測(cè)試。集成測(cè)試(不同于單元測(cè)試)通常是與正在測(cè)試的代碼完全隔離的。因此,我們會(huì)用到一個(gè)shell腳本,它可以針對(duì)我們的測(cè)試環(huán)境執(zhí)行http查詢。在執(zhí)行shell命令中,將目錄修改為go-auth并執(zhí)行integrationtest.sh。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

腳本的內(nèi)容可以在這里找到:https://github.com/usmanismail/go-messenger/blob/master/go-auth/integration-test.sh。我們用Docker Compose搭建我們的環(huán)境,然后使用curl發(fā)送http請(qǐng)求到搭建的容器中。這項(xiàng)任務(wù)的日志將會(huì)和下圖顯示的相似。Compose將會(huì)啟動(dòng)一個(gè)數(shù)據(jù)庫容器,并將它連接到goauth容器。數(shù)據(jù)庫連接之后你應(yīng)該會(huì)看到一些列“Pass: …”信息,說明各項(xiàng)測(cè)試都在運(yùn)行和驗(yàn)證。測(cè)試完成后,compose模板將會(huì)自行清理數(shù)據(jù)庫和go-auth容器。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

經(jīng)過了三個(gè)任務(wù)的設(shè)置,你就可以在Jenkins視圖中選擇【+選項(xiàng)卡】,選擇build pipeline view來創(chuàng)建一個(gè)新的構(gòu)建流水線視圖。在彈出的配置界面中,選擇你編譯/構(gòu)建的任務(wù)作為初始任務(wù),然后選擇ok?,F(xiàn)在你應(yīng)該能看到CI流水線已經(jīng)成型。這將給你一個(gè)可視化引導(dǎo),展示每個(gè)提交是如何通過你的構(gòu)建和部署流水線的。

Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線

當(dāng)你更改開發(fā)分支時(shí),你會(huì)注意到流水線是由Jenkins自動(dòng)觸發(fā)的。如果要手動(dòng)觸發(fā)流水線,選擇你第一個(gè)(構(gòu)建)任務(wù),運(yùn)行它。系統(tǒng)會(huì)要求你選擇git參數(shù)的值(比如GO_AUTH_VERSION)。不指定的話會(huì)執(zhí)行默認(rèn)值,并且會(huì)運(yùn)行針對(duì)開發(fā)分支中最新內(nèi)容的CI流水線。當(dāng)然,你可以直接在流水線視圖中單擊“Run”。

我們快速回顧一下到現(xiàn)在為止我們所做的工作。我們通過以下步驟為我們的應(yīng)用程序創(chuàng)建了CI流水線:

  1. 使用git-flow添加新功能,并將他們合并到開發(fā)分支中。

  2. 跟蹤開發(fā)分支的變化,在一個(gè)容器化環(huán)境中構(gòu)建我們的應(yīng)用程序

  3. 將我們的應(yīng)用程序打包到docker容器中

  4. 使用Docker Compose搭建短生命周期環(huán)境

  5. 執(zhí)行集成測(cè)試以及清理環(huán)境

通過上面的CI流水線,每當(dāng)新功能(或者修復(fù))合并到開發(fā)分支時(shí),CI流水線就會(huì)執(zhí)行上述所有的步驟,創(chuàng)建出“usman/go-auth:develop” Docker鏡像。此外,我們?cè)诮酉聛淼恼鹿?jié)中將構(gòu)建更深層的集成部署流水線。另外因?yàn)樵撘晥D有清晰的測(cè)試階段,你還可以使用此視圖將應(yīng)用程序版本推廣到各種部署環(huán)境中。

以上是“Docker+Rancher中如何創(chuàng)建持續(xù)集成流水線”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI