当前位置: 首页 > 科技观察

只需要一篇文章,彻底搞懂“持续集成”

时间:2023-03-13 17:54:17 科技观察

【.com原创稿件】本文全面介绍了持续集成相关的概念和工具,帮助您在确保保障的前提下实现各方面的交付和部署软件质量。项目目标。近年来,软件开发圈流行的一些热词有:持续集成(ContinuousIntegration,CI)、持续交付(ContinuousDelivery)、持续部署(ContinuousDeployment,CD),有时也简称CI/cd。无论是一个人的开发工作室还是大型跨国公司,每个人都在为自己的软件产品实践CI和CD。在本文中,我们将与您一起探索CI,向您简要介绍CD,以及如何有效地使用它们。我们还评估可帮助加速您的开发过程的流行工具和系统。持续集成:自动化开发流程和最佳实践为了说明持续集成如何适应现代软件环境,让我们首先简要了解一下典型的软件开发流程。如今,无论是网站、智能手机应用程序还是传统的桌面应用程序,通常都遵循简化的开发流程:开发人员编写一段代码,称为变更集或补丁,通常是对项目库(例如,添加新功能,或修复错误)。他们将更改后的代码集成(或合并)到项目的集中式权威代码存储库(例如GitHub存储库)中。如果涉及到现有的编程语言或应用程序,这些项目的源代码被编译然后构建成可部署的版本,它们通常被称为工件(artifacts或artifacts)或包。以上步骤是各种开发流程的简化步骤,省略了一些批量部署的策略性考虑。在详细考虑流程每个阶段的职责时,自然会想到两个关键问题:第一步,我们如何确保开发人员的变更集能够与现有项目集成?任何更改不应破坏现有代码库,即不应引入新问题。如何定义一个代码质量好的变化,在应用环境中又如何判断?尤其是那些关系到人身安全的医疗应用。谁(或什么工具)控制和保证上面的第二步和第三步?在CI开发模式中,我们需要通过自动化来回答上述问题。例如:对于第二步和第三步,我们需要验证开发者的改动是否能够被主代码库接受和集成,整个团队是否能够顺利完成项目的构建并运行相关测试。因此,在理想的CI环境中,每一段代码都是在开发过程中集成的。对于此类企业,代码集成每天发生多次(更重要的是,每次提交)。什么是持续交付和持续部署?持续交付和持续部署将自动化提升到一个新的水平。他们可以自动分发你的最后一次提交并成为整个软件的新版本。持续交付:指构建工件并使其为部署做好准备的过程。通常,需要人工来确定是否确实需要部署。持续部署:意味着所有流程都是自动化的。即:通过一次提交触发自动化管道并最终将您的应用程序生产环境更新到最新版本而无需人工干预的过程。虽然许多公司实现了持续交付,但很少有公司实现了持续部署。此外,持续部署是有风险的,因为任何人都可以通过简单的提交将错误引入生产。因此,我们需要降低这种风险的流程。持续集成的好处过去,在非CI环境中,人们对软件项目主要采用主干-分支(trunk-branch)版本控制。开发人员长期在分支上开发各种功能。随着时间的推移,他们倾向于在不知不觉中让分支偏离主干,因为他们将他们的更改与其他开发人员集成。因此,开发人员经常努力集成分支功能,以确保所有更改都与生产系统兼容,他们甚至创造了一个词组——“集成地狱”。今天的CI工作流通过简单的常规集成解决了这个问题。持续集成不仅节省了开发人员不得不手动集成各种更改的时间,而且还提高了软件的可靠性。这使开发团队能够更有信心地编写代码(和相关测试)、添加新功能并自动将版本推送给用户。持续集成实践的前提当我们采用持续集成工作流时,会涉及到以下必要条件:版本控制系统工具构建工具ArtifactsRepositoryManager(工件库管理器)持续集成依赖于版本控制系统持续集成是最重要的前提是其代码库的版本控制,即代码库的每一次变更都必须安全地存储在专有的版本控制系统(ConcurrentVersionsSystem,VCS)中。一旦实现了代码版本控制,我们就可以使用CI工具来访问它。在市面上流行的VCS工具中,Git是最受欢迎的一种。下面简单介绍一下。Git最初是由LinusTorvalds为Linux内核创建的,其主要特性包括:支持非线性开发:Git分支(和合并)发生在开发人员的计算机上。分布式开发:每个开发人员都有整个存储库历史记录的本地副本。高效处理大型项目:Git在处理大型代码库时能够快速执行性能测试。用户身份认证:通过加密和签名,实现提交者的真实性。代码历史的加密认证:就像在区块链中一样,特定提交的ID取决于它之前的内容,更改Git中的历史会更改其提交ID。垃圾收集:未使用的对象会自动被垃圾收集。如果空间不足,您还可以显式调用垃圾收集来清理Git存储库。与构建工具实现持续集成构建工具可以通过处理应用程序的源代码自动生成所需的软件。一般来说,构建软件工具的步骤取决于所选的技术栈。以下是构建Java应用程序的步骤示例:如果需要,从现有配置生成.java文件。将源代码(.java文件)编译成字节码(.class文件)。将测试代码编译成字节码。执行各种单元测试。根据需要进行集成测试。将多个.class文件打包到一个JAR存档中。按需JAR文件存放到工件库管理器中。根据需要在控制系统版本中标注相应代码。对于上面的例子,我们一般可以使用以下构建工具:Ant,一个Java技术的基于XML的跨平台生成工具。Maven是一种基于XML的广泛声明,它赞成约定优于配置。以上两种典型的施工工具和工艺都具有重复施工的能力。这意味着只要是同一组源代码,就应该产生同一组工件输出。例如:对于相同的代码库,无论是开发人员在笔记本电脑上构建它还是在CI系统上构建它都应该产生相同的结果。这会带来以下好处:首先,通过消除代码在开发者笔记本电脑上运行和在数据中心服务器上运行的差异,可以减少在开发环境和生产环境运行时可能出现的异常问题。你永远不会听到“它在我的电脑上运行良好!”了。其次,如果测试在CI系统中通过,它会最大限度地减少对生产环境的干扰,因为运行的代码是相同的。最后,如果它们能够以一致且可重复的方式构建,那肯定会提高工件的缓存效率并在不同阶段之间共享二进制文件。使用工件存储库管理器存储各种持续集成过程的结果正如源代码需要存储在VCS中一样,生成构建过程的工件也需要存储在某个远程文件系统中。因此,我们可以使用专用软件,例如二进制存储库管理器(BinaryRepositoryManager)来管理工件。维基百科对二进制库管理器的定义如下:它是一种软件工具,旨在优化软件开发过程中生成和使用的二进制文件的下载和存储。组织使用它来集中管理二进制工件,从而克服多种二进制工件类型的复杂性,从而减少整个工作流之间的依赖性。可以看出,神器库管理器有以下主要功能:缓存:由于库管理器会安装在公司系统中,开发者可以比远程访问更快地访问它。通过设置为代理服务器,它可以缓存那些下载的第三方工件并加快访问速度。保护策略:库管理器可以自动清除未使用的工件以回收宝贵的空间。高可用:由于librarymanager的下线势必会影响企业项目建设的顺利进行,我们可以将librarymanager做成一个集群,让开发者和CI工具可以随时访问。用户限制:***库管理员可以通过限制访问权限为工件定义相应的用户和组。从开发到实际构建的简单CI工作流程由于不同的企业使用不同的软件、堆栈和用例,因此他们的CI工作流程也可能有所不同。下面以一个简单的工作流为例,探讨一下从开始开发到实际构建的自动化过程。Forks我们一般有两种可能从代码库中获取***副本:如果是***访问,则需要“下载”。即:使用gitclone命令将Git远程代码库复制到本地。如果存储库已经存在于本地,您可以使用gitpull之类的命令将其与远程存储库同步。在版本控制系统中,有一个专有分支可以指向软件最新稳定的版本(通常称为主版本),这正是我们需要发布到生产环境的。为了保留这个黄金标准版本并避免各种错误,我们不应该直接写入它。因此,每次开发都应该从创建主版本的专用分支开始。同时,为了保持代码的有序性,我们也应该尽可能采用分支的命名方案。常用的前缀包括:develop、feature、release、hotfix等。测试根据具体情况,可以提前编写测试计划,即:测试驱动设计(Test-DrivenDesign);也可以在代码完成后再写。无论是之前还是之后,我们都需要进行回归测试,以保证代码的稳定运行。测试代码的覆盖范围也应视具体情况而定:对于涉及人类生命的软件,例如飞机导航或手术辅助,每一行代码都需要检查(甚至双重或三次检查)。在其他情况下,测试覆盖率不一定那么高。拉取请求(PullRequest)记住,不要直接修改master,而是在一个专门的分支上。一旦开发完成,团队成员应该考虑是否将更改合并到master分支中。所以pullrequest的目标是这样的:你问你的团队是否接受改变作为黄金标准,并打开你的补丁供其他人审查。一旦拉取请求被打开,分支就会使用项目的构建工具自动构建,并确保更改不会破坏我们的主分支。质量保证一般情况下,我们还会进行其他步骤,包括:对提交的代码进行安全性、代码质量、文档标准等的自动审查。说到代码质量,就不得不提SonarQube(https://www.sonarqube.org/),这是该领域知名的开源平台。SonarQube可以与所有主要的CI工具集成,以对代码库执行配置检查。下面是对ContinuousInspection的解读:SonarQube不仅可以展示一个应用的健康状态,还可以突出显示各种新引入的问题。使用QualityGate,您可以通过修复错误来系统地提高代码质量。一旦启动构建pullrequest,自动构建就会通过各种CI工具自动进行编译、测试、打包等步骤。当然,如果一个(或多个)自动化构建步骤失败,我们就认为整个构建失败了。在大多数CI工具中,失败的构建显示为红色,而绿色表示已通过的构建。出于这个原因,您可能会听到有人将通过的构建称为“绿色构建”。相反,如果构建失败,无论出于何种原因,它都会返回给启动拉取请求的开发人员来修复它。代码审查虽然SonarQube等工具可以检测简单的错误模式,例如双重检查锁定(DoubleCheckedLocking,https://fr.wikipedia.org/wiki/Double-checked_locking),但更复杂的错误需要手动代码审查。因此,将代码更改合并到master之前的最后一步是:团队成员手动代码审查(这就是拉取请求的全部内容)。不同的开发人员会有不同的代码审查方法。但我建议你从基础开始,比如你可以参考:Whattolookforcodereview?(https://leanpub.com/whattolookforinacodereview)。标记、版本控制和存储构建工件代码更改最终合并到master中,并在此阶段作为热修复发布。CI工具还将再次重放构建以确保没有出错。首先,VCS需要用对应的版本标记版本。虽然在企业的实际发展过程中,人们经常会用某个山名、湖名,甚至是蛋糕名来增加创意,比如:Ubuntu的“波澜不惊的穿山甲”,Android的“奥利奥”。但原则上,软件开发者应该遵循规范的语义版本,采用一套标准的版本控制方案和命名规则(如使用数字编号)来区分和定义主要版本、次要版本和错误修复版本。有关详细信息,请参阅semver.org。其次,构建产生的工件应该存储在工件库管理器中。这允许您在异常情况需要“回滚”操作时使用以前的工作版本而无需重建源代码。持续集成工具概述随着持续集成的广泛应用,相关工具的生态系统也日趋成熟。让我们讨论一些当今最流行和最常用的CI/CD系统。它们被完全在云服务上运营的初创企业,以及内部使用复杂CI平台的大型组织所使用。JenkinsJenkins是持续集成领域历史最悠久、使用最广泛的开源项目之一。该工具有利也有弊:其核心架构多年来经过了从小型部署到大型企业生产环境的实战检验。另外,Jenkins有一个“充满活力”的在线用户社区,可以帮助您找到问题的解决方案。当然,对于一些遗留代码库庞大、向后兼容的需求,其内部抽象机制可能有些过时,并且可能经常跨不同的用户场景泄漏。此外,虽然Jenkins拥有广泛的插件生态系统并提供了许多时髦的功能,但由于这些插件通常是社区开发的,因此它们的质量和可靠性可能会有所不同。近年来,Jenkins常被描述为一个持续集成的工作流,即:pipelines(参见:https://jenkins.io/doc/book/pipeline/)。开发人员可以使用它来声明和描述与构建和部署相关的过程。此外,Jenkins还允许您创建可以在不同项目中重复使用的不同模块,以标准化和简化常见流程。总之,Jenkins有着悠久的开发和应用历史,以及庞大而活跃的社区支持,并且可以高度定制化。可以说,一旦开发者掌握了它,就远离了失业的风险。TravisCITravisCI与Jenkins几乎处于同一水平。尽管它有很多开源组件,但如果没有企业帐户,您将无法采用自托管模式。但是,使用任何开源项目运行Travis都是免费的。Travis运行的每个任务都必须包含在travis.yml文件中,该文件也需要加载到您的代码片段中。这意味着您可以从存储库的不同分支运行不同的任务。Travis就是简单。您可以直接从GitHub托管的存储库工作,并维护一个跨许多应用程序的公共服务存储库。当然,如果您不使用GitHub,或者需要更多控制权,Travis可能不适合您。Travis的一个有用特性是能够在多个操作系统上运行,即:您可以在不同的目标系统上测试您的代码,而无需维护各种虚拟机或映像。GitLab持续集成/持续交付GitLab以源代码托管服务起家。它与GitHub有相似之处,但也提供开源版本。不过,与GitHub不同的是:GitLab包含一个名为AutoDevOps的高级CI/CD实现,内置于平台中。对于已经使用GitLab存储源代码的用户,这种紧密集成是GitLab可以在CI/CD上提供的最有用的功能之一。您可以通过在源存储库的根目录中添加.gitlab-ci.yml配置文件来启用它。当然,你也可以将GitLab的CI/CD与GitHub的仓库集成。BambooBamboo是Atlassian的持续集成/持续交付产品。该公司的另一个知名软件产品是JIRA——一种错误跟踪软件。Bamboo的主要优点是它可以与已经在自己的系统中使用的其他Atlassian产品(例如JIRA和Bitbucket)紧密集成。不过,相对于其拥有大量插件市场的优势,Bamboo的用户群体并不大,因此用户需要更多依赖Atlassian自身的支持。CircleCICircleCI是一个提供强大CI平台的在线服务,当然它也提供托管版本。CircleCI平台主要服务于容器,可以为测试提供快速扩展(spin-up)。其工作流程功能允许用户为复杂项目自定义CI和CD作业序列。CircleCI的主要优势在于它是一个完全托管的CI解决方案,从而减少了最终用户花在系统维护上的时间。结论仅仅通过选择正确的持续集成最佳实践和工具,我们不能保证我们可以使我们的组织走上正确的CI轨道。对于许多传统软件公司来说,他们还需要改变整个软件开发团队的协作方式。为了能够成功地将一套完整的变更集集成到代码库中,团队成员应该事先就各种工作模型和规范达成一致,并能够坚持下去。为了实现可靠的构建步骤,团队成员有时不得不在生产环境中对各种问题进行严格的重构和持续部署,从而拓宽整个团队的设计视野。综上所述,持续集成给软件组织带来的好处是不言而喻的。既然已经成为一种新的软件规范,企业必须采用持续的CI实践来加速项目交付并提高质量。【原创稿件,合作网站转载请注明原作者和出处为.com】