持续集成:是一种开发实践,要求开发人员每天多次将代码集成到共享存储库中。” (来源:ThoughtWorks)
“持续交付:是一种软件工程方法,团队可以在短时间内将软件部署到生产环境,确保在任何时候可靠地发布软件,并且在发布软件时可以手动进行。” (来源:维基百科)
CI/CD主要运用了jenkins进行对后端的开发代码的拉取,经过自动编译,打包,测试后,自动发布到tomcat服务器上,实现自动化的产品上线。
持续集成注重将各个开发者的工作集合到一个代码仓库中,通常每天会进行几次, 主要目的是尽早发现集成错误,使团队更加紧密结合,更好地协作。
持续交付的目的是最小化部署或发布过程中团队固有的摩擦, 它的实现通常能够将构建部署的每个步骤自动化,以便任何时刻能够安全地完成代码发布(理想情况下)。
持续部署是一种更高程度的自动化,无论何时代码有较大改动, 都会自动进行构建/部署。
通过持续集成,开发人员能够频繁地将其代码集成到公共代码仓库的主分支中。 开发人员能够在任何时候多次向仓库提交作品,而不是独立地开发每个功能模块并在开发周期结束时一一提交。
这里的一个重要思想就是让开发人员更快更、频繁地做到这一点,从而降低集成的开销。 实际情况中,开发人员在集成时经常会发现新代码和已有代码存在冲突。 如果集成较早并更加频繁,那么冲突将更容易解决且执行成本更低。
当然,这里也有一些权衡,这个流程不提供额外的质量保障。 事实上,许多组织发现这样的集成方式开销更大,因为它们依赖人工确保新代码不会引起新的 bug 或者破坏现有代码。 为了减少集成期间的摩擦,持续集成依赖于测试套件和自动化测试。
CD 集中依赖于部署流水线,团队通过流水线自动化测试和部署过程。此流水线是一个自动化系统, 可以针对构建执行一组渐进的测试套件。CD 具有高度的自动化,并且在一些云计算环境中也易于配置。
持续部署扩展了持续交付,以便软件构建在通过所有测试时自动部署。在这样的流程中, 不需要人为决定何时及如何投入生产环境。CI/CD 系统的最后一步将在构建后的组件/包退出流水线时自动部署。 此类自动部署可以配置为快速向客户分发组件、功能模块或修复补丁,并准确说明当前提供的内容。
采用持续部署的组织可以将新功能快速传递给用户,得到用户对于新版本的快速反馈,并且可以迅速处理任何明显的缺陷。 用户对无用或者误解需求的功能的快速反馈有助于团队规划投入,避免将精力集中于不容易产生回报的地方。
借助自动化,更快地交付产品,并且可以获得最终用户的反馈,因为需要完成的手动任务较少,可以更频繁地发布较小的变更到生产环境。
使用CI/CD,测试和部署过程是透明的。
任何问题都几乎可以立即看到,并且可以快速找到原因,从而减少了之前在查明问题原因时迫不得已的猜测。
由于漏洞易于跟踪,因此人们要承担责任。这并不意味着是时候进行追责了,这意味着能够快速找到解决该问题的最佳人选。
最终,增加了系统正常运行时间。
现代软件功能,项目和应用程序很复杂,错误也越来越复杂。
持续集成消除了其中的一些复杂性,减少了问题所在的领域,并增加了成功的可能性。自动化对于减少人为错误是必不可少的。如果计算机可以执行任务,请让计算机执行任务。
持续集成的两个主要原则是,频繁运行代码以及自动执行软件交付生命周期的构建和测试部分。每天多次运行代码集成意味着可以更快地发现错误,然后可以更快地纠正错误,因为每次要做的事很少。
开发人员的手动任务更少,这意味着更少的人为错误机会。从而,运维部门会收到高质量的代码,QA需要解决的问题较少。客户服务也不会收到那么多恼人的客户投诉邮件或投诉电话。每个人的工作都得到改善。
如果将可重复和可预测的任务移交给自动化,则可以为开发人员腾出时间来做他们喜欢的事情:开发。将繁琐,重复的任务留给计算机,让你的开发人员完成更有意义,更有创意的高级工作!
使用CI/CD,可以进一步分配相同数量的资源。因此,在保持原始业务约束的同时,还可以完成更多工作。
更快,更频繁的发布和更少的错误导致开发人员与其他业务部门之间的信任,按时完成任务,获得可靠的结果以及使最终用户更加满意。
CI/CD是双赢的。
随着 DevOps 的发展,新的用来实现 CI/CD 流水线的自动化工具也在不断涌现。像 GitHub 这样的代码仓库和 Jira 这样的 bug 跟踪工具随着 SaaS 这种交付方式变得更受欢迎, 许多工具都可以在现代开发人员运行应用程序的云环境中运行,例如 GCP 和 AWS。
最受欢迎的自动化工具是 Jenkins(以前的 Hudson), 这是一个由数百名贡献者和商业公司 Cloudbees 支持的开源项目。除了开源项目之外,还有一些更现代化的商业产品例如 CircleCI,Codeship 和 Shippable。
持续集成:Jenkins,Travis,TeamCity和Bamboo
(一旦部署了现代化的 CI/CD 流水线,您可能会意识到开发人员工作流程中的一些工具和流程也需要进行现代化改造。 测试是一个要着重关注的领域,如果您的部署频率是每天或者一天多次,您的每次测试可能需要数小时甚至一晚上才能完成。)
代码分析器/查看工具 –这些工具可查找代码格式和质量以及测试覆盖范围中的错误。SonarQube是该领域的流行工具。
有一些CI工具将帮助你更快地完成持续集成工作:
CircleCI:你可以免费开始使用CircleCI。这在GitHub项目中很流行,并且具有自托管和托管解决方案。
Jenkins:一个开源平台,可为你提供丰富的功能。
Pipelines:由Microsoft启动,此工具最多可供5位用户免费使用。
Gitlab CI:一个GitLab工具,也可以通过API与其他几个工具结合使用。它可以从Gitlab免费获得。
配置管理 –配置管理工具和数据库,通常会存储有关硬件和软件项目信息,并提供脚本或模板来自动化常见的任务。
这个领域常见的工具有: Chef,Puppet,和 Salt。
部署工具 –这些工具有助于软件的部署。许多CI工具也是CD工具,可帮助部署软件。
传统上,在Ruby中,Capistrano工具已被广泛使用。在Java中,Maven被许多人使用。所有编排工具也都支持这种部署。
编排工具 –这些工具可配置,协调和管理计算机系统和软件。它们通常将自动化”和“工作流”作为其服务的一部分。
Kubernetes是一种非常流行的编排工具,专注于容器。
Terraform也是一种非常流行的编排工具,它的应用范围更加广泛,包括云编排。
此外,每个云提供商都拥有自己的一套工具(CloudFormation,GCP Deployment Manager和ARM)。
监视工具 –这些工具允许监视硬件和软件。通过监视程序和日志文件等,以确保系统的运行状况。
Nagios和Prometheus是一种流行的监视工具。
持续交付工具
Azure Pipelines
Jenkins
Gitlab CI
GoCD
Spinnaker
工具总结
CircleCI
Jenkins(On-Premise)
Gitlab CI
GoCD
Spinnaker
TeamCity (On-Premise)
Travis CI
AppVeyor
Azure Pipelines
下面具体介绍几个CI/CD相关工具:
CircleCI
Gitlab CI
GoCD
Jenkins
Spinnaker
Travis CI
CircleCI与Jenkins对比
整体对比
后续我们将通过搭建相关环境,逐步实现CI/CD的流水线。