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


上一次我們講了使用Azure DevOps Pipeline實現.Net Core程序的CI。這次我們來演示下如何使用Azure DevOps實現.Net Core程序的CD。

實現本次目標我們除了Azure DevOps外還需要:

  1. 一台安裝了Docker的主機
  2. 一個 Docker Hub 賬號

上一次我們的CI實現了:
發布>編譯>單元測試
這次我們要實現剩下的幾個步驟:
生成鏡像>推送鏡像>部署

創建Docker鏡像倉庫

我們生成的鏡像需要有個存放的地方。各大雲廠商其實都有這種服務,這次直接使用Docker Hub提供的公共倉庫服務。
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

配置Docker Registry service

我們的pipeline需要給Docker hub推送鏡像,所以需要一些必要的信息,比如賬號密碼等信息。
wG8uE4.png
點擊"New Service"找到Docker Register項目點擊下一步

w8E5rt.png
選擇DockerHub,填寫對應的賬號密碼

配置SSH service

我們的pipeline在完成鏡像推送后需要通過SSH登錄到主機運行命令把新的鏡像跑起來。
w85NRA.png
填寫主機IP端口等信息。

修改pipeline

上次我們的pipeline已經定義好了CI的步驟,這次需要在上次的基礎上繼續完善CD的功能。

BuildAndPush Task

找到上次的pipeline選擇編輯功能,在右邊的Task列表里找到DockerTask,點擊出現配置界面
wGJsHS.png
在Container register里選擇前面在service connections配置的docker-hub服務。

repository填寫我們在docker hub上新建的倉庫:kklldog/az_devop_test 。注意:倉庫名稱要把用戶名寫全了不然推不上去。

tags填寫:latest 。

command:選擇buildAndPush 。build跟push本是兩步操作,這里直接合並為一步。

w85tGd.png

SSH Task

添加完BuildAndPush Task后同樣的方法再次添加SSH Task。
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
訪問一下容器對應的端口,我們的網站已經可以訪問了。修改一下代碼,然后提交,每次都會自動部署最新的代碼到主機。
wGUSbV.png

總結

以上通過2篇文章簡單的介紹了Azure DevOps Pipeline如何實現CICD功能。Azure DevOps Pipeline給我的感覺是比較易用的,配置yml其實都是圖形化的上手難度會比較小。另外它跟Github有深入的集成,可以使用Github的賬號直接登錄。況且它還是個免費服務,大家可以試試。

關注公眾號一起玩轉技術


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM