如何持續整合/交付一個開源.NET函式庫到Nuget.org

weixin_34391854發表於2016-09-22

(此文章同時發表在本人微信公眾號“dotNET每日精華文章”,歡迎右邊二維碼來關注。)

題記:這是一個簡單的入門嚮導,涉及到GitHub、AppVeyor和Nuget.org。

最近在開發釘釘相關東西,遂簡單包裝了一個釘釘SDK並開源(https://github.com/keyroads/DingtalkSDK),這就涉及到如何進行持續整合並自動釋出Nuget包的問題。之前一直都是使用TFS或者VSTS來做CI,既然是一個託管在GitHub中的開源專案,就從大家常用的持續整合平臺(AppVeyorTravis CI)中選一個(我選用的AppVeyor,因為它對.NET專案做了很多便捷的支援)。同時這是一個函式庫,所以也需要自動釋出到Nuget.org(當然MyGet中也可以),供有需要的人引用。

下面是具體步驟(流水賬):

1,託管程式碼到GitHub中(廢話),建議設master為主分支。

2,到https://ci.appveyor.com/signup 註冊使用者,選擇“FREE”計劃,登入可以選用GitHub帳號,這樣方便更好的整合。

3,在AppVeyor的專案頁面https://ci.appveyor.com/projects,新建專案,選擇GitHub,選擇列出的某個資源庫(Repository)。注:如果之前就是用GitHub帳號登入AppVeyor的話這裡就會列出你在GitHub上的專案(如果需要選擇你某個組織的專案,那麼授權的時候記得也對組織授權),如果沒有用GitHub帳號登入,那麼這裡應該有個和GitHub帳號整合的過程。

4,在步驟3中選擇“NEW”後,AppVeyor使用了一些預設的引數把專案馬上建立好了。這個時候,理論上是可以正常進行CI了。不過很多時候,我們還是需要進行一些個性化的配置。AppVeyor的配置,可以基於YML格式檔案來配置(在Repository的根目錄放置appveyor.yml,AppVeyor就可以自動讀取,當然也可以設定appveyor.yml檔案的路徑和檔名),也可以基於使用者介面來配置。兩者並存,檔案方式預設優先使用者介面方式,不過使用者介面方式中有選項(General > Ignore appveyor.yml)可以忽略檔案方式。

5,我自己的個性化配置如下:

5.1,同一個Repository我新建了兩個CI專案,一個用於持續整合(每次提交和PR都會構建,命名為Build),一個用於“持續交付”(推送tag的時候,構建的同時把Nuget包部署到Nuget.org,命名為Publish)。

5.2,先說Build專案的配置。在General部分:我勾選了“Pull Requests do not increment build number”避免build編號不會被尚未接受的pr所打亂;“Branches to build”選擇“Only branches specified below”輸入“master”代表只對master分支的改變起作用;勾選“Do not build tags”因為tag由Publish專案來處理;勾選“Fetch repository as zip archive”以便專案程式碼多歷史長的時候可以加快程式碼獲取速度;勾選“Ignore appveyor.yml”。在Build部分:“Configuration”輸入“Release”;“Before build script”選擇CMD並輸入“dotnet restore”和“nuget restore”兩行,有dotnet是因為我的DingtalkSDK中有.NET Core的版本。

5.3,Publish專案的配置是基於Build專案的,不過改變或加入瞭如下配置。General部分:不勾選“Do not build tags”而勾選“Build tags only”以便推送tag的時候(即需要釋出一個版本的時候)才觸發CI;啟用“AssemblyInfo patching”讓釋出的Nuget包的版本可以產生變化。Build部分:勾選“Package NuGet projects”讓AppVeyor自動給你生成Nuget包(下面會更詳細的解釋)。Artifacts部分:新增一個artifact,在“PATH TO ARTIFACT”輸入“temp_path\*.nupkg”,在“DEPLOYMENT NAME”輸入“Nuget Packages”,“TYPE”選擇“Auto”。在Deployment部分:新增一個deployment,“Deployment provider”選擇“NuGet”,輸入從Nuget.org獲得的API-KEY到“API key”中,“Artifact(s)”輸入“/.*\.nupkg/”。

6,上面提到Publish這個CI專案是會自動釋出Nuget包到Nuget.org的。在AppVeyor的幫助下,這個過程其實是非常簡單的。

6.1,下載Nuget.exe(https://dist.nuget.org/win-x86-commandline/latest/nuget.exe)。

6.2,進入到需要打包為Nuget的專案資料夾中,執行“nuget spec”來為當前專案生成一個打包描述nuspec檔案。根據自己的需要編輯生成nuspec檔案,比如新增依賴等。具體可以參考(https://docs.nuget.org/ndocs/schema/nuspec)。

6.3,把nuspec檔案包含到原始碼(注意在專案根目錄,即和csproj檔案在一起),並提交到GitHub中。這是讓AppVeyor的“Package NuGet projects”選項起作用的關鍵步驟。通過啟用這個選擇,AppVeyor會自動給這個專案構建出Nuget包,並放到“temp_path”目錄中,所以需要把這個Nuget包新增到構建輸出artifact中。

6.4,到Nuget.org網站中,註冊帳號(可以直接使用微軟帳戶來登入)。然後就可以在(https://www.nuget.org/account)獲取到API KEY(在AppVeyor的部署配置中需要)。

7,最後就是把構建狀態顯示到GitHub中的專案首頁。這個也很簡單,在AppVeyor中的每個專案配置裡都有一個Badges部分,把“Sample markdown code”複製到README.md中就搞定了。

至此,一個.NET開源函式庫專案自動構建和部署就此配置完成。當然,由於目前DingtalkSDK對.NET Core還沒有真正支援,所以並未考慮.NET Core的Nuget打包的配置。

相關文章