(此文章同时发表在本人微信公众号“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打包的配置。