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

上次介紹了Azure Application Insights,實現了.net core程式的監控功能。這次讓我們來看看Azure DevOps Pipeline功能。Azure DevOps Pipeline 是Azure DevOps裡面的一個組件,對於12個月試用帳號同樣永久免費。

Uyf6xI.png

持續集成CI

持續集成指的是,頻繁地(一天多次)將程式碼集成到主幹。
它的好處主要有兩個。

(1)快速發現錯誤。每完成一點更新,就集成到主幹,可以快速發現錯誤,定位錯誤也比較容易。

(2)防止分支大幅偏離主幹。如果不是經常集成,主幹又在不斷更新,會導致以後集成的難度變大,甚至難以集成。

持續集成的目的,就是讓產品可以快速迭代,同時還能保持高品質。它的核心措施是,程式碼集成到主幹之前,必須通過自動化測試。只要有一個測試用例失敗,就不能集成。
Martin Fowler說過,”持續集成並不能消除Bug,而是讓它們非常容易發現和改正。”
摘自阮一峰大神的blog

DevOps跟CI就不多介紹了。這裡我們定個目標:當我們提交程式碼後,伺服器自動編譯程式碼,自動運行單元測試,自動發送成功失敗的郵件。

創建組織

Uy0G8S.png

開通Azure DevOps功能,第一步需要創建一個組織。
Uy0gKJ.png

隨便取個組織名稱,區域還是那個套路,選近的,這裡選東亞。
UyB9xg.png

創建倉庫

點擊繼續之後頁面會跳轉到正式的Azure DevOps介面。首先需要創建一個項目。這裡跟Github一樣,需要選擇私有還有公開,估計Azure DevOps後端其實就是使用了Github的服務。這裡選一個私有的吧,取個項目名稱:devop_test ,還可以設置用戶名密碼等資訊。
UyBuzF.png

創建ASP.NET MVC項目

新建一個ASP.NET MVC項目,就默認的示例項目就行。

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

第二步:選擇剛才的devop_test倉庫。
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

下面這圖就表示任務執行成功了。每一步綠色的勾勾,還有執行了幾秒都會顯示出來。還可以看更加詳細的日誌。

UyDWh6.png

這個介面表示運行的單元測試的結果。成功了幾個,失敗了幾個,表示的都很清楚。
UyD6B9.png

成功之後你的賬戶郵箱還會收到郵件通知,成功是綠色的。
Uy6B5R.png

前面都是成功的,我們故意把程式碼寫個錯誤,然後直接提交程式碼,看看build能不能過。


        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55) //error ,去掉了一個逗號
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }

改完程式碼後提交上去。可以看到任務會自己執行,然後過一會出現了一個紅色的X。果然pipeline報錯了。點擊任務可以看到更加詳細的錯誤列表。
Uy67xf.md.png

同時也受到了失敗的郵件通知。
Uy6qsS.png

總結

這次我們通過Azure DevOps Pipeline簡單演示了CI的整個過程。我們成功實現了一開始定的小目標:寫程式碼>提交程式碼>編譯>運行測試>發送通知。除了yml配置有點麻煩,整過過程也都是很簡單,而且是這個功能都是免費的。Azure DevOps pipeline除了CI,顯然還能實現CD,如何編譯docker鏡像,如果推送鏡像,如果部署鏡像,那麼請看下篇吧。

關注我的公眾號一起玩轉技術

Tags: