使用Azure DevOps Pipeline實現.Net Core程式的CI
阿新 • • 發佈:2020-07-20
上次介紹了Azure Application Insights,實現了.net core程式的監控功能。這次讓我們來看看Azure DevOps Pipeline功能。Azure DevOps Pipeline 是Azure DevOps裡面的一個元件,對於12個月試用賬號同樣永久免費。
![Uyf6xI.png](https://s1.ax1x.com/2020/07/17/Uyf6xI.png)
## 持續整合CI
持續整合指的是,頻繁地(一天多次)將程式碼整合到主幹。
它的好處主要有兩個。
```
(1)快速發現錯誤。每完成一點更新,就整合到主幹,可以快速發現錯誤,定位錯誤也比較容易。
(2)防止分支大幅偏離主幹。如果不是經常整合,主幹又在不斷更新,會導致以後整合的難度變大,甚至難以整合。
```
持續整合的目的,就是讓產品可以快速迭代,同時還能保持高質量。它的核心措施是,程式碼整合到主幹之前,必須通過自動化測試。只要有一個測試用例失敗,就不能整合。
Martin Fowler說過,"持續整合並不能消除Bug,而是讓它們非常容易發現和改正。"
*[摘自阮一峰大神的blog](http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html)*
DevOps跟CI就不多介紹了。這裡我們定個目標:當我們提交程式碼後,伺服器自動編譯程式碼,自動執行單元測試,自動傳送成功失敗的郵件。
## 建立組織
![Uy0G8S.png](https://s1.ax1x.com/2020/07/17/Uy0G8S.png)
開通Azure DevOps功能,第一步需要建立一個組織。
![Uy0gKJ.png](https://s1.ax1x.com/2020/07/17/Uy0gKJ.png)
隨便取個組織名稱,區域還是那個套路,選近的,這裡選東亞。
![UyB9xg.png](https://s1.ax1x.com/2020/07/17/UyB9xg.png)
## 建立倉庫
點選繼續之後頁面會跳轉到正式的Azure DevOps介面。首先需要建立一個專案。這裡跟Github一樣,需要選擇私有還有公開,估計Azure DevOps後端其實就是使用了Github的服務。這裡選一個私有的吧,取個專案名稱:devop_test ,還可以設定使用者名稱密碼等資訊。
![UyBuzF.png](https://s1.ax1x.com/2020/07/17/UyBuzF.png)
## 建立ASP.NET MVC專案
新建一個ASP.NET MVC專案,就預設的示例專案就行。
![UyBXy4.png](https://s1.ax1x.com/2020/07/17/UyBXy4.png)
為了讓pipeline執行單元測試,所以我們新建一個單元測試功能,然後寫一個最簡單的單元測試方法。
```
[TestClass()]
public class WeatherForecastControllerTests
{
[TestMethod()]
public void GetTest()
{
var ctrl = new WeatherForecastController(null);
var result = ctrl.Get();
Assert.IsNotNull(result);
}
}
```
## 上傳程式碼到倉庫
有了程式碼之後我們要把程式碼傳到倉庫裡去。就是使用上面的倉庫的地址、使用者名稱、密碼。這是git的問題了,不多說了。那麼上面是一些準備工作,下面開始正式使用pipeline。
## 配置Pipeline
點選左側的pipeline選單,開始配置pipeline的導航。
第一步:需要配置程式碼倉庫,選擇剛才的Azure Repos Git。當然它還支援從Github或者別的地方拉程式碼。
![UyBUzD.png](https://s1.ax1x.com/2020/07/17/UyBUzD.png)
第二步:選擇剛才的devop_test倉庫。
![UyDukt.png](https://s1.ax1x.com/2020/07/17/UyDukt.png)
第三步:開始配置yml。這個yml呢其實跟docker-compose的配置啊,dockerfile啊一樣,就是配置了一些列的任務(task)。
```
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)'
```
大概講下這個yml配置了啥。
trigger:表示程式碼的分支
vmImage:表示虛擬機器的環境,是win還是linux。
variables:定義了一些引數,後面的設定可以直接使用。
steps:步驟,裡面每一個task就是一個步驟。
task:
command: 'restore' nuget包還原。
command: 'build' 編譯程式碼。
command: 'test' 執行單元測試。
配置好yml之後點選“SAVE AND RUN”就會執行第一次pipeline的任務。執行之後任務會先進入佇列,等待一會就能看到任務是否執行成功了。
![UyDt7n.png](https://s1.ax1x.com/2020/07/17/UyDt7n.png)
下面這圖就表示任務執行成功了。每一步綠色的勾勾,還有執行了幾秒都會顯示出來。還可以看更加詳細的日誌。
![UyDWh6.png](https://s1.ax1x.com/2020/07/17/UyDWh6.png)
這個介面表示執行的單元測試的結果。成功了幾個,失敗了幾個,表示的都很清楚。
![UyD6B9.png](https://s1.ax1x.com/2020/07/17/UyD6B9.png)
成功之後你的賬戶郵箱還會收到郵件通知,成功是綠色的。
![Uy6B5R.png](https://s1.ax1x.com/2020/07/17/Uy6B5R.png)
前面都是成功的,我們故意把程式碼寫個錯誤,然後直接提交程式碼,看看build能不能過。
```
[HttpGet]
public IEn