好代码是管出来的——使用GitHub实现简单的CI/CD

软件开发一般来说是一项团队作业,在本系列文章开始就提到过软件的编码是由一个团队“并行”完成的,为了保证编码任务正常完成,首先引入版本控制工具来完成代码管理,为了保证代码质量引入了代码分析器以及代码测试。

  版本控制工具可以保证代码有一个主版本,但代码分析和测试均是开发人员手动在本地完成的(通过编译、执行测试等方式),在进行代码分析和测试时可能并没有将本地代码更新到最新版本,这样就会出现一个问题,当多个开发人员向版本库提交代码时,无法保证最新代码库的代码是正确的,为了解决这个问题,提出了持续集成,持续集成的集成指的是持续的对多个开发人员编写的代码进行集成,本文从下面几个方面介绍持续集成以及基于Github进行持续集成实践:

  • CI&CD

  • 常用的持续集成工具

  • GitHub市场简介

  • 使用AppVeyor实现持续集成

  • 使用Codecov显示代码覆盖率

  • 小结

CI&CD

  持续集成(Continuous integration,CI)指的是在开发过程中持续地将所有开发人员的代码合并到代码库的主线上,然后对该主线代码进行编译、测试运行等操作对代码进行检验,其目的是尽可能早的发现代码集成后导致的问题
  实现持续集成的要点主要有:共享的代码库、自动化编译、自动化测试等,同时要保证合理的集成频率,一般持续集成的时机在于开发人员将代码提交到代码库时自动进行,但是如果提交过于频繁,那么应该使用时间间隔的形式进行持续集成。
  持续发布(Continuous delivery,CD)实际上是持续集成上的一个拓展,在持续集成的基础上将发布工作自动化,避免人为操作从而减少发布时间和发布时人为造成的错误

常用的持续集成工具

  持续集成经过多年的发展,在不同的应用场景、平台/语言、商业化等因素下产生了许多持续集成工具,可参考(但不限于这些):  https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software
  比较常用的持续集成工具有:
  Jenkins
  Jenkins是一个开源的跨平台持续集成工具,它提供了GUI界面以及大量的拓展插件,通过GUI界面可以简单、快速的完成项目持续集成配置,更重要的是Jenkins支持所有的版本控制工具。
  项目地址:https://jenkins.io/

  TeamCity
  TeamCity是JetBrains公司开发的持续集成工具,它有免费和收费两种授权,免费版本的TeamCity拥有所有功能,其限制仅仅是只能创建100个编译配置和只能并行运行3个代理。
  项目地址:http://www.jetbrains.com/teamcity/

  GitLab
  GitLab是一个Git的代码管理工具,使用GitLab可以轻松的在Linux环境搭建一个Git的远程代码托管平台,同时GitLab中也内置的CI/CD功能。
  项目地址:https://about.gitlab.com/

  Travis CI 
  Travis CI是一个持续集成托管平台,它为开源项目提供免费支持,但Travis CI不支持Windows下编译。
  项目地址:https://www.travis-ci.org/

  AppVeyor
  AppVeyor也是一个持续集成的托管平台,它支持Windows和Linux,并且AppVeyor可以对环境进行定制:https://www.appveyor.com/docs/build-environment/,是一个非常强大的CI工具,AppVeyor对开源项目提供免费支持。
  项目地址:https://www.appveyor.com/

  VSTS
  VSTS(Visual Studio Team Services)是微软的软件开发管理解决方案,它包含了代码版本管理、持续集成/发布、敏捷等特性,并且VSTS为5人以下团队提供了免费使用。
  项目地址:https://visualstudio.microsoft.com/zh-hans/team-services/

  总的来说持续集成工具分为可本地安装和平台托管两类,本地安装类型的工具适合有专用构建服务器资源的闭源项目(当然开源项目也可以使用),而托管平台则比较适合开源或者没有专用构建服务器资源的项目,使用上托管平台更加省心,这些工具需要根据实际情况来进行选用。

GitHub市场简介

  GitHub作为一个分布式的软件管理解决方案,它除了提供代码托管外,还通过应用市场的方式提供了拓展应用,这些应用主要用于持续继承、部署、测试、代码审查、项目管理等等,详情查看:https://github.com/marketplace/
  下图为Github市场中的CI工具:

  640?wx_fmt=png

  一般来说市场中提供的应用对于开源项目都是可以免费使用的,下面就介绍如何将Github上的开源项目使用其市场应用完成持续集成。

使用AppVeyor实现持续集成

  AppVeyor是一个支持自定义持续集成环境的CI工具,它对.Net程序的支持非常强大,同时对开源项目免费,所以AppVeyor是.Net Core项目持续集成的首选,下面就介绍如何使用AppVeyor完成持续基础:
  1. 在GitHub市场中找到AppVeyor,并完成安装:

  640?wx_fmt=png

  2. 添加项目:

  640?wx_fmt=png

  选择GitHub仓库,并完成授权:

  640?wx_fmt=png

  添加需要的仓库:

  640?wx_fmt=png

  点击“NEW BUILD”进行一次编译:

  640?wx_fmt=png

  从编译的信息可以看到,此次编译失败了,并且给出了相应的错误信息,这是由于编译环境导致的。

  3. 环境配置:
  将编译镜像选择为VS2017:

  640?wx_fmt=png

  在编译前先执行dotnet restore命令还原项目依赖:

  640?wx_fmt=png

  4. 开始一个新的编译:
  编译结果:

  640?wx_fmt=png

  从编译结果可以看出Appveyor不仅仅是完成了编译工作,而且还搜索了测试信息,并完成了测试。另外有一个要点是本项目中的测试是依赖数据库的,这就意味着Appveyor的编译环境提供了SQL Server数据的支持。

  5. 将编译后的内容发布到GitHub release:
  为xUnitTestDemo代码库添加一个Tag:

  640?wx_fmt=png

  然后Appveyor将会检测到代码库的变化,自动编译Tag,并将结果部署到Github的Release中:

640?wx_fmt=png

  自动部署的Release内容:

  640?wx_fmt=png

  关于appveryor部署的更多信息参考:https://www.appveyor.com/docs/deployment/

  6. 将编译状态显示到GitHub上:
  Appveyor的Badges(标记)配置界面中可以获取到状态标记地址:

  640?wx_fmt=png

  将MarkDown的代码复制到项目的README.md文件中:

  640?wx_fmt=png

  效果:

  640?wx_fmt=png

  7. 导出appveyor.yml文件以及通过appveyor.yml来完成配置:
  上面的方法是通过Appveyor的Web界面上完成配置的,除此之外还可以通过appveyor.yml文件来完成配置,appveyor.yml文件可以自己创建或导出已有配置:
  导出已有配置:

  640?wx_fmt=png

  将appveyor.yml文件放置到代码根目录,并通过修改该文件来变更配置:

  640?wx_fmt=png

  上图在原有配置基础上修改为release的方式编译代码,并且指定生成结果目录,将结果进行压缩。
  更多appveyor.yml配置可参考:https://www.appveyor.com/docs/appveyor-yml/

使用Codecov显示代码覆盖率

  Codecov也是Github市场的一个应用,它用于生成代码覆盖率报告,codecov对C#的支持是基于OpenCover的(使用OpenCover检测代码覆盖率参考:好代码是管出来的——.Net Core中的单元测试与代码覆盖率),Codecov对Github的公开项目是免费的,下面就开始介绍如何使用codecov来实现测试代码覆盖率的统计:
  1. 安装Codecov:

  640?wx_fmt=png

  注:安装完成Codecov后,会有一个Upload Token用来将代码覆盖报告上传到Codecov,但Appveyor的公共仓库可以不需要:

  640?wx_fmt=png

  2. 修改appveyor.yml文件:

  640?wx_fmt=png

  添加使用choco管理器安装OpenCover及codecov,然后在test_script中添加代码覆盖率分析报告以及上传脚本。
  注:当上述变更push到Github后,Appveyor将开始自动编译并完成包括代码覆盖率报告生成、上传等所有工作,此时打开codecov页面将会看到报告信息:

  640?wx_fmt=png

  3. 在README.md文件中添加Codecov的标签:

  640?wx_fmt=png

 

   640?wx_fmt=png

  结果:

  640?wx_fmt=png

