[Cake] 1. CI中的Cake


在上一篇C#Make自動化構建-簡介中,簡單的介紹了下Cake的腳本如何編寫以及通過Powershell或者Bash在本地運行Cake腳本。本篇在此基礎上,介紹下如何在CI環境中使用Cake。

1. Cake簡介續

1.1 為Task添加注釋信息

Cake的每一個Task都可以添加一項描述,用來解釋它的用途。比如下面的示例:

1 Task("restore")
2     .Description("還原項目依賴")
3     .Does(() =>
4 {
5     DotNetCoreRestore(soluction);
6 });

然后Cake接收一個名為 ShowsDescription 的參數,運行Powershell或者bash的時候可以傳遞-ShowDescription來顯示Task的信息。為了方便輸入,我把ShowDescription改成了Help(僅更改了build.ps1中傳遞參數的名稱)。

1.2 Cake.exe 和 Cake.CoreCLR

Cake目前有兩個版本(參見Cake Releases):

  1. Cake.exe是面向net461的,可以在winodws上直接運行;也可以在linux上借助 mono cake.exe (Mono已經實現net47)來運行。
  2. Cake.CoreCLR(0.26版本以后開始支持.net core 2的,之前是.net core 1.1)面向.netcore的,可以使用 dotnet cake.dll 來運行。

我們直接下載這兩個nuget包,然后用7z解壓一下(nupkg文件為zip):

cake.0.26.1.nupkg解壓后如下:

在windows下可以直接通過console窗口來運行它:

cake.coreclr.0.26.1.nupkg解壓后如下:

可以通過dotnet cake.dll來運行它:

2. Cake運行環境搭配

Cake腳本本身的跨平台(windows,linux,docker等)是借助於上面提到的cake.exe或cake.coreclr來實現的。基於這些,我們可以有如下的組合:

  1. windows:用powershell來引導執行cake.exe。
  2. windows:用powershell來引導執行dotnet cake.dll。
  3. linux:用bash來引導執行mono cake.exe。
  4. linux:用bash來引導執行dotnet cake.dll。
  5. docker:視docker鏡像的os平台而定,從上面四個組合中選擇一個。

由於目前dotnet cli本身的不健全,缺少獨立於*.csproj文件之外來安裝nuget包的命令,故而使得安裝cake.coreclr變得非常惡心。參見兩種變通方法:

  1. 借助外部工具下載cake.coreclr的nuget包:https://github.com/devlead/BitbucketPipelinesShield/blob/master/build.sh
  2. 構造一個臨時的*.csproj文件,然后用dotnet restore來下載cake.coreclr的nuget包:https://gist.github.com/luigiberrettini/19a124d24af74039ae87065adb007e2c

故而目前在window平台下選擇1,在其他平台下選擇3比較合適,在docker下可以構建一個mone+dotnet的混合環境的image(https://hub.docker.com/r/lnhcode/dotnet2-mono5/)。

好消息是目前.net core的每日構建版已經添加了 dotnet install  和 dotnet install tool 的命令(https://github.com/dotnet/cli/blob/master/src/dotnet/commands/dotnet-install/InstallCommandParser.cs),可以直接用來安裝nuget包。這個新功能會隨着.net core 2.1的正式發布而到來。到時候就可以統一借助dotnet cli來安裝cake.coreclr了。

3. 在不同的CI環境中執行相同的自動構建

cake的目的在於一次編寫,可以運行在不同的構建環境和構建工具中。同時可以把構建腳本納入到源代碼管理中,而不是編寫在某一特定的ci/cd工具中。正如這篇文章https://www.thoughtworks.com/radar/techniques/programming-in-your-ci-cd-tool中的觀點一樣。

借助Github提供的很多免費的CI服務,我在https://github.com/linianhui/cake.example上接入了3個CI服務。

3.1 Cake with AppVeyor

AppVeyor主要提供有windows的ci環境,我們只需要再github的項目根目錄添加 appveyor.yml 文件,然后關聯一下AppVeyor的服務即可。

1 version: 1.0.{build}
2 image: Visual Studio 2017
3 build: off
4 test_script:
5 - ps: ./build.ps1 -target test

上面的這個示例調用了build.ps1來運行測試https://ci.appveyor.com/project/linianhui/cake-example

3.2 Cake with Travis

Travis提供有linux的ci環境,同樣的我們添加一個 .travis.yml 文件然后關聯Travis的服務即可。

 1 language: csharp
 2 
 3 os:
 4   - linux
 5   
 6 mono: latest
 7 
 8 dotnet: 2.1.4
 9 
10 script:
11   - chmod +x ./build.sh
12   - ./build.sh -target=test

上面的這個示例的運行環境是linux,安裝了mone和dotnet,然后調用了build.sh來運行測試https://travis-ci.org/linianhui/cake.example

3.3 Cake with Circle

Circle提供有docker的環境,同樣的添加一個 .circleci/config.yml 文件然后關聯Circle的服務即可。

 1 version: 2
 2 
 3 jobs:
 4   test:
 5     docker:
 6       - image: lnhcode/dotnet2-mono5
 7     steps:
 8       - checkout
 9       - run: chmod +x ./build.sh
10       - run: ./build.sh -target=test
11       
12 workflows:
13   version: 2
14   test:
15     jobs:
16       - test

上面的示例中我使用了自己定義的一個dotnet2-mono2的docker鏡像,然后調用builds.sh來運行測試https://circleci.com/gh/linianhui/cake.example/tree/master。dotnet2-mono5的鏡像位於:https://hub.docker.com/r/lnhcode/dotnet2-mono5/

4. 總結

以上簡單的介紹了一下Cake的簡介信息,和如何再不同的CI環境中使用Cake來維護一個相同的自動化構建的流程。如有錯誤,歡迎指正!

參考

dotnet2-mono5 的dockerfile:https://github.com/linianhui/dockerfiles/blob/master/dotnet2-mono5/Dockerfile

本文示例代碼:https://github.com/linianhui/cake.example

不要再CI/CD中編程:https://www.thoughtworks.com/radar/techniques/programming-in-your-ci-cd-tool

 


免責聲明!

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



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