使用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鏡像,如果推送鏡像,如果部署鏡像,那么請看下篇吧。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM