`
wx1569466809
  • 浏览: 72068 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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


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

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

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

自动构建流程

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

虽然开发人员可以手动构建,但这样操作有诸多不利。首先,从主动开发到创建构建的转变中引入了上下文转换,使得开发人员不得不停止生产效率更高的工作来专注于构建过程。其次,每个开发人员都在制作自己的工件,这可能导致构建过程不一致。

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

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

  • 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的初学者能藉由本文得以入门。

转载于:https://my.oschina.net/u/3330830/blog/3084549

分享到:
评论

相关推荐

    GitHub新手入门详解-代码管理与协作必备

    其他说明:本文还讨论了一些高级话题,比如处理代码冲突的方法、GitHub的技术难点以及相关技术(例如Git LFS、CI/CD集成)的应用方式。对于希望深入了解和优化GitHub使用的用户来说是非常有价值的学习资料。

    Linux 从入门到精通实战

    在《Linux 从入门到精通实战》这本学习文档中,作者提供了全面的Linux知识体系,旨在帮助读者从零开始逐步掌握Linux操作系统,并将其应用于企业级环境中。文档分为基础篇、进阶篇和高级篇三个部分,涵盖了从基本操作...

    嵌入式linux入门到精通

    本资源"嵌入式Linux入门到精通"是一个全面的学习指南,旨在帮助初学者理解并掌握这一领域的核心概念和技术。 一、Linux基础知识 1. Linux操作系统:Linux是一种自由开源的操作系统,基于Unix,由全球各地的开发者...

    NC开发指南(入门到精通).pdf.zip

    《NC开发指南(入门到精通)》是一本深入探讨NC(Network Computing)开发技术的书籍,旨在帮助初学者和有经验的开发者系统地理解和掌握NC开发的核心知识。这本书的PDF版本被压缩在"NC开发指南(入门到精通).pdf....

    jenkins入门手册

    - **下载地址**: Jenkins 的官方镜像站点为 http://mirrors.jenkins-ci.org,提供了多种类型的安装包,推荐初学者选择 war 包。 - **安装方法**: 将下载好的 war 包放置于 Tomcat 或 Jetty 的 webapps 目录下,通过...

    Java开发资源库

    Java开发资源库是一个全面的学习平台,专为Java初学者和有经验的开发者提供从入门到精通的全方位指导。这个资源库包含了大量的实例和项目,帮助用户深入理解和实践Java编程语言的核心概念和技术。以下是对资源库中...

    测试新手学习宝典适合刚入门的测试人员

    8. **持续集成与持续部署(CI/CD)**:理解Jenkins、GitLab CI/CD等工具的使用,有助于实现测试过程的自动化和效率提升。 9. **性能测试**:使用工具如JMeter、LoadRunner进行压力测试,了解如何模拟高并发场景,评估...

    软件测试(入门级教程)

    4. 持续集成:集成自动化测试到持续集成/持续部署(CI/CD)流程中。 六、敏捷与持续测试 在敏捷开发中,测试是贯穿整个开发过程的。持续测试强调尽早并频繁地进行测试,与开发同步,促进快速反馈和改进。 七、测试...

    Linux编程入门之 C 语言环境

    Linux编程入门之C语言环境是针对初学者设计的一份教程,旨在帮助读者掌握在Linux操作系统中使用C语言进行编程的基础知识。C语言是一种强大的、低级的编程语言,被广泛应用于系统开发、嵌入式系统以及各种软件工程。...

    linux初学文档

    本文档面向Linux初学者,涵盖了从基础入门、系统安装、命令使用、编程基础、嵌入式系统基础、开发环境搭建到文件I/O编程等多方面内容,内容全面,细致入微。 1. Linux快速入门 Linux快速入门章节主要介绍了嵌入式...

    ios软件入门

    13. **持续集成与持续部署(CI/CD)**:了解Jenkins、Fastlane等工具,实现自动化构建和发布流程,提高工作效率。 14. **iOS权限管理**:学习如何请求用户权限,如相机、照片库、位置等,以满足应用的功能需求。 15....

    ToDoList前半部分

    12. **持续集成/持续部署(CI/CD)**:虽然对于入门项目可能不是必需的,但了解如何配置CI/CD可以帮助开发者自动化测试和部署过程。 13. **单元测试与UI测试**:学习编写单元测试和UI测试,能确保代码功能的正确性...

    Web编程入门——字节跳动.zip

    Web编程入门是初学者踏入互联网开发世界的基石,它涵盖了网页设计、服务器端处理以及客户端交互等核心概念。字节跳动作为全球知名的信息技术公司,其提供的Web编程入门教程无疑为学习者提供了一条清晰的学习路径。在...

    Android程序员入门开发宝典

    《Android程序员入门开发宝典》是一本专门为初学者设计的指南,旨在帮助那些对Android开发感兴趣的人快速掌握基础知识,步入专业开发者的行列。这本宝典涵盖了从安装开发环境到编写第一个应用程序的所有关键步骤,是...

    安卓工具箱

    "安卓工具箱"是一个专为Android初学者设计的资源集合,包含了各种实用工具和学习资料,旨在帮助初学者快速入门并提升在Android开发中的技能。这个工具箱可能涵盖了多个方面,包括但不限于编程环境搭建、代码调试、...

    程序设计经验杂谈

    7. **持续集成/持续部署(CI/CD)**:CI/CD流程能自动化代码构建、测试和部署,提高开发效率,减少人为错误。 8. **设计模式**:设计模式是解决常见问题的最佳实践,如单例模式、工厂模式、观察者模式等,熟练运用...

    os-starter:一站式项目入门者集合

    8. **持续集成/持续部署(CI/CD)**:可能利用Jenkins、Travis CI或GitHub Actions等工具实现自动化构建和部署,了解CI/CD流程和配置至关重要。 9. **Docker容器化**:项目可能使用Docker进行应用的打包和部署,学习...

    Linux入门及常用命令(嵌入式开发必学)

    ### Linux入门及常用命令详解(嵌入式开发必备) #### 一、概述 Linux作为一种广泛使用的开源操作系统,在服务器、云计算、物联网以及嵌入式设备等领域占据着重要地位。对于从事嵌入式开发的工程师而言,掌握Linux...

    第2章-开始学习.zip

    9. **持续集成/持续部署(CI/CD)**:了解如何设置Jenkins或GitHub Actions自动化构建和部署流程,可以提高开发效率并确保产品质量。 10. **性能优化**:包括内存管理、图形渲染优化、帧率稳定等,是提高游戏体验的...

    Java开发秘籍,+你敢下载,你就敢不后悔,

    Java开发秘籍是一份全面而深入的学习资源,旨在帮助开发者从初学者逐步成长为Java编程的高手。这份资源包含了丰富的教程、培训材料以及实战指导,旨在让学习者掌握Java的核心概念和高级技巧,确保他们在Java开发领域...

Global site tag (gtag.js) - Google Analytics