从0到1了解CI/CD:初学者入门必备

本文先介绍了系统构建的先决技术与实践,自动化构建、版本控制,并给出了Java环境下一些构建工具,而后分别介绍了持续集成(CI)、持续交付和持续部署(CD)的概念及其优点,并在最后给出了一些最佳实践,如确保部署一致、保证良好的测试覆盖率等。数据库


现代软件开发的需求加上部署到不一样基础设施的复杂性使得建立应用程序成为一个繁琐的过程。当应用程序出现规模性增加,开发团队人员变得更分散时,快速且不断地生产和发布软件的流程将会变得更加困难。安全

为了解决这些问题,开发团队开始探索新的策略来使他们的构建、测试和发布流程自动化,以帮助其更快地部署新的生产。这就是持续交付和持续集成发展的由来。服务器

本文将介绍什么是CI/CD而且它是如何帮助团队迅速开发部署通过充分测试、可靠的软件。在了解CI/CD及其优点以前,咱们应该讨论这些系统构建的一些先决技术和实践。运维

自动构建流程分布式

在软件开发过程当中,构建流程会将开发人员生成的代码转换为可执行的可用软件。对于Go或者C语言等编译语言,此阶段须要经过编译器运行源代码以生成独立的二进制文件。对于Python或PHP等解释性语言,没有编译的步骤,可是代码依旧须要在特定的时间内冻结、绑定依赖项、打包以便于分发。这些过程一般称为“构建”或“发布”的工件。工具

虽然开发人员能够手动构建,但这样操做有诸多不利。首先,从主动开发到建立构建的转变中引入了上下文转换,使得开发人员不得不中止生产效率更高的工做来专一于构建过程。其次,每一个开发人员都在制做本身的工件,这可能致使构建过程不一致。单元测试

为了解决这些顾虑,许多开发团队配置了自动构建流水线。这些系统监视源代码存储库,并在检测到更改时自动启动预配置的构建过程。这一配置无需牵涉过多的人力在其中而且确保了每一个构建过程一致。测试

市场上有许多帮助用户自动化这些步骤的构建工具,如下列出了在Java生态下比较受欢迎的构建工具:spa

  • Ant:Apache Ant是一个开源Java库,建立于2000年。它是Java领域的原始构建工具,至今仍然被频繁使用。
  • Maven:Apache Maven是一个自动化构建工具,主要是为Java项目编写的。不一样于Apache Ant,Maven遵循约定优于配置的原则,仅须要针对偏离合理默认值的构建过程的方面进行配置。
  • Gradle:在2012年推出的1.0版本中,Gradle尝试经过结合Maven的现代功能来融合Ant和Maven的优点,同时又不失Ant提供的灵活性。构建指令是用一种名为Groovy的动态语言编写的。尽管在这个领域,这是一个相对比较新的工具,但它已被普遍采用。

版本控制版本控制

大部分现代软件开发须要在共享的代码库中进行频繁协做。版本控制系统(VCS)用于帮助维护项目历史记录,并行处理离散特征,以及解决存在冲突的更改。VCS容许项目轻松采用更改并在出现问题时回滚。开发人员能够在本地计算机上处理项目,并使用VCS来管理不一样的开发分支。

记录在VCS中的每一个更改都称为提交。每一个提交都对代码库的更改进行编目分类,元数据也包含在其中,例如关于查看提交历史记录或合并更新的描述。

图1 分布式版本控制

虽然版本控制是一个十分有价值的工具,它能帮助管理在单一代码库中许多不一样的更改。但分布式开发一般会为其带来挑战。在没有按期合并到共享集成分支的状况下在代码库的独立分支中进行开发可能会使之后合并更改变得困难。为了不这一状况,开发人员开始采纳持续集成实践。

持续集成(CI)

持续集成(CI)是一个让开发人员将工做集成到共享分支中的过程,从而加强了协做开发。频繁的集成有助于解决隔离,减小每次提交的大小,以下降合并冲突的可能性。

为了鼓励CI实践,一个强大的工具生态已经构建起来。这些系统集成了VCS库,当检测到更改时,能够自动运行构建脚本而且测试套件。集成测试确保不一样组件功能能够在一个组内兼容,使得团队能够尽早发现兼容性的bug。所以,持续集成所生产的构建是通过充分测试的,而且是彻底可靠的。

图2 持续集成的过程

持续交付和持续部署(CD)

持续交付和持续部署是在构建持续集成的基础之上的两种策略。持续交付是持续集成的扩展,它将构建从集成测试套件部署到预生产环境。这使得它能够直接在类生产环境中评估每一个构建,所以开发人员能够在无需增长任何工做量的状况下,验证bug修复或者测试新特性。一旦部署到staging环境中,就可能须要进行额外的手动和自动测试。

持续部署则更进一步。一旦构建在staging环境中经过了自动测试,持续部署系统将会自动将它部署到生产服务器上。换言之,每一个经过测试的构建都是实时的,可供用户及早反馈。这使得团队能够不断发布新特性和修复bug,并以其测试流程提供的保证为后盾。

图3 CI / CD流程路线图

CI/CD的优点

持续集成、交付和部署对软件开发过程有显著的改进。下文将简单介绍一些CI/CD的主要优点:

快速反馈回路

对于一个快速的开发周期,快速反馈回路显得尤其重要。为了可以实时接收反馈,软件必须迅速触达终端用户。而CI / CD能够经过简化更新生产部署来提供实现此目标的平台。经过要求每一个更改都通过严格的测试,CI能够帮助下降每一个构建的相关风险并所以使得团队能够便捷地向用户发布有价值的特性。

增长可见度

CI/CD一般是指将IT流程的各个步骤按序列组成一条流水线,且该流水线对整个IT团队(包括开发、测试、运维等团队)都可见。所以,每一个团队成员能够跟踪系统中的构建状态而且能够肯定任何致使测试失败的构建。团队成员经过深刻了解代码库的当前状态,能够更轻松地规划最佳行动方案。这样的可见度为这一问题提供了一个明确的答案——“我提交的更改是否破坏了构建?”

简化故障排除

尽管CI的目标是集成并测试每一个发生在代码库中的更改,可是更安全的方式是每次提交都是小型的并尽早将它们合并到共享代码存储库中。如此,当找到bug时,肯定和问题相关的更改会更加容易。毕竟,根据问题的严重程度,团队能够选择回滚或编写并提交修复,从而减小生产中解决问题的时间。

软件质量更高

自动化构建和部署流程不只缩短了开发周期,并且帮助团队开发出品质更好的软件。由于每一个更改都会通过充分的测试而且至少会部署在一个预生产环境中,所以团队能够毫无顾虑地将更改部署到生产中。不过,只有当代码库的全部级别,从单元测试到更复杂的系统测试,都有良好的测试覆盖率时,才能实现这一点。

集成问题更少

由于自动化测试套件在每次提交时自动生成的构建上运行,因此能够尽早检测并修复集成问题。这使开发人员可以及早了解当前正在进行的工做是否可能影响其代码。它会在一开始就测试由不一样贡献者编写的代码是否兼容,而不是在以后可能出现其余问题的时候才开始测试。

有更多的时间专一于开发

CI/CD系统依赖自动化来生产构建而且经过流水线来迁移新的更改。因为不须要手动干预,所以构建和测试再也不占用开发团队大块的时间。进而开发人员能够心无旁骛地对代码库进行有效的更改,由于若是构建过程当中出现任何问题,自动化系统会通知他们。

持续集成和交付的最佳实践

既然咱们已经了解了使用CI/CD的一些优点,那么接下来,咱们将讨论一些指导原则来帮助您成功实现这些流程。

对CI / CD流水线负责

开发者直到更改被部署到预生产环境中,才无需对其提交的代码负责。这意味着开发者必须确保他们的代码集成正确而且随时能够部署。若是提交的更改违反了这些要求,则开发人员有责任快速提交修复以免影响其余人的工做。构建失败应该暂停流水线并阻止不参与修复故障的提交,这使得快速解决构建问题变得相当重要。

确保部署一致

部署过程不须要手动操做,反而流水线须要自动部署流程以确保一致性和可重复性。这减小了将破坏性构建推向生产的可能性,并有助于避免出现一些难以重现的、未经测试的配置。

将代码库提交到版本控制

将每次更改提交到版本控制是十分重要的。这会帮助团队审核全部提交的变动而且让团队能够简单地还原出现问题的提交。同时,也能够保持配置、脚本、数据库和文档的完整性。若是没有版本控制,特别是当多人使用同一个代码库时,会很是容易丢失配置和代码更改或对其处理不当。

提交小的、渐进的更改

开发人员必定要牢记:更改必须是小的。由于等待引入更大批量的更改会延迟测试反馈,会更难以肯定问题的根本缘由。

良好的测试覆盖率

因为CI / CD的目的是减小手动测试,所以整个代码库应该有一个良好的自动化测试覆盖率,以确保软件按预期运行。此外,还应该按期清理冗余或过期的测试以免影响流水线。

测试套件中不一样类型测试的比例应和“测试金字塔”模型类似。大多数测试应该是单元测试,由于它们拥有基本功能的同时还能够快速执行。此外,还要有较少数量的集成测试,以确保组件能够一块儿成功运行。最后,应在测试周期结束时包含少许回归、UI、系统和端到端测试,以确保构建知足项目的全部行为要求。可使用像JaCoCo这样的工具来肯定测试套件涵盖了多少代码库。

图4 测试金字塔

结 语

CI/CD的出现大大提升了开发团队的生产效率,缩短了开发周期。其敏捷、稳定、可靠的特性,也愈来愈被企业所青睐与须要。本文先介绍了系统构建的先决技术与实践,自动化构建、版本控制,并给出了Java环境下一些构建工具,而后分别介绍了持续集成(CI)、持续交付和持续部署(CD)的概念及其优点,并在最后给出了一些最佳实践,如确保部署一致、保证良好的测试覆盖率等。但愿能帮助你们厘清CI/CD的特性及功能,同时也但愿CI/CD的初学者能藉由本文得以入门。

相关文章
相关标签/搜索