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