使用Azure DevOps Pipeline實現.Net Core程式的CD
阿新 • • 發佈:2020-09-10
上一次我們講了[使用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)