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

来源:https://www.cnblogs.com/kklldog/archive/2020/07/20/azure-devops-pipeline.html
-Advertisement-
Play Games

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


上次介紹了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鏡像,如果推送鏡像,如果部署鏡像,那麼請看下篇吧。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在寫這篇文章時,我是滿懷感激與賞識之情的。 來誇一個人,講一個道理,寫給大家,也是寫給自己。 來自讀者的反饋 先說說事情的經過。 新書出版之後,昨天第一次看到(抱歉看到的比較晚)讀者的反饋。所謂反饋就是在書中留了GitHub的地址,如果書中有錯誤的地方,讀者可以通過該鏈接提交Issues(問題),來 ...
  • 之前只是很模糊的知道其意思:在request scope中,每個request創建一個新的bean;在session scope中,同一session中的bean都是一樣的。但是不知道怎麼用代碼去驗證它,今天可找到驗證它的代碼了。 ...
  • 隊列實質就是一種存儲數據的結構 通常用鏈表或者數組實現 一般而言隊列具備FIFO先進先出的特性,當然也有雙端隊列(Deque)優先順序隊列 主要操作:入隊(EnQueue)與出隊(Dequeue) BlockingQueue 隊列實質就是一種存儲數據的結構 通常用鏈表或者數組實現 一般而言隊列具備FI ...
  • 1 以前在github發開源項目,都因為懶,從來不構建到中央倉庫。最近因為其他人要用,聯繫我。希望可以發到中央倉庫。我想,不就是mvn deploy嘛,開搞。一圈弄下來,發現真沒那麼簡單。當中遇到了無數的坑,讓我每一次都心裡默默念到,發個項目,為何如此痛苦。 現將痛苦的過程詳細記錄下來。希望可以幫助 ...
  • JDBC中 execute與executeUpdate的區別 execute與executeUpdate的區別 步驟 1 : 相同點 execute與executeUpdate的相同點:都可以執行增加,刪除,修改 package jdbc; import java.sql.Connection; i ...
  • 第十三章 高級引用和指針 13.1按引用傳遞以提高效率 ​ 每次將值按對象傳入函數是,都將創建該對象的一個備份。每次按值從函數返回一個對象時,也將創建其備份。 ​ 對於用戶創建的大型對象,備份的代價很高。這將增加程式占用的記憶體量,而程式的運行速度將更慢。 ​ 在棧中,用戶創建的對象的大小為其成員變數 ...
  • 在某乎上看到一個問題,《30歲學軟體測試來得及嗎?》 問題:之前一直在工廠上班,看不到希望。已經30歲了,想轉學軟體測試來得及嗎? 同樣類型的問題,還有“我是大專學歷,學軟體測試能找到工作不?”“我是女生,軟體測試學起來難麽?”每天都會遇到很多同學有這些困惑,看看測試同仁對這件事是怎麼看的? 其中有 ...
  • 學習使用的環境:Win10,Python3.6,PyCharm Community Edition ,Django 2.2.12。 創建步驟: 1)安裝創建Django項目: 打開windows命令提示符: 安裝Django庫:pip install django==2.2.12 -i https: ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...