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

如何持续集成/交付一个开源.NET函数库到Nuget.org的更多相关文章

  1. 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...

  2. 三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 文章和搭建环境所需要的yml文件已收 ...

  3. vsts + XX云服务器构建netcore+docker持续集成交付部署

    持续集成交付部署是什么意思,它给我们带来什么好处? 先贴一张图 持续集成(Continuous Integration) 持续集成强调开发人员提交了新代码之后,立刻进行构建.(单元)测试(这个要看情况 ...

  4. 【EasyCi】持续集成交付,一键式自动化部署系统,开箱即用

    前言 本人是一家互联网公司的java开发,由于公司初期公司未招运维人员,恰好我对linux比较熟悉,便在公司服务器搭建了一套Jenkins.Gitlab.Maven私服.Docker私服.Sonarq ...

  5. 人生维艰,何不利用开源.NET函数库让工作更轻松

    今天推荐的文章会谈到一些让你工作更轻松的开源.NET函数库. 即使业界有时候认为.NET开源社区不太健康,很多开发团队都更多依赖于微软提供的东西来开发.不过最近在.NET世界中还是诞生了一些优秀和有意 ...

  6. GitHub已将持续集成服务器Janky开源

    GitHub已将Janky开源,这是他们构建在Jenkins之上的持续集成服务器,并在其中增加了聊天自动化工具Hubot. 除了一般的Jenkins功能之外,Janky还通过Hubot对功能进行了补充 ...

  7. ThoughtWorks持续集成平台GO开源了

    ThoughtWorks 持续集成平台Go最近宣布开源了.其基于Apache 2.0 开源协议. Go下载地址为http://www.go.cd/download/. 下面是几张来自官方的视图: GO ...

  8. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

  9. GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署

    预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...

随机推荐

  1. npm全局安装和本地安装和本地开发安装(npm install --g/--save/--save-dev)

    详细说明参考:http://www.cnblogs.com/PeunZhang/p/5629329.html 我个人理解: 1.全局安装(npm install -g)是为了用命令行,比如在windo ...

  2. bzoj2064[和谐社会模拟赛]分裂

    题意:给定一个初始集合和目标集合,有两种操作:1.合并集合中的两个元素,新元素为两个元素之和 2.分裂集合中的一个元素,得到的两个新元素之和等于原先的元素.要求用最小步数使初始集合变为目标集合,求最小 ...

  3. STM32库函数编程、Keli/MDK、stm32f103zet6

    catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...

  4. .NET学习之路----我对P/Invoke技术的理解(一)

    看了P/Invoke技术的介绍,于是想写下点东西,东西包含两个部分:知识的纪录和我的理解及疑问. r托管代码中调用非托管API函数的过程 1.定位包含API的DLL: 2.载入DLL 3.找到DLL中 ...

  5. sublime text3好用的插件

    1.安装package control sublime text3 的安装方法,ctrl+`,调出控制台输入 import urllib.request,os; pf = 'Package Contr ...

  6. 直接拿来用,最火的.NET开源项目

    综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security).日志(Logging).数据访问(Data Access).配置管理( ...

  7. [Linux & SVN] SVN介绍及Linux下SVN命令收录

    1. SVN是什么? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移 ...

  8. php.ini 安全配置

    (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/ ...

  9. 关于vue指令(directive)

    1.指令的注册 指令跟组件一样需要注册才能使用,同样有两种方式,一种是全局注册: Vue.directive('dirName',function(){ //定义指令 }); 另外一种是局部注册: n ...

  10. jquery.roundabout.js图片叠加3D旋转插件多功能图片翻转切换效果

    http://www.17sucai.com/pins/4880.html DEMO演示地址:http://www.17sucai.com/pins/demoshow/4880