1.什么事CI/CD
大师Martin Fowler认为持续集成是一种软件开发实践,在实践中团队开发成员会频繁的进行任务的集成,通常每个成员每天都会集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建来验证,从而尽快地发现集成错误,快速进行修复。
持续集成(Continuous Integration)、持续部署(Continuous Deployment)也有分为持续集成(Continuous Integration)、持续交付(Continuous Delivery和持续部署(Continuous Deployment)The Product Managers' Guide to Continuous Delivery and DevOps 这个文章做了详细的解释,引用其中的图片解释下这三个概念
Continuous Integration (CI)(持续集成)
多个开发人员同时开发一个项目,代码提交到同一个仓库,并进行构建、执行单元测试
Continuous Delivery (CD)(持续交付)
基于继续集成的基础上,将集成的代码部署到测试环境,进行测试,可以手动部署到生产环境环境
Continuous Deployment(持续部署)
自动部署到生产环境
持续集成的优势
提高开发人员的工作效率
持续集成可将开发人员从手动任务中解放出来,并且鼓励有助于减少发布到客户环境中的错误和缺陷数量的行为,从而提高团队的工作效率。
更快发现并解决缺陷
通过更频繁的测试,您的团队可以在缺陷稍后变成大问题前发现并解决这些缺陷。
更快交付更新
持续集成有助于您的团队更快、更频繁地向客户交付更新。
目前有哪些继续集成工具
Jenkins
Jenkins是一款用Java编写的开源的CI工具。当Oracle收购Sun Microsystems时,它作为Hudson的分支被开发出来。Jenkins是一个跨平台的CI工具,它通过GUI界面和控制台命令进行配置。
Jenkins非常灵活,因为它可以通过插件扩展功能。Jenkins插件非常好用,同时你可以容易地添加自己的插件。除了它的扩展性之外,Jenkins还有另一个非常好的功能——它可以在多台机器上进行分布式地构建和负载测试。Jenkins是根据MIT许可协议发布的,因此可以自由地使用和分发。Cloudbees还提供Jenkins in Cloud形式的托管解决方案。
总结:Jenkins是最好的持续集成工具之一,它既强大又灵活。学习它可能要花费一些时间,但是如果你需要一个灵活的持续集成解决方案,那么学习如何使用它将是非常值得的。
官方网址:Jenkins
可用性:免费
平台:跨平台
TeamCity
TeamCity是一款成熟的CI服务器,来自JetBrains公司。 JetBrains已经在软件开发世界中建立了权威,他们的工具如WebStorm和ReSharper正被全球的开发者所使用。
TeamCity在它的免费版本中提供了所有功能,但仅限于20个配置和3个构建代理。额外的构建代理和构建配置需要购买,你可以在这里找到价格。
TeamCity安装后即可使用,可以在多种不同的平台上工作,并支持各种各样的工具和框架。 能够支持JetBrains和第三方公司开发的公开的插件。尽管是基于Java的解决方案,TeamCity在众多的持续集成工具中提供了最好的.NET支持。TeamCity也有多种企业软件包,可以按所需代理的数量进行扩展。
总结:整体而言是TeamCity是非常好的持续集成解决方案,但由于其复杂性和价格,更适合 企业需求。
官方网站:TeamCity
可用性:3个代理和20个构建配置是免费的,额外的代理和配置需要付费
平台:Servlet容器(本地)
Travis CI
Travis CI是最老的托管解决方案之一,赢得了很多人的信任。虽然它主要以托管解决方案而闻名,但它也以企业包的形式提供内部版本。
Travis CI对GitHub上托管的所有开源项目以及前100个版本的构建都是免费的。有几个定价计划可以供你选择,它们之间主要区别是你可以运行的并发构建数量。
Travis CI的构建通过.travis.yml文件进行配置,该文件包含了在构建时所需要执行的任务。它能够支持多种语言并提供完善的帮助文档。
总结:一个成熟的解决方案,提供托管和本地变种,被许多团队喜爱和使用,非常有据可查。
官方网站:Travis CI
可用性:对开源计划和前100个版本的构建是免费的,其他的服务需要付费
平台:托管和本地
Go CD
Go是ThoughtWorks公司最新的Cruise Control的化身。除了ThoughtWorks提供的商业支持,Go是免费的。它适用于Windows,Mac和各种Linux发行版
让Go脱颖而出的是它的流水线概念,使复杂的构建流程变得简单。关于流水线概念是如何帮助持续交付,以及如何与Jenkins的流水线流程进行比较,您可以在这里阅读到相关内容。它最初的设计时就支持流水线概念,消除了构建过程的瓶颈,并能够并行地执行任务。
总结:Go CD非常适合复杂场景,并且能够免费提供付费的支持。
官方网站:Go CD
可用性:免费提供付费的支持
平台:Windows,Mac和一些Linux发行版
Bamboo
Atlassian是专注于为软件开发团队提供工具的公司,你或许已经通过JIRA和Bitbucket了解到了他们。Bamboo最初提供了云端和本地两种持续集成的解决方案,但在2016年5月,云端版本不再支持Bitbucket Pipeline。Bitbucket Pipeline能够支持Docker, 是一个非常高效且快速的持续集成解决方案,正在迅速发展,是Bamboo云端版本的有利继承者。
Bamboo可以免费试用30天。作为Atlassian工具,它能够很好地支持JIRA和BitBucket,甚至可以将Jenkins配置轻松地导入到Bamboo中。
总结:Bamboo是一款本地CI工具。其原本的云段解决方案被Bitbucket pipeline所取代。有30天的免费试用,在此之后可以进行付费使用。
官方网站:Bamboo
可用性:付费免费试用
平台:本地
GitLab CI
GitLab CI是开源的Rails项目GitLab的一个组成部分,由GitLab公司将它带到了大众的视野中。 GitLab托管在GitLab.com上,GitLab.com提供了免费的托管服务,并且提供了git仓库存储和管理功能,如访问控制,问题跟踪,代码评论等。
GitLab CI能与GitLab完全集成,可以通过使用GitLab API轻松地作为项目的钩子。GitLab的执行部分(流程构建)使用Go语言编写,可以运行在Windows,Linux,OSX,FreeBSD和Docker上。
官方的Go Runner可以同时运行多个作业,并具有内置的Docker支持。 Gitlab CI有两个版本:开源的GitLab社区版和GitLab企业版。
总结:GitLab CI是一款令人印象深刻的托管工具,提供了免费版本和企业版本。
官方网站:GitLab CI
可用性:免费和付费
平台:托管(可以在Gitlab.com上托管)
CircleCI
CircleCI也来自GitLab公司,是另一款云端的持续集成管理工具。CircleCI目前仅支持Github管理,它能够支持的语言包括:Java, Ruby/Rails, Python, Node.js, PHP, Haskell, and Skala。
CircleCI和其他持续集成工具不同的地方在于他们提供服务的方式。CircleCI需要付费的主要是它的容器。你可以免费使用一个容器,当你开始使用更多容器的时候,你可以选择你所需要的并行化级别来加速你的应用。
主要有5个并行化级别可以供我们选择: 1x, 4x, 8x, 12x and 16x。你可以选择用16个容器进行一个项目的构建,此时并行化级别就为16x,当然你也可以用16个容器同时进行4个项目的构建,此时并行化级别为4x,如何选择取决于你。同时CircleCI也能够支持Docker。
总结:CircleCI是一个灵活的云端CI工具,提供的最大并行化级别为16x。当你需要快速地进行项目构建时它将是一个不错的选择,同时它的价格也不是很贵。
官方网站:CircleCI
可用性:免费和付费
平台:托管
Codeship
Codeship是一个本地的持续集成解决方案。它有两种不同的版本:基本版和专业版。在基本版中提供了安装即用的持续集成服务但是不能够支持Docker,它的主要用途就是通过UI来进行应用的构建等操作。专业版本提供了更灵活的功能以及Docker支持。
在基本版中有几个可选的付费包,越贵的付费包并行能力越好。在专业版本中你可以选择你的实例类型和并行级别(最高的级别为20x),价格稍微有点贵,但是大多数的团队应该会需要这种并行化构建的功能。
总结:Codeship是一个强大的带有Docker支持的本地持续集成解决方案
官方网站:Codeship
可用性:每个月的前100次构建免费,后续的构建需要付费
平台:托管
Codefresh
上面所提到的很多工具都能够支持Docker,但Codefrsh从设计到开发都将容器的理念贯彻其中。
Codefresh的开发者们从一开始就意识到Docker会广受欢迎。Codefresh除了能够在现有的Docker文件中工作外,你也可以选择几个不同的模板来轻松地的将你的项目迁移到docker容器中。它的UI非常的干净和容易理解,你可以很容易地上手。
之所以将Codefresh介绍给你们的原因在于它有一个让人非常惊喜的功能。这个功能就是将你的镜像发布到一个临时的环境中。当项目被建立时,它的镜像也被建立了,你可以发布这个镜像并观察它是如何工作的。那意味着你可以得到一个临时的工作环境,而不需要一个额外的虚拟机,这就是它非常棒的地方。
Codefresh是一款比较新的工具,有很多能够改进的地方和新的特性可以增加。但是它把容器作为它的重要组成部分使得它对任何一个打算使用Docker容器的团队来说都将是一个非常好的持续集成解决方案。
总结:Codefresh是一个支持Docker的持续集成工具,它可以发布和建立本地环境的Docker镜像。
官方网站:Codefresh
可用性:每个月的前200次构建,5个并发的构建和一个本地环境是免费的,额外的服务需要付费。
平台:本地
为什么要扩展再开发
第一,Jenkins不能自动创建Jenkins任务,必须在Jenkins平台上手工创建,大大降低了集成效率,而且需要大家都掌握创建Job的方法以及Job上的配置,不利于工具推广;
第二,其数据显示不能定制化,如果想要集成数据在一个页面上显示,那么Jenkins是无法满足这个要求的;
第三,数据不能持久化,目前Jenkins的数据是通过文本的方式保存的,而且量很大,不利于数据维护和后续的数据分析;
第四,执行机掉线没有报警功能,不会及时通知管理员及时处理;
第五,数据反馈机制比较单一,Jenkins仅支持邮件的方式进行发送通知;
第六,通过项目信息查询任务困难,Jenkins没有项目的维度,只有Job的维度,不方便查找
其他公司解决方案
阿里云效(aone)不止是冰山一角——阿里云效团队大规模代码构建技术实践
亚马逊 AWS DevOps实践:一年5000万次部署是怎样一种概念?
jenkins VS gitlab-ci
GitLab CI 是 GitLab 默认集成的 CI 功能,GitLab CI 通过在项目内 .gitlab-ci.yaml
配置文件读取 CI 任务并进行相应处理;GitLab CI 通过其称为 GitLab Runner 的 Agent 端进行 build 操作;Runner 本身可以使用多种方式安装,比如使用 Docker 镜像启动等;Runner 在进行 build 操作时也可以选择多种 build 环境提供者;比如直接在 Runner 所在宿主机 build、通过新创建虚拟机(vmware、virtualbox)进行 build等;同时 Runner 支持 Docker 作为 build 提供者,即每次 build 新启动容器进行 build;GitLab CI 其大致架构如下
jenkins | gitlab-ci | |
编译环境 | 直接运行docker需要安装插件 | gitlab-runner需要配置 |
gitlab集成 | 一般 | 完美集成 |
配置文件 | Jenkinsfile | gitlab-ci.yml |
操作页面 | 没有页面,可以通过gitlab查看 | web控制台 显示整个编译过程 |
shell脚本 | 支持 | 支持 |
隔离 | 编译服务和代码仓库隔离 配置文件可以不再工程中配置 | 集成在gitlab中 yml配置在工程中 |
编译环境 | 控制台安装或自行配置 | 自行配置 |
难易程度 | 配置繁琐 | 简单易用 |
扩展 | 插件丰富 | 不支持 |
开发语言 | java | go |
docker | 安装插件 | 内置 |
Kubernetes | 支持 | 支持(kubernetes integration、kubectl、k8sapi) |
应用性能监控 | Prometheus Plugin(同时支持Grafana Labs) | Prometheus Integration |
应用性能报警 | (待确认) | 基于Prometheus metrics界面化配置 |
GitLab 服务监控 | 通过Prometheus配置 | 通过Prometheus配置 |
流程分析 | Cycle Analytics | |
docker images 仓库 | 无第三方实现 | GitLab Container Registry |
git信息 | 拉取 | 原生支持 |
负载均衡 | 支持 | 支持 |
docker发布 | 支持 | 支持 |
web terminal | 无第三方实现 | kubernetes integration发布模式下支持 |
pipeline执行界面 | 详细日志 | 界面化图形展示 |
发布记录下载 | 不支持 | 支持 |
定时发布 | 支持 | 支持 |
代码质量 | 插件 | 支持 |
私有变量 | 不支持 | 支持 |
发布环境 | 不支持 | 支持切换 |
运行环境 | macos、linux、windows | macos、linux、windows |
代码覆盖率 | 插件 | 支持 |
执行外部文件 | 支持 | 支持 |
配置信息 | 繁琐 | 简单 |
gitlab-ci作为gitlab提供的一个持续集成的套件,完美和gitlab进行集成,gitlab-ci已经集成进gitlab服务器中,在使用的时候只需要安装配置gitlab-runner即可。
gitlab-runner基本上提供了一个可以进行编译的环境,负责从gitlab中拉取代码,根据工程中配置的gitlab-ci.yml,执行相应的命令进行编译。
gitlab-runner配置简单,很容易与gitlab集成。当新建一个项目的时候,不需要配置webhook回调地址,也不需要同时在jenkins新建这个项目的编译配置,只需在工程中配置gitlab-ci.yml文件,就可以让这个工程可以进行编译。
gitlab-runner没有web页面,但编译的过程直接就在gitlab中可以看到,不需要像jenkins进入web控制台查看编译过程。
gitlab-runner仅仅是提供了一个编译的环境而已,全部的编译都通过shell脚本命令进行。当然,jenkins也可以是全部的编译都通过shell脚本命令进行。
jenkins的好处就是编译服务和代码仓库分离,而且编译配置文件不需要在工程中配置,如果团队有开发、测试、配置管理员、运维、实施等完整的人员配置,那就采用jenkins,这样职责分明。不仅仅如此,jenkins依靠它丰富的插件,可以配置很多gitlab-ci不存在的功能,比如说看编译状况统计等。如果团队是互联网类型,讲究的是敏捷开发,那么开发=devOps,肯定是采用最便捷的开发方式,推荐gitlab-ci。
如果有些敏感的配置文件不方便存放在工程中(例如nexus上传jar的账户和密码或者是其他配置的账户密码),都可以在服务器中配置即可。
gitlab-ci对于编译需要的环境,比如jdk,maven都需要自行配置。在jenkins中,对于编译需要的环境,比如jdk,maven都可以在Web控制台安装即可。当然,jenkins也是可以自行配置的(有时候通过控制台配置下载不下来)。