ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(二)
在上文中我介紹了ASP.NET Core應(yīng)用程序容器化時需要注意的幾個問題,并給出了一個案例應(yīng)用程序:tasklist。今天接著上文的內(nèi)容,繼續(xù)了解一下如何使用Azure DevOps進行ASP.NET Core應(yīng)用程序的持續(xù)集成。為了便于討論,本文會將持續(xù)集成(Continuous Integration)縮寫為CI,而將持續(xù)部署(Continuous Deployment)縮寫為CD。
Azure DevOps前身是Visual Studio Team Services(VSTS),從2018年9月10日開始,VSTS改名為Azure DevOps,原來VSTS所提供的服務(wù)也作了相應(yīng)的調(diào)整。有關(guān)Azure DevOps的介紹,可以參考https://azure.microsoft.com/en-us/blog/introducing-azure-devops/。
容器化應(yīng)用程序的CI/CD流程
下圖展示了基于微軟技術(shù)架構(gòu)的容器化應(yīng)用程序的CI/CD流程:
大致流程如下:
開發(fā)人員通過Visual Studio Team Services Backlog(也就是最新的Azure Boards)獲取一些開發(fā)任務(wù)
開發(fā)人員使用Visual Studio進行應(yīng)用程序開發(fā)
開發(fā)的代碼保存在Visual Studio Team Services Git(也就是最新的Azure Repos)
Visual Studio Team Services CI(也就是最新的Azure Pipelines)從代碼庫獲取代碼,進行編譯和持續(xù)集成
編譯產(chǎn)生的容器被推送到Azure Container Registry
Visual Studio Team Services CD(也就是最新的Azure Pipelines)觸發(fā)持續(xù)部署,從Azure Container Registry獲取容器鏡像,然后部署到Azure Container Service中(這里使用托管的Kubernetes服務(wù)作為例子)
Azure Application Insights對運行的應(yīng)用程序進行跟蹤分析,并將結(jié)果反饋給開發(fā)人員
開發(fā)人員將結(jié)果記錄到Visual Studio Team Services Backlog(也就是最新的Azure Boards)中
這個過程還是比較容易理解的。圖片來自https://azure.microsoft.com/en-us/solutions/architecture/cicd-for-containers/。對于tasklist而言,我所采用的持續(xù)集成/持續(xù)部署方案跟上圖流程差不多,所不同的是,我沒有使用Azure Repos,而是使用眾所周知的GitHub,我也沒有使用Azure Container Registry,而是使用Docker Hub。接下來,我們一起了解一下Azure DevOps Pipeline持續(xù)集成的配置過程。
基于Azure DevOps為tasklist搭建持續(xù)集成環(huán)境
首先使用你的微軟賬號(Microsoft Account)登錄Azure DevOps,默認還是會進入經(jīng)典的VSTS界面,此時點擊屏幕右上角的大頭貼圖標(biāo),選擇Preview features:
然后在Preview features中打開New Navigation選項即可進入Azure DevOps的新界面:
接下來,我們可以點擊界面右上角的Create project按鈕來創(chuàng)建一個新的項目。在創(chuàng)建新項目的界面中,輸入項目名稱和描述,然后決定是否公開該項目,之后在Advanced部分可以選擇版本控制方案(Git或者Team Foundation Version Control),并且選擇一個開發(fā)流程。這里我將項目命名為tasklist-demo,版本控制方案使用Git,開發(fā)流程就選擇Agile(其實在我們的案例中,這并不重要)。一切就緒之后,點擊Create按鈕創(chuàng)建項目。
項目創(chuàng)建成功之后,就自動進入了如上圖所示的項目儀表板(Dashboard),此時我們可以在Boards里創(chuàng)建一些開發(fā)任務(wù),然后通過Repos界面來初始化我們的代碼庫。不過,這兩個步驟我們都不需要做,因為我們的代碼已經(jīng)在GitHub中了,我們可以直接進入Pipelines,定義我們的項目構(gòu)建過程。
在Pipelines項目下,點擊Builds,然后點擊New pipeline按鈕。在創(chuàng)建Build Pipeline的第一步,需要選擇代碼來源。Azure DevOps提供各種選擇:Azure Repos Git、GitHub、GitHub Enterprise、Subvision、Bitbucket Cloud以及External Git。對于tasklist而言,我們選擇使用GitHub。此時,如果你還沒有創(chuàng)建GitHub連接,則需要新建一個。如下圖指定GitHub連接的名稱,然后通過OAuth或者GitHub訪問token進行安全認證:
在認證成功后,即可選擇需要編譯的代碼庫,并指定需要編譯的代碼所在的分支(Branch)。在一切就緒后,點擊Continue按鈕繼續(xù):
接下來,在Select a template頁面中,點擊Empty job來創(chuàng)建一個空的構(gòu)建任務(wù),當(dāng)然,也可以根據(jù)需要,在預(yù)定的構(gòu)建模板中進行選擇
在新建的Buid Pipeline中,可以看到,所有操作的第一步就是獲取源代碼,這一步已經(jīng)在上面定義好了,不過還可以在這個界面中進行一些高級設(shè)置,比如可以指定在簽出代碼時,將submodule也同時簽出
我們需要關(guān)注的就是Agent Job,一個Build Pipeline中,可以包含多個Agent Job,也就是執(zhí)行過程需要Build Agent支持的Job;也可以包含多個Agentless Job,也就是執(zhí)行過程不需要Build Agent支持的Job。Agent Job的執(zhí)行需要依賴某種環(huán)境,比如托管的Linux環(huán)境,或者是裝有VS2017的Windows環(huán)境。而Agentless Job的執(zhí)行則不需要這樣的環(huán)境,比如,調(diào)用RESTful API,或者設(shè)置一個定時器,延遲后續(xù)Job的執(zhí)行等。對于tasklist而言,我們需要一個Linux的環(huán)境來執(zhí)行Docker容器構(gòu)建,因此,可以選擇Hosted Ubuntu 1604的Agent Pool,于是,當(dāng)代碼構(gòu)建開始執(zhí)行時,Azure DevOps會從Hosted Ubuntu 1604的Agent池中,選擇一個Agent執(zhí)行構(gòu)建
接下來,在這個新建的Agent Job中,點擊加號(+),然后在列出的所有任務(wù)模板中,選擇Docker Compose,并點擊Add按鈕,將它添加到Agent的任務(wù)中。事實上,Azure DevOps Pipelines提供了非常多的任務(wù)模板,比如,你可以選擇一個執(zhí)行單元測試的模板并將其添加到Agent Job中,然后根據(jù)自己的需要,配置單元測試的運行參數(shù),這樣的話,Agent Job就能幫你完成單元測試
在定義Docker Compose Command的界面中,注意將Container Registry Type切換為Container Registry,然后通過點擊New按鈕,新建一個Docker Registry連接。由于我們選用Docker Hub作為Registry,因此,選擇Docker Hub,填上自己的賬號和密碼后,確認能夠連接就可以了:
在Docker Compose File文本框中,輸入tasklist代碼庫中docker-compose.yml文件的路徑,也可以點擊“…“按鈕,在彈出的對話框中選擇該文件:
在Action下拉框中,指定所執(zhí)行的操作為Build service images,然后,在Additional Image Tags中,可以指定$(Build.BuildNumber),表示使用當(dāng)前的構(gòu)建編號為構(gòu)建產(chǎn)生的容器鏡像打上tag,同時可以選擇Include Latest Tag選項,表示當(dāng)前構(gòu)建的容器鏡像為最新版本(打上latest Tag)。完成這部分設(shè)置之后,參數(shù)大致如下:
在完成了上述步驟之后,我們已經(jīng)可以完成整個tasklist App的編譯了??梢钥吹?#xff0c;在Azure DevOps中設(shè)置Build Pipeline進行代碼編譯是非常簡單的。由于我們已經(jīng)定義了用于代碼編譯的Docker Compose文件,所以,只需要在Pipeline中添加一個Docker Compose的編譯任務(wù)即可?,F(xiàn)在測試一下,看看編譯是否能夠成功完成:
到目前為止,我們只是成功編譯了tasklist的容器鏡像,還沒有將鏡像推送到Docker Hub。在容器鏡像被推送到Docker Hub之后,我們才能夠?qū)⑷萜鞑渴鸬紸zure Container Service中運行。要推送編譯好的容器鏡像,只需要重復(fù)以上6到10步,在Agent Job下再添加一個Docker Compose的任務(wù),所不同的是,Action需要修改為Push service images,保持其它配置不變。保存完P(guān)ipeline之后,再次觸發(fā)編譯:
打開Docker Hub,看看鏡像是否已經(jīng)成功推送:
最后一步,就是要將tasklist代碼庫中的yml文件作為編譯結(jié)果(Artifacts)公布出來,這樣做是為了在下一步做Azure Kubernetes Service(AKS)部署的時候,能夠獲取到部署的定義文件并根據(jù)該文件的內(nèi)容進行部署。使用上述第6步的方法,添加一個Copy Files的任務(wù)和一個Publish Build Artifacts的任務(wù)。Copy Files的任務(wù)設(shè)置如下:
Publish Build Artifacts的任務(wù)設(shè)置如下:
再次啟動Build Pipeline,可以看到,tasklist已經(jīng)成功編譯:
所需的編譯結(jié)果文件(yml文件)也復(fù)制成功:
在Triggers頁面,可以選擇Enable continuous integration選項,此時每當(dāng)有新的代碼簽入代碼庫,就會觸發(fā)一次新的構(gòu)建。當(dāng)然,還有一些高級選項,比如選擇代碼分支等,還可以啟用Pull request validation,這些內(nèi)容與持續(xù)集成的流程有關(guān),我們可以在今后學(xué)習(xí),在這里,我們先勾選Enable continuous integration選項
總結(jié)
本文首先簡單介紹了容器化應(yīng)用程序的CI/CD流程,然后基于Azure DevOps,為tasklist案例建立了一個Build Pipeline,成功完成了tasklist App的編譯以及Docker容器鏡像的發(fā)布,最后,啟用了持續(xù)集成功能,使得每次代碼變更提交都會觸發(fā)CI過程。這部分設(shè)置與開發(fā)過程以及持續(xù)集成的流程有關(guān),不同的項目進行持續(xù)集成的方式也會有所不同,我們可以單獨在其它篇章中進行深入討論學(xué)習(xí)。在接下來的第三部分,讓我們一起看看,如何把編譯好的tasklist容器部署到Azure Kubernetes Service中。
相關(guān)文章:
ASP.NET Core應(yīng)用程序容器化、持續(xù)集成與Kubernetes集群部署(一)
微軟發(fā)布Azure Pipelines,開源項目可無限制使用CI/CD
持續(xù)集成配置之Nuget
原文地址:?http://sunnycoding.cn/2018/10/09/dockerize-aspnetcore-cicd-with-azure-devops-and-kubernetes-part2/
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core Agent
- 下一篇: .Net Core 2.1 通用主机(C