好代码是管出来的——使用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,一经查实,立即删除!

相关文章

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

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

ASP.NET Core 2.0 MVC项目实战

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

WebApiClient百度地图服务接口实践

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

Dependency injection in .NET Core的最佳实践

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

CodeForces - 1189A ----Keanu Reeves

原题传送 INPUT Output Examples 题意: 有个长度我n的字符串,然后把它分成k分,要使每份都good且为正数(good的要求为该数中0和1的个数不同),求输出最小的结果(答案不唯一输出一个即可&#xf…

WebApiClient的接口输入验证

1. 文章目的随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,本文将介绍WebApiClient的接口参数输入有效性验证的新特性。2.DataAnnotations介绍在asp.net mvc服务端编程中,我们在创建模型的时候&#xff0c…

CodeForces - 1189B Number Circle

原题传送器<----点我 **题意&#xff1a;**n个数字&#xff0c;请你给它们排个序围成一个环&#xff0c;满足任意一个数两边的数之和大于它本身&#xff0c;例如题目给的图&#xff08;左图为正确答案&#xff09;&#xff0c;如果不存在这样的环就输出NO。 难度★ 题解 …

在 .NET Core 应用中使用 NHibernate

NHibernate 最近发布了 5.1.3 版本&#xff0c; 支持 .NET Standard 2.0 &#xff0c; 这意味着可以在 .NET Core 2.0 应用中使用&#xff0c; 本文就已 WebAPI 应用为例&#xff0c; 介绍一下如何在 .NET Core 应用中如何使用 NHibernate 。1、 新建一个基于 .NET Core 的 We…

【数学】礼物(jzoj 2129)

礼物 jzoj 2129 题目大意 有1……n,n个礼物盒&#xff0c;第i个礼物盒有i个礼物&#xff0c;现在让你选2个礼物盒&#xff0c;使他是k的倍数 输入样例 1 1 3 2 5 2 50 50 0 0输出样例 0 1 4 24数据范围 20%的数据N<100; 80%的数据K<1000; 每个输入文件最多有200行…

微信小程序与AspNetCore SignalR聊天实例

微信小程序与aspnetcore signalr实例本文不对小程序与signalr做任何介绍,默认读者已经掌握aspnetcore Signalr文档小程序文档写在之前SignalR没有提供小程序使用的客户端js,所以本人参考signlar.js写了小程序版signalr-client.js 代码开源&#xff0c;地址 https://github.com/…

二次重建基本完成辣!

二次重建基本完成辣&#xff01; 实现了一些&#xff0c;之前觉得很有意思的设想&#xff0c;参考了许多dalao的blog解决了手机端突然出现的无法点击链接的问题但是在由于css实现过程中&#xff0c;本人姿势水平不够&#xff0c;Pad和手机无法正常显示。。。适配调整工程过于庞…

技术绩效考量:你们可能都做错了

欢迎来到通向卓越之路&#xff01;我们或许都陷入了这样的困境&#xff0c;我们努力成为卓越的企业&#xff0c;我们进行绩效考量&#xff0c;并在此过程中找到正确的OKR、KPI或ABC。但这可能是一件很困难的事情&#xff0c;特别是当我们所在的组织非常复杂并从技术幽灵&#x…

CodeForces 282E Sausage Maximization(trie+xor)

传送题目 看了半个多小时的题解才搞明白&#xff0c;一下题解为自己的心得 参考博客&#xff08;这两个讲的很详细&#xff09;&#xff1a; 参考一 参考二 题意&#xff1a;有一个长度有n的整数序列&#xff0c;你要在这个序列中选择一个前缀和后缀&#xff0c;前后缀不想交&a…

Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

Net Core平台灵活简单的日志记录框架NLog初体验前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人说比较重量&#xff0c;生产环境部署也比较麻烦。因此就有了今天的这篇文章。如果你…

ASP.NET CORE 根据环境变量支持多个 appsettings.json

0.背景在开发项目的过程当中&#xff0c;生产环境与调试环境的配置肯定是不一样的。拿个最简单的例子来说&#xff0c;比如连接字符串这种东西&#xff0c;调试环境肯定是不能连接生产数据库的。在之前的话&#xff0c;这种情况只能说是你 COPY 两个同名的配置文件来进行处理。…

基于Win10极简SonarQube C#代码质量分析

博客有些好些时间未更新了&#xff0c;这几个月的时间里&#xff0c;离开了实习的公司、大学毕了业、来了新公司、转了户口&#xff0c;有点忙&#xff0c;最近总算稍微闲下来了&#xff0c;打算重新拾起博客&#xff0c;坚持写下去。言归正转&#xff0c;什么是SonarQube ?So…

大吉大利【牛客网】(牛客练习赛60)

传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 第一行一个整数n. 第二行n个整数ai. 输出描述: 一个整数表示上述求和式的答案. 示例1 输入 5 1 2 3 4 5输出…

【项目管理】git和码云的使用

缘起说了那么多关于git和码云相关的事&#xff0c;一直都没给大伙讲解这个码云究竟是个啥玩意儿。今天就给大伙说说如何通过git和码云搭建属于自己的代码库。码云码云(GitOSC)是开源中国社区团队推出的基于Git的快速的、免费的、稳定的在线代码托管平台,不限制私有库和公有库数…

三角形周长和【牛客网】牛客网练习赛60

题目传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 输入描述: 输入描述 第一行一个整数表示n. 接下来n行每行两个整数x,y表示一个点. 输出描述: 输出一个整数表示周长…

AspNetCore 基于AOP实现Polly的使用

前言 说起AOP&#xff0c;其实我们在做MVC/API 的时候应该没少接触&#xff0c;比如说各种的Fitter 就是典型的AOP了。本来在使用Polly的时候我最初的打算是使用过滤器来实现的&#xff0c;后来发现实现起来相当的困难&#xff0c;利用NetCore的中间以及过滤器去实现一个AOP的…