(此文章同時發表在本人微信公衆號「dotNET每日精華文章」,歡迎右邊二維碼來關注。)git
題記:這是一個簡單的入門嚮導,涉及到GitHub、AppVeyor和Nuget.org。github
最近在開發釘釘相關東西,遂簡單包裝了一個釘釘SDK並開源(https://github.com/keyroads/DingtalkSDK),這就涉及到如何進行持續集成並自動發佈Nuget包的問題。以前一直都是使用TFS或者VSTS來作CI,既然是一個託管在GitHub中的開源項目,就從你們經常使用的持續集成平臺(AppVeyor和Travis CI)中選一個(我選用的AppVeyor,由於它對.NET項目作了不少便捷的支持)。同時這是一個函數庫,因此也須要自動發佈到Nuget.org(固然MyGet中也能夠),供有須要的人引用。微信
下面是具體步驟(流水帳):markdown
1,託管代碼到GitHub中(廢話),建議設master爲主分支。app
2,到https://ci.appveyor.com/signup 註冊用戶,選擇「FREE」計劃,登陸能夠選用GitHub賬號,這樣方便更好的集成。ide
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,我本身的個性化配置以下:ui
5.1,同一個Repository我新建了兩個CI項目,一個用於持續集成(每次提交和PR都會構建,命名爲Build),一個用於「持續交付」(推送tag的時候,構建的同時把Nuget包部署到Nuget.org,命名爲Publish)。rest
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打包的配置。