标签归档:交付

理解CI和CD之间的区别

有关持续集成(CI)和持续交付(CD)的信息很多。多篇博文试图用技术术语解释这些方法的作用以及它们如何帮助您的组织。不幸的是,在某些情况下,这两种方法通常都与特定工具甚至供应商相关联。公司自助餐厅的一个非常常见的对话可能是:

  1. 您是否在团队中使用持续集成?
  2. 是的,当然,我们使用X工具

让我告诉你一个小秘密持续集成和交付都是开发方法。它们与特定工具或供应商无关。即使有工具和解决方案可以帮助你们(比如Codefresh),实际上,公司可以使用bash脚本和Perl单行来实践CI / CD(不是很实用,但肯定是可行的)。

因此,我们不会使用工具和技术术语来解释CI / CD的常见陷阱,而是使用最重要的内容来解释CI / CD:人们!

关于人的故事 – 软件集成的黑暗时代

认识爱丽丝,鲍勃,查理,大卫和伊丽莎白。它们都适用于SoftwareCo Inc.构建SuperBigProject应用程序。Alice,Bob和Charlie是开发人员。大卫是一名测试工程师。伊丽莎白是该团队的项目经理。

开发应用程序的传统方法如下:

Alice,Bob和Charlie都在他们的工作站上处理三种不同的功能。每个开发人员以单独的方式编写和测试代码。他们使用长期运行的功能分支,在合并到生产环境之前存在数周甚至数月。

在某个时间点,伊丽莎白(PM)收集了整个团队,并宣布:“人们,我们需要创建一个版本。请实现它!“

此时,Alice,Bob和Charlie正在争先恐后地将所有三个功能集成到同一个分支中。这是一个非常紧张的时间,因为这些功能以前从未一起测试过。由于错误的假设或环境问题,许多错误和问题突然出现(请记住,到目前为止,所有功能都只是在每个工作站上进行测试,彼此隔离)。

一旦这个高压力期结束,合并后的结果将传递给David,后者将执行额外的手动和自动测试。这段时间也很耗时,因为他可以批准或阻止发布,具体取决于发现了多少关键错误。所有的目光都落在大卫的身上,因为他的测试可以揭示可能会延迟释放的严重问题。

最后,测试结束了,伊丽莎白高兴地宣布该版本已准备好打包并运送给客户。

那么人们如何在这个虚构(但非常现实)的故事中感受到这种感觉?

  1. Alice,Bob和Charlie(开发)不满意,因为他们总是在即将发布的版本之前了解集成问题。整合期间感觉就像是同时出现多个问题的消防。
  2. 大卫(测试)不高兴,因为他的工作确实是不平衡的。在等待开发人员完成功能工作的平静时期。然后是测试阶段,当他被工作淹没,必须处理意外的测试场景,每个人都在看他的肩膀。
  3. 伊丽莎白(管理层)也不高兴。整合阶段是项目的关键路径。这是一个紧张的时期,因为任何意外的问题都会推迟产品的交付。伊丽莎白一直梦想着软件发布没有任何意外,但实际上这种情况从未发生过。估计项目时间表中的整合阶段始终是一个猜谜游戏。

团队中的每个人都不高兴。(顺便说一句,如果您的公司仍在开发这样的软件,请尝试了解此开发工作流程会损害您团队的士气。)

这里的主要问题是每个产品发布时发生单一 “集成”阶段。这是工作流程的痛点,它可以防止团队发布无压力版本。

将“连续”添加到集成

现在我们已经看到了“集成”的含义,很容易理解“持续集成”的含义。正如谚语所说,“ 如果事情是痛苦的,那就更经常地做。”持续整合本质上是以高频率重复整合步骤以减轻其痛苦。经常这样做的最明显的方法是在每个功能合并之后进行集成(而不是在宣布正式发布之前等待)。

当团队实施持续集成时……

  1. 所有功能都直接合并到主分支(主线)。
  2. 开发人员并非孤立地工作。所有功能都是从主线开发的。
  3. 如果主线是健康的,则认为功能已完成,而如果主线在其自身的单独工作站上工作则不会。
  4. 测试在功能级别和主线级别自动进行。

这就是持续集成的要点!当然,还有更多的细节(实际上有关于这个主题整本书)但主要的一点是,不是只有一个紧张的集成期,一切都在同时合并和测试,“整合”一直在发生以连续的方式。

持续集成是开发软件的更好方法(与“普通”集成相比),因为它:

  1. 减少合并功能时出现的意外数量。
  2. 解决“我机器上的工作”问题。
  3. 将测试时段切换为多个时段,其中每个要素逐渐合并到主线中(而不是一次性合并)。