小结

  本文介绍了CI和CD的基本概念,前者目的在于尽可能早的发现多人开发时代码集成的错误,而后者目的是避免人为造成的错误,将一些重复的事情交由程序自动完成,既可以减少成本又可以提高正确率,现在流行的DevOps的基础之一就是自动化也就是CI和CD。
  另外本文还介绍了在Github上使用Appvoyer和Codecov工具实现了简单的持续集成,当把新代码推到GitHub仓库时,Appvoyer会自动的完成一系列构建操作。Appvoyer是一个非常强大的CI工具,对C#的支持也非常好可以选择VS版本(包括预览版),多种数据库(包括Linux下的SQL Server),所以在执行测试时依赖数据库的测试也能通过。
  下篇文章将介绍如何使用Jenkins完成本地CI服务器的搭建。

参考:
  https://en.wikipedia.org/wiki/Continuous_integration
  https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software
  https://en.wikipedia.org/wiki/Continuous_delivery
  https://cakebuild.net/
  https://docs.codecov.io/docs
  https://www.appveyor.com/docs/

相关文章:

原文地址https://www.cnblogs.com/selimsong/p/9398738.html 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU5119 - Happy Matt Friends

HDU5119 - Happy Matt Friends 做法&#xff1a;拆成两堆数&#xff0c;分别暴力出两组的所有异或值A,B&#xff0c;枚举A, 将B全部插入Trie树&#xff0c;通过枚举的数每一位的值,确定异或后构成的新树&#xff0c;然后在新树上统计比m大的值的个数即可。 #include <bits/s…

jzoj4739-[雅礼联考GDOI2017模拟9.2]Ztxz16学图论【LCT,树状数组】

正题 题目链接:https://gmoj.net/senior/#main/show/4739 题目大意 nnn个点mmm条边的一张图&#xff0c;qqq次询问一个区间的边可以形成多少连通块。 解题思路 询问按照右端点排序&#xff0c;然后边权就是编号&#xff0c;这样询问最大生成树后判断有多少个边权大于lll即可。…

【状压DP】最优配对问题(jzoj 3420)

最优配对问题 jzoj 3420 题目大意&#xff1a; 在平面上有n个点&#xff0c;现在要把他们拼成n/2对&#xff0c;拼接两个点的代价是他们的平面距离&#xff0c;现在问代价总和最小是多少 输入样例 4 8730 9323 -3374 3929 -7890 -6727 1257 4689输出样例 20366.60数据范围…

数据告诉你:中年并不只有危机,创业或许正当时

人们普遍认为最成功的企业家都是年轻人。比尔?盖茨、史蒂夫?乔布斯和马克?扎克伯格都在自己20岁出头的时候&#xff0c;建立起了日后改变世界的伟大公司。这些著名的案例是否反映了一种可以被普遍推广的模式呢&#xff1f;风险投资机构和媒体似乎赞成一点。我们分析了过去十…

HDU6223 - Infinite Fraction Path

HDU6223 - Infinite Fraction Path 做法1&#xff1a;枚举每个串取最大值&#xff0c;只用判断前20位&#xff0c;如果前20位都相同&#xff0c;可以认定两个串相同。因为很容易进入循环节&#xff0c;且循环节不太大。 #include <bits/stdc.h> #define pb push_back typ…

P4219-[BJOI2014]大融合【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/P4219 题目大意 nnn个点&#xff0c;每次有操作 加入一条边&#xff0c;保证该边连接了两个不同的连通块询问经过一条边的路径数量 解题思路 考虑如何用LCTLCTLCT维护虚子树信息&#xff0c;只要在断边的时候把虚子树的信息…

【区间DP】甲虫(luogu 4870)

甲虫 luogu 4870 题目大意&#xff1a; 在一个坐标轴上有n个露珠&#xff0c;每个露珠有m个水分&#xff0c;露珠会每隔一个时间单位就消失一点水分&#xff0c;现在有一只甲虫从原点出发&#xff0c;甲虫的移动速度是一个单位时间移动一个单位的距离&#xff0c;甲虫没碰到…

GYM 101669F - Binary Transformations

GYM 101669F - Binary Transformations 做法&#xff1a;如果不存在一个位置p \((a[p]1,b[p]1)\)&#xff0c;那么答案就是贪心的先把所有的1&#xff0c;按价值从大到小变为0,所有的0,按价值从小到大变为1。如果存在一些位置p&#xff0c;我们就枚举一开始把多少p转成0,显然价…

