在上一篇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):
- Cake.exe是面向net461的,可以在winodws上直接運行;也可以在linux上借助 mono cake.exe (Mono已經實現net47)來運行。
- 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來實現的。基於這些,我們可以有如下的組合:
- windows:用powershell來引導執行cake.exe。
- windows:用powershell來引導執行dotnet cake.dll。
- linux:用bash來引導執行mono cake.exe。
- linux:用bash來引導執行dotnet cake.dll。
- docker:視docker鏡像的os平台而定,從上面四個組合中選擇一個。
由於目前dotnet cli本身的不健全,缺少獨立於*.csproj文件之外來安裝nuget包的命令,故而使得安裝cake.coreclr變得非常惡心。參見兩種變通方法:
- 借助外部工具下載cake.coreclr的nuget包:https://github.com/devlead/BitbucketPipelinesShield/blob/master/build.sh
- 構造一個臨時的*.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