结果是,使用CI工作的团队不是通过过山车生活(平静的开发时期,然后是压力释放),而是通过逐步的方式更好地了解项目的完成程度。

使用CI进行工作是现代软件开发的支柱之一。该技术已被很好地记录并且在此时已知。如果您今天没有在您的软件项目中练习CI,那么您的组织没有任何借口。

软件交付的黑暗时代

现在我们已经看到了“集成”的历史以及持续集成的工作原理,我们可以通过持续交付将其提升到新的水平。

如果我们回到原始故事,我们可以看到与发布方式类似的模式:

执行发布本质上是一个“大爆炸”事件。在认为软件被测试之后,有人负责打包和部署过程。将软件部署到生产也是一个非常紧张的时期,传统上涉及许多手动步骤(和检查表)。部署很少发生(有些公司每六个月部署到今天一次)。在极端情况下,部署发生在ONCE(瀑布式设计方法)。

仅在最终截止日期到来时提供软件会带来与不频繁集成相同的挑战:

  1. 通常发现生产环境与最后一分钟需要额外配置的测试环境不同。
  2. 在测试环境中正常工作的功能在生产中被破坏。
  3. 在发布时尚未准备好的功能根本不会提供给客户,或者他们甚至会进一步推迟发布日期。
  4. 发布会在开发人员(想要发布新功能)和操作(他们想要稳定性并且不希望一次部署太多新功能)之间产生紧张关系。

你应该能够在这里看到模式。如果我们通过更频繁地减轻“整合”阶段的痛苦,我们也可以为“交付”阶段做同样的事情。

将“连续”添加到交货

持续交付是指尽可能频繁地打包和准备软件(就像它被发送到生产中一样)的做法。最极端的交付方式是在每个功能合并之后。

因此,CD使CI更进了一步。将每个功能合并到主线分支后,不仅会对应用程序进行正确性测试,还会将其打包并部署到测试环境中(理想情况下与生产相匹配)。所有这些都以完全自动化的方式发生。请注意上图中缺少粘贴图(表示手动步骤)。

另请注意,每个新功能都是推动生产的潜在候选者。并非所有候选人实际上都被发送到生产。根据组织的不同,部署到生产的决策需要人为干预。人类只决定释放是否正在生产(但不准备释放本身)。该版本已在测试环境中打包,测试和部署。

持续交付比持续集成更难采用。这样做的原因是,由于每个候选版本都可能达到生产,因此整个生命周期需要自动化:

  1. 构建应该是可重复的和确定的。
  2. 所有发布步骤都应该是自动化的(这比听起来更难)。
  3. 所有配置和相关文件都应存在于源代码管理中(不仅仅是源代码)。
  4. 应在其自己的测试环境中测试每个功能/发行版(理想情况下以动态方式创建和销毁)。
  5. 所有测试套件都应该是自动化的并且相对较快(也比听起来更难)。

虽然云无疑可以满足所有这些要求,但软件团队(开发人员和运营人员)需要一定程度的纪律才能真正实现持续交付。

一旦CD到位,释放变得微不足道,因为只需按一下按钮即可执行。每个人(不仅仅是项目经理)都能看到当前的候选版本。当前版本候选版本可能没有所有请求的功能,或者它可能尚未满足所有要求,但就发布过程而言,这并不重要。重要的是,该版本经过全面测试和打包,随时可以发送到生产(如果需要)。任何项目利益相关者都应该能够开绿灯,并立即将产品发布到生产中。

如果您使用的是CD,则软件生命周期可以总结如下:

每个候选发布者总是提前准备好。人类决定是否也会将候选版本推向生产阶段。如果需要在将来召回,那么未达到生产的候选版本仍会存储为工件。

与持续集成一样,如果您想了解所有细节,还有一本关于持续交付的书籍

奖金:持续部署

CD中的“D”也可以表示部署。这种开发方法建立在持续交付的基础之上,基本上完全消除了所 任何被发现准备好(并通过所有质量和测试门)的候选版本都会立即投入生产。

不可否认,只有极少数公司能够像这样工作。在没有人的情况下直接投入生产不应该掉以轻心,在撰写本文时,许多公司甚至都没有实施持续交付,更不用说部署了。现在应该清楚的是,每种开发方法都需要先前的基础。

