標籤:
(此文章同時發表在本人公眾號“dotNET每日精華文章”,歡迎右邊二維碼來關注。)
題記:這是一個簡單的入門嚮導,涉及到GitHub、AppVeyor和Nuget.org。
最近在開發DingTalk相關東西,遂簡單封裝了一個DingTalkSDK並開源(https://github.com/keyroads/DingtalkSDK),這就涉及到如何進行持續整合並自動發布Nuget包的問題。之前一直都是使用TFS或者VSTS來做CI,既然是一個託管在GitHub中的開源項目,就從大家常用的持續整合平台(AppVeyor和Travis CI)中選一個(我選用的AppVeyor,因為它對.NET項目做了很多便捷的支援)。同時這是一個函數庫,所以也需要自動發布到Nuget.org(當然MyGet中也可以),供有需要的人引用。
下面是具體步驟(流水賬):
1,Managed 程式碼到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打包的配置。
如何持續整合/交付一個開源.NET函數庫到Nuget.org