.net持續整合cake篇之cake介紹及簡單示例

周國通發表於2019-07-18

cake介紹

Cake 是.net平臺下的一款自動化構建工具,可以完成對.net專案的編譯,打包,執行單元測試,整合測試甚至釋出專案等等.如果有些特徵Cake沒有實現,我們還可以很容易地通過擴充套件Cake來實現我們想要的功能.

Cake有以下特點

1) 使用c#語言編寫,可以在Cake指令碼里使用C#語言來實現我們想要達到的功能.

2) 跨平臺,可以執行在windows,linux 和macos上.

3)易於擴充套件,c#開發者很容易使用已有的c#語言知識對Cake進行擴充套件,甚至可以讓Cake支援Java,Python等語言的構建

4) 易於和常見CI/CD平臺結合,Cake很容易和常見的CI/CD平臺,例如 Jenkins,AppVeyor, TeamCity, TFS, VSTS,Azure PipeLine等結合

5) 外掛豐富,Cake官網和第三方開發者提供了豐富的Cake擴充套件工具,方便開箱即用.

新建一個Cake HelloWorld示例

本節我們通過一個HelloWorld示例講解如何製作Cake檔案,下載啟動指令碼以及如何安裝Cake visualstudio外掛

一.新建一個Cake檔案

我們新建一個.net專案(可以是類庫,控制檯或者web專案),這裡我們建立一個控制檯專案,然後在專案sln所在目錄下新建一個名為build.cake的檔案.

讀者可以新建一個文字檔案,然後的字尾改為cake,把檔名改為build,這樣也能完成一個build.cake的建立.當然也可以通過執行Powershell命令New-Item build.cake來建立一個build.cake檔案,使用powershell建立時一定要注意在當前專案所在目錄下開啟powershell,不然以上命令合建的檔案可能路徑並不是我們期待的.

有些讀者可能有疑問是不是這個檔案一定要命名為build.cake呢,答案是否定的,其實這個檔案可以隨意命令,但是作為初體驗,強烈建議讀者不要隨便命令,而是跟著講解做,以免造成不必要的麻煩

二.編輯build.cake檔案

我們新建build.cake後,用詞本(或者其它自己熟悉的編輯器開啟它),新增以下程式碼

var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");



Setup(ctx =>
{
    // Executed BEFORE the first task.
    Information("Running tasks...");
});

Teardown(ctx =>
{
    // Executed AFTER the last task.
    Information("Finished running tasks.");
});

Task("Default")
.Does(() => {
    Information("Hello World!");
});

RunTarget(target);

三.下載啟動指令碼

Cake在windows下啟動指令碼為build.ps1(當然也可以是其它名字),在linux和macos下為build.sh

需要注意的是雖然Cake在macos和linux下啟動指令碼都是build.sh但是並不是一模一樣的,不同平臺要下載針對本平臺的啟動指令碼.

由於我是在windows下執行的,因此下載windows平臺對應的啟動指令碼build.ps1

在專案build.cake所在目錄下,我們開啟powershell,然後執行以下命令Invoke-WebRequest http://cakebuild.net/download/bootstrapper/windows -OutFile build.ps1 即可下載啟動指令碼

linux平臺下載方式:curl -Lsfo build.sh http://cakebuild.net/download/bootstrapper/linux

mac平臺下載方式 curl -Lsfo build.sh http://cakebuild.net/download/bootstrapper/osx

需要注意的是,一定要在當前目錄(sln所在目錄或者自已指定的其它目錄),如果是從開始選單中啟動的powershell,一定要通過cd命令進入到目標目錄.

image

windows 10可以在資料夾左上角點選檔案在彈出選單中找到powershell,這樣啟動的powershell目錄就是在當前資料夾所在目錄

四.執行構建

我們在當前目錄開啟powershell,通過powershell,在powershell命令視窗裡輸入.\build.ps1執行剛下載的ps1指令碼,過一分後我們可以看到輸出的構建資訊

avatar

五.build.cake檔案解析

初接觸build.cake我們可能對它很陌生,不過不要害怕,它完全是用c#語言寫的,只是方法是自定義的.

build.cake裡共有三個任務,Setup,TearDown和Default,其中Setup任務會在所有任務執行之前執行,TearDown任務會在所有任務執行後執行,非常類似於Nunit裡的Setup和TearDown方法.有些時候我們想在所有方法執行之前執行一些初始化工作,在所有任務執行完之後執行一些收尾工具,我們可以把相應程式碼寫在SetupTearDown

Setup,TearDownDefault裡接收的都是一個委託,我們可在在委託裡寫自己的程式碼,委託裡的引數由於目前我們沒有使用到,這裡不再講解.大家只要知道它的格式就行了.

Setup,TearDown是兩個特殊的任務,由cake自動呼叫,而Default任務需要顯地呼叫才能執行,我們編寫其它任務時,可以模仿Default任務.

在這裡,有些童鞋可能會有疑問,以上任務通過指令碼也能完成,為什麼還要這麼麻煩來使用工具呢,其實使用指令碼有很多弊端,我們前面介紹了一個完整的.net web專案在測試環境的持續整合方案,其中使用到了數十個指令碼和工具,如果我們的指令碼編寫不夠嚴謹往往會造成生產環境的損失.並且從實踐上來看,指令碼數量過多時往往容易失控.部署在伺服器中指令碼很多時候成為燙手山芋,不熟悉的人既不想看,也不想改,更重要的是不敢輕易改.也不敢輕易把它移除或者刪除掉.另外一個不可忽視的問題是指令碼往往背後呼叫的是工具,工具又對執行環境有依賴.我們在精心配置的一臺伺服器上可能執行良好,但是換更換到其它的伺服器上往往會因為各種條件不滿足造成各種問題,在人手不足的情況下這麼問題尤為凸顯.開發和運維都苦不堪言,開發指令碼的初衷往往是為了提高效率,結果由於維護問題加深開發和運維之間的矛盾.而cake則由自身管理各種依賴,很大程度上解決了以上問題.

相關文章