使用Azure DevOps Pipeline实现.Net Core程序的CI
上次介紹了Azure Application Insights,實(shí)現(xiàn)了.net core程序的監(jiān)控功能。這次讓我們來看看Azure DevOps Pipeline功能。Azure DevOps Pipeline 是Azure DevOps里面的一個(gè)組件,對于12個(gè)月試用賬號同樣永久免費(fèi)。
持續(xù)集成CI
持續(xù)集成指的是,頻繁地(一天多次)將代碼集成到主干。它的好處主要有兩個(gè)。
(1)快速發(fā)現(xiàn)錯(cuò)誤。每完成一點(diǎn)更新,就集成到主干,可以快速發(fā)現(xiàn)錯(cuò)誤,定位錯(cuò)誤也比較容易。 (2)防止分支大幅偏離主干。如果不是經(jīng)常集成,主干又在不斷更新,會(huì)導(dǎo)致以后集成的難度變大,甚至難以集成。持續(xù)集成的目的,就是讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量。它的核心措施是,代碼集成到主干之前,必須通過自動(dòng)化測試。只要有一個(gè)測試用例失敗,就不能集成。Martin Fowler說過,"持續(xù)集成并不能消除Bug,而是讓它們非常容易發(fā)現(xiàn)和改正。"
摘自阮一峰大神的blog
DevOps跟CI就不多介紹了。這里我們定個(gè)目標(biāo):當(dāng)我們提交代碼后,服務(wù)器自動(dòng)編譯代碼,自動(dòng)運(yùn)行單元測試,自動(dòng)發(fā)送成功失敗的郵件。
創(chuàng)建組織
開通Azure DevOps功能,第一步需要?jiǎng)?chuàng)建一個(gè)組織。
隨便取個(gè)組織名稱,區(qū)域還是那個(gè)套路,選近的,這里選東亞。
創(chuàng)建倉庫
點(diǎn)擊繼續(xù)之后頁面會(huì)跳轉(zhuǎn)到正式的Azure DevOps界面。首先需要?jiǎng)?chuàng)建一個(gè)項(xiàng)目。這里跟Github一樣,需要選擇私有還有公開,估計(jì)Azure DevOps后端其實(shí)就是使用了Github的服務(wù)。這里選一個(gè)私有的吧,取個(gè)項(xiàng)目名稱:devop_test ,還可以設(shè)置用戶名密碼等信息。
創(chuàng)建ASP.NET MVC項(xiàng)目
新建一個(gè)ASP.NET MVC項(xiàng)目,就默認(rèn)的示例項(xiàng)目就行。
為了讓pipeline執(zhí)行單元測試,所以我們新建一個(gè)單元測試功能,然后寫一個(gè)最簡單的單元測試方法。
[TestClass()]public class WeatherForecastControllerTests{[TestMethod()]public void GetTest(){var ctrl = new WeatherForecastController(null);var result = ctrl.Get();Assert.IsNotNull(result);}}上傳代碼到倉庫
有了代碼之后我們要把代碼傳到倉庫里去。就是使用上面的倉庫的地址、用戶名、密碼。這是git的問題了,不多說了。那么上面是一些準(zhǔn)備工作,下面開始正式使用pipeline。
配置Pipeline
點(diǎn)擊左側(cè)的pipeline菜單,開始配置pipeline的導(dǎo)航。
第一步:需要配置代碼倉庫,選擇剛才的Azure Repos Git。當(dāng)然它還支持從Github或者別的地方拉代碼。
第二步:選擇剛才的devop_test倉庫。
第三步:開始配置yml。這個(gè)yml呢其實(shí)跟docker-compose的配置啊,dockerfile啊一樣,就是配置了一些列的任務(wù)(task)。
trigger: - master pool:vmImage: 'ubuntu-18.04' variables:solution: '**/*.sln'buildPlatform: 'Any CPU'buildConfiguration: 'Release' steps: - task: DotNetCoreCLI@2inputs:command: 'restore' - task: DotNetCoreCLI@2displayName: Buildinputs:command: buildprojects: '**/*.csproj'arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2inputs:command: testprojects: '**/*Tests/*.csproj'arguments: '--configuration $(buildConfiguration)'大概講下這個(gè)yml配置了啥。
trigger:表示代碼的分支
vmImage:表示虛擬機(jī)的環(huán)境,是win還是linux。
variables:定義了一些參數(shù),后面的設(shè)置可以直接使用。
steps:步驟,里面每一個(gè)task就是一個(gè)步驟。
task:
command: 'restore' nuget包還原。
command: 'build' 編譯代碼。
command: 'test' 運(yùn)行單元測試。
配置好yml之后點(diǎn)擊“SAVE AND RUN”就會(huì)執(zhí)行第一次pipeline的任務(wù)。運(yùn)行之后任務(wù)會(huì)先進(jìn)入隊(duì)列,等待一會(huì)就能看到任務(wù)是否執(zhí)行成功了。
下面這圖就表示任務(wù)執(zhí)行成功了。每一步綠色的勾勾,還有執(zhí)行了幾秒都會(huì)顯示出來。還可以看更加詳細(xì)的日志。
這個(gè)界面表示運(yùn)行的單元測試的結(jié)果。成功了幾個(gè),失敗了幾個(gè),表示的都很清楚。
成功之后你的賬戶郵箱還會(huì)收到郵件通知,成功是綠色的。
前面都是成功的,我們故意把代碼寫個(gè)錯(cuò)誤,然后直接提交代碼,看看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 ,去掉了一個(gè)逗號Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();}改完代碼后提交上去。可以看到任務(wù)會(huì)自己執(zhí)行,然后過一會(huì)出現(xiàn)了一個(gè)紅色的X。果然pipeline報(bào)錯(cuò)了。點(diǎn)擊任務(wù)可以看到更加詳細(xì)的錯(cuò)誤列表。
同時(shí)也受到了失敗的郵件通知。
總結(jié)
這次我們通過Azure DevOps Pipeline簡單演示了CI的整個(gè)過程。我們成功實(shí)現(xiàn)了一開始定的小目標(biāo):寫代碼>提交代碼>編譯>運(yùn)行測試>發(fā)送通知。除了yml配置有點(diǎn)麻煩,整個(gè)過程也都是很簡單,而且是這個(gè)功能都是免費(fèi)的。Azure DevOps pipeline除了CI,顯然還能實(shí)現(xiàn)CD,如何編譯docker鏡像,如果推送鏡像,如果部署鏡像,那么請看下篇吧。
關(guān)注我的公眾號一起玩轉(zhuǎn)技術(shù)???
總結(jié)
以上是生活随笔為你收集整理的使用Azure DevOps Pipeline实现.Net Core程序的CI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dotNET:怎样处理程序中的异常(理论
- 下一篇: Blazor带我重玩前端(四)