在升级之前,您的组织应确保每个基础都非常扎实。在Codefresh,我们看到许多公司试图通过试图在他们的CI / CD管道中窃取他们现有的做法(针对数据中心进行优化)而试图进入云时代,却没有真正理解其中一些做法现在已经过时了。尝试采用持续部署而不首先完全接受持续交付是一场失败的战斗。

查看这些方法涵盖的内容以及CD如何要求CI的另一种方法是下图:

确保以正确的顺序处理每个开发范例。定位持续交付是一个更加现实的目标,也是工具选择丰富的目标

https://thenewstack.io/understanding-the-difference-between-ci-and-cd/

自动化(或其他)快速云部署,亚马逊每11秒发布一次新的软件

您的IT和DevOps团队今天的移动速度有多快?无论答案是什么,可能还不够快。这不仅仅是我的观点 – 全球接受调查的CIO中有近90%认为,无论他们现在发布新产品和服务更新的速度如何,他们都需要在不久的将来更快地将其推出

这引发了全新的担忧:是否已经推出了新的功能和新功能,以至于IT尚未准备好提出有问题的,错误发布的前景?这些CIO中有四分之三的人似乎也这么认为!

当像亚马逊这样的公司每11秒发布一次新的软件更新时,难怪企业会感受到持续的压力,要求他们踩到天然气并将其保留在那里。但要紧跟这种创新速度更快的压力,并以不损害用户体验的方式这样做,需要进行一些内部创新 – 即通过建立持续创新和持续交付的渠道。

持续的管道使IT和DevOps能够更少地关注日常故障排除,更多地关注大图创新。但是,如果不首先投资自动化,你就无法获得这条管道。

自动化性能反馈

为了使企业能够可靠地为其用户群提供持续创新,而不会让客户体验处于风险之中,他们需要实施一种自动化的,以反馈为中心的文化。这需要通过内部和外部来实现。

例如,当开发人员团队正在开发新功能或服务更新时,需要在公司内部和外部对其进行严格测试。这可以通过A / B测试和早期访问beta周期等手段的组合来实现,以征求早期反馈并将其纳入开发周期。通过在开发早期自动建立对新功能的反馈,您可以将可能不会出现的潜在问题扼杀到过程的后期 – 或者因为反馈迟到而导致整体交付延迟(让您落后一步)您的竞争对手的速度有多快?或者因为这些问题根本没有被发现,您的团队最终会推出一个错误的发布版本。通过在整个技术堆栈中自动执行性能和依赖性分析,

构建一个可靠,一致和自动化的基于事实的反馈循环过程,在发布之前彻底测试新的创新,然后利用额外的反馈,以便将来证明更多的版本,有助于创建一个自给自足的持续创新和交付给您的最终用户。

通过信任建立反馈循环

但要达到这一点,完全需要其他东西:信任。希望创建持续交付模型的IT和DevOps团队需要首先在其组织中培养信任文化。这可能是企业在尝试建立连续管道时面临的最大挑战。

信任是双向的。IT团队需要知道他们可以依赖于每个可以按时,按时,按照用户期望和竞争对手设定的标准交付的高质量,具有发布价值的构建。与此同时,在这些团队中工作的人员也需要接受事情失败,特别是在CI / CD模型的初始阶段。而且,我们如何应对这些失败和错误至关重要 – 不是惩罚,而是利用它们作为学习经验,继续进一步改进并确保通过自动补救的交付过程 – 排除这些类型的失败从再次发生。

持续集成和交付不仅仅是软件挑战; 他们也是文化挑战。企业 – 无论是在IT还是整个企业 – 都需要敏锐地意识到他们在创建一个培养开发人员信任的环境中的责任,创建强大的自动化反馈循环,从而产生强大,高质量的功能和创新。

可以保持连续的连续管道

提供更好的软件 – 最终用户所需的各种版本和体验以及竞争对手所提供的 – 需要扩展DevOps以便以云的速度移动。这需要自动化。

自动化的持续交付管道使开发人员能够发布新的创新,通过基于事实的反馈循环周期进行测试,不仅速度更快,更一致,而且可以确保性能问题早期得到解决和修复。转变为连续的管道模型是允许创新以当今企业云环境所需的速度发生的,并确保开发人员能够在流程早期识别和修复潜在问题,以便推出新产品或功能正在满足您和您的用户 – 高标准。

在一天结束时,实际上没有办法解决这个问题:如果企业希望能够满足客户的期望,他们的DevOps团队需要投资建立自动化的连续管道。基于反馈回路基础的连续创新模型,能够自动修复性能问题,并以持续交付的节奏交付,是企业以云速度移动的最佳工具。