1. 程式人生 > >使用Azure DevOps Pipeline實現.Net Core程式的CD

使用Azure DevOps Pipeline實現.Net Core程式的CD

上一次我們講了[使用Azure DevOps Pipeline實現.Net Core程式的CI](https://www.cnblogs.com/kklldog/p/azure-devops-pipeline.html)。這次我們來演示下如何使用Azure DevOps實現.Net Core程式的CD。 實現本次目標我們除了Azure DevOps外還需要: 1. 一臺安裝了Docker的主機 2. 一個 Docker Hub 賬號 上一次我們的CI實現了: **釋出**>**編譯**>**單元測試** 這次我們要實現剩下的幾個步驟: **生成映象**>**推送映象**>**部署** ## 建立Docker映象倉庫 我們生成的映象需要有個存放的地方。各大雲廠商其實都有這種服務,這次直接使用Docker Hub提供的公共倉庫服務。 ![w8IEOP.png](https://s1.ax1x.com/2020/09/10/w8IEOP.png) 建立一個倉庫名叫:az_devop_test。 ## 建立Dockerfile 我們的程式碼建立為映象需要一個Dockerfile來描述如何構建這個映象。在專案根目錄下新建一個檔案命名為Dockerfile注意不帶任何字尾名。以下為Dockerfile的內容: ``` FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build WORKDIR /app COPY /. /app RUN dotnet restore WORKDIR /app/devops_test RUN dotnet publish -o ./out -c Release EXPOSE 5000 ENTRYPOINT ["dotnet", "out/devops_test.dll"] ``` ## 配置Servic Connections 選擇ProjectSetting選單,選擇Service connections。Service connections用來儲存跟外部服務相關的賬號密碼等資訊,這裡我們需要配置2個service。 1. Docker Hub的資訊 2. 主機SSH的資訊 ![w8E7a8.png](https://s1.ax1x.com/2020/09/09/w8E7a8.png) ### 配置Docker Registry service 我們的pipeline需要給Docker hub推送映象,所以需要一些必要的資訊,比如賬號密碼等資訊。 ![wG8uE4.png](https://s1.ax1x.com/2020/09/10/wG8uE4.png) 點選"New Service"找到Docker Register專案點選下一步 ![w8E5rt.png](https://s1.ax1x.com/2020/09/09/w8E5rt.png) 選擇DockerHub,填寫對應的賬號密碼 ### 配置SSH service 我們的pipeline在完成映象推送後需要通過SSH登入到主機執行命令把新的映象跑起來。 ![w85NRA.png](https://s1.ax1x.com/2020/09/10/w85NRA.png) 填寫主機IP埠等資訊。 ## 修改pipeline 上次我們的pipeline已經定義好了CI的步驟,這次需要在上次的基礎上繼續完善CD的功能。 ### BuildAndPush Task 找到上次的pipeline選擇編輯功能,在右邊的Task列表裡找到DockerTask,點擊出現配置介面 ![wGJsHS.png](https://s1.ax1x.com/2020/09/10/wGJsHS.png) 在Container register裡選擇前面在service connections配置的docker-hub服務。 repository填寫我們在docker hub上新建的倉庫:kklldog/az_devop_test 。注意:倉庫名稱要把使用者名稱寫全了不然推不上去。 tags填寫:latest 。 command:選擇buildAndPush 。build跟push本是兩步操作,這裡直接合併為一步。 ![w85tGd.png](https://s1.ax1x.com/2020/09/10/w85tGd.png) ### SSH Task 新增完BuildAndPush Task後同樣的方法再次新增SSH Task。 ![w85YPH.png](https://s1.ax1x.com/2020/09/10/w85YPH.png) SSH service connection裡選擇前面我們配置好的ssh service。 Run 這裡選擇Commands。 Commands 填寫需要執行的命令: ``` docker rm -f az_devop_test docker rmi -f kklldog/az_devop_test docker pull kklldog/az_devop_test docker run -d -p 5000:5000 --name az_devop_test kklldog/az_devop_test ``` 簡單解釋下這個命令: 刪除執行的容器;刪除映象;拉取最新的映象;使用新的映象執行一個容器。 ## 完整的pipeline 到此我們的pipeline已經配置好了,以下是完整的pipeline.yml程式碼。 ``` # ASP.NET Core (.NET Framework) # Build and test ASP.NET Core projects targeting the full .NET Framework. # Add steps that publish symbols, save build artifacts, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core trigger: - master pool: vmImage: 'ubuntu-18.04' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' steps: - task: DotNetCoreCLI@2 inputs: command: 'restore' - task: DotNetCoreCLI@2 displayName: Build inputs: command: build projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 inputs: command: test projects: '**/*Tests/*.csproj' arguments: '--configuration $(buildConfiguration)' - task: Docker@2 inputs: containerRegistry: 'docker-hub' repository: 'kklldog/az_devop_test' command: 'buildAndPush' Dockerfile: '**/Dockerfile' tags: latest - task: SSH@0 inputs: sshEndpoint: 'azvm-ssh' runOptions: 'commands' commands: | docker rm -f az_devop_test docker rmi -f kklldog/az_devop_test docker pull kklldog/az_devop_test docker run -d -p 5000:5000 --name az_devop_test kklldog/az_devop_test readyTimeout: '20000' ``` ## 執行一下 手動執行一個這個pipeline,點選pipeline可以看到實時的日誌,等到最後可以看到每一步都成功了,說明我們的pipeline配置成功了。 ![w85n2R.png](https://s1.ax1x.com/2020/09/10/w85n2R.png) 訪問一下容器對應的埠,我們的網站已經可以訪問了。修改一下程式碼,然後提交,每次都會自動部署最新的程式碼到主機。 ![wGUSbV.png](https://s1.ax1x.com/2020/09/10/wGUSbV.png) ## 總結 以上通過2篇文章簡單的介紹了Azure DevOps Pipeline如何實現CICD功能。Azure DevOps Pipeline給我的感覺是比較易用的,配置yml其實都是圖形化的上手難度會比較小。另外它跟Github有深入的整合,可以使用Github的賬號直接登入。況且它還是個免費服務,大家可以試試。 ##關注公眾號一起玩轉技術 ![](https://s1.ax1x.com/2020/06/29/NfQjds.jpg)