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

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

上次介紹了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