2020牛客NOIP赛前集训营-提高组(第六场)A-袜子分配【组合数学,结论】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7615/A?&headNavacm&headNavacm 题目大意 nnn对颜色一样的袜子&#xff0c;每次随机拿出两个&#xff0c;求拿完之后颜色一样的期望对数。 解题思路 考虑一对袜子的贡献&#xff0c;因为这一对要绑在一起所以贡献…

【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)

FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意&#xff1a; 有一个单调不降序列&#xff0c;让你求出某些区间内的出现次数最多的数出现的次数&#xff08;有多组数据&#xff0c;以0结尾&#xff09; 输入样例 10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1 10 5 …

ASP.NET Core 2.0 MVC项目实战

一、前言毕业后入职现在的公司快有一个月了&#xff0c;公司主要的产品用的是C/S架构&#xff0c;再加上自己现在还在学习维护很老的delphi项目&#xff0c;还是有很多不情愿的。之前实习时主要是做.NET的B/S架构的项目&#xff0c;主要还是用的那种传统的开发模式&#xff0c;…

Codeforces1045I

Codeforces1045I 做法&#xff1a;如果至多有一种字母出现奇数次&#xff0c;则合法&#xff0c;因此把整个串用一个26位2进制数表示&#xff0c;对于每一个数&#xff0c;枚举可能的对应串的状态即可。 #include <bits/stdc.h> typedef long long ll; inline int read()…

[2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】

正题 题目大意 一个字符串SSS。 若干个询问&#xff0c;每次询问一个串TTT和l,rl,rl,r。询问有多少个TTT和SSS的公共子串满足和为[l,r][l,r][l,r] 解题思路 考虑枚举子串左端&#xff0c;那么右串一定在一个范围内&#xff0c;考虑如何求出一个范围。 考虑用后缀数组解决这…

开始水题发博客

以后每次能AC CodeForces的题&#xff0c;就发一次博客 尽量带讲解吧。。 我这人很懒的。。 日期 0:32 2019-10-12

WebApiClient百度地图服务接口实践

1. 文章目的随着WebApiClient的不断完善&#xff0c;越来越多开发者选择WebApiClient替换原生的HttpClient&#xff0c;然而在应用到实际项目中多多少少会遇到一些项目结合上的疑问和困难&#xff0c;本文将以WebApiClient使用者的身份&#xff0c;在Asp.net core mvc项目中使用…

【DP】数字游戏(jzoj 2131)

数字游戏 jzoj 2131 题目大意&#xff1a; 有n个数&#xff0c;每个数有相应的aia_iai​和bib_ibi​&#xff0c;当选了一个数后结果加上aia_iai​,其他数分别减去他们自己的aja_jaj​&#xff0c;现在让你选m个数&#xff0c;结果最大是多少 输入样例 3 3 10 20 30 4 5 6…

Codeforces1045G

Codeforces1045G 做法&#xff1a;按半径r从大到小枚举&#xff0c;对于每个q&#xff0c;枚举对应位置可能的q值&#xff0c;对每个q&#xff0c;维护出现的坐标x&#xff0c;每次查询半径内的已经出现的坐标的数目即可。需要实现一个插入单点加&#xff0c;查询区间和的操作&…

[2020.10.30NOIP模拟赛]小鱼吃大鱼【RMQ】

正题 题目大意 nnn个数&#xff0c;求一对(i,j)(i,j)(i,j)要求最大化max{ai,aj}%min{ai,aj}max\{a_i,a_j\}\% min\{a_i,a_j\}max{ai​,aj​}%min{ai​,aj​} 解题思路 我们考虑枚举小的那一个iii&#xff0c;显然在ki∼k(i1)−1ki\sim k(i1)-1ki∼k(i1)−1这段范围都是要减去一…

CodeForces 1191A---Tokitsukaze and Enhancement

原题链接 Describe: Tokitsukaze is one of the characters in the game “Kantai Collection”. In this game, every character has a common attribute — health points, shortened to HP. In general, different values of HP are grouped into 4 categories: Category A…

Dependency injection in .NET Core的最佳实践

我们知道依赖注入&#xff08;DI&#xff09;是一种实现对象及其协作者或依赖关系之间松散耦合的技术。 ASP.NET Core包含一个简单的内建容器来支持构造器注入。我们试图将DI的最佳实践带到.NET Core应用程序中&#xff0c;这表现在以下方面&#xff1a;构造器注入注册组件DI i…