上一次我們講了使用Azure DevOps Pipeline實現.Net Core程序的CI。這次我們來演示下如何使用Azure DevOps實現.Net Core程序的CD。
實現本次目標我們除了Azure DevOps外還需要:
- 一台安裝了Docker的主機
- 一個 Docker Hub 賬號
上一次我們的CI實現了:
發布>編譯>單元測試
這次我們要實現剩下的幾個步驟:
生成鏡像>推送鏡像>部署
創建Docker鏡像倉庫
我們生成的鏡像需要有個存放的地方。各大雲廠商其實都有這種服務,這次直接使用Docker Hub提供的公共倉庫服務。
創建一個倉庫名叫: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。
- Docker Hub的信息
- 主機SSH的信息
配置Docker Registry service
我們的pipeline需要給Docker hub推送鏡像,所以需要一些必要的信息,比如賬號密碼等信息。
點擊"New Service"找到Docker Register項目點擊下一步
選擇DockerHub,填寫對應的賬號密碼
配置SSH service
我們的pipeline在完成鏡像推送后需要通過SSH登錄到主機運行命令把新的鏡像跑起來。
填寫主機IP端口等信息。
修改pipeline
上次我們的pipeline已經定義好了CI的步驟,這次需要在上次的基礎上繼續完善CD的功能。
BuildAndPush Task
找到上次的pipeline選擇編輯功能,在右邊的Task列表里找到DockerTask,點擊出現配置界面
在Container register里選擇前面在service connections配置的docker-hub服務。
repository填寫我們在docker hub上新建的倉庫:kklldog/az_devop_test 。注意:倉庫名稱要把用戶名寫全了不然推不上去。
tags填寫:latest 。
command:選擇buildAndPush 。build跟push本是兩步操作,這里直接合並為一步。
SSH Task
添加完BuildAndPush Task后同樣的方法再次添加SSH Task。
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配置成功了。
訪問一下容器對應的端口,我們的網站已經可以訪問了。修改一下代碼,然后提交,每次都會自動部署最新的代碼到主機。
總結
以上通過2篇文章簡單的介紹了Azure DevOps Pipeline如何實現CICD功能。Azure DevOps Pipeline給我的感覺是比較易用的,配置yml其實都是圖形化的上手難度會比較小。另外它跟Github有深入的集成,可以使用Github的賬號直接登錄。況且它還是個免費服務,大家可以試試。