CI/CD:DevOps背后的推动力-程序员宅基地

DevOps的出现并非只是为了顺应开发人员和运维人员应该协同合作的理念,更大程度上,它是企业在走向现代化应用交付的过程中需要经历的文化转型。DevOps的最终目标是能够更频繁地发布高质量的软件,并通过促进沟通和协作来实现这一目标。

\\

Octopus Deploy创始人兼首席执行官Paul Stovell说:“现如今,团队应该做出更快的改变。如果没有开发人员和运维人员成功合作,实现快速改变的机会几乎为零“。

\\

CI/CD管道是DevOps背后的推动力,这种推动力依赖DevOps的内聚性,并将其带入到现代软件的开发和交付当中。

\\

来自CA Technologies的持续交付总经理Jeff Scheaffer说:“正在进行数字化转型的公司在面临组织变革时,DevOps通常被认为是一剂良药,但CI/CD管道才是推动DevOps走向成功的引擎,帮助企业更快地交付更好的应用。这是企业从手动转向自动化、从单体应用交付转向现代应用交付的核心业务流程“。

\\

OpsGenie联合创始人兼工程副总裁Sezgin Küçükkaraaslan说,在讨论DevOps时经常会提到CI/CD管道,因为它在团队之间建立起了桥梁,并帮助他们看到了更大的蓝图,这个蓝图就是能够成功构建出软件系统,并交付给用户。

\\

他说:“CI/CD管道是将代码移交到生产环境最快的一种方式。开发人员能够通过自动化且不易出错的方式轻松地构建、打包、集成、测试和发布代码“。

\\

Küçükkaraaslan补充道,DevOps专注于文化,而CI/CD管道则专注于能够帮助团队适应不断变化的文化的过程和工具。

\\

Stovell说,CI/CD管道是DevOps的关键推动者,因为它消除了DevOps流程中的摩擦因素,从而可以更快地发生变化和投入生产。他还解释说,消除的摩擦越多,发生变更的周期就越短。“这意味着你正在推动业务向前发展,并创造出了一个反馈闭环以及持续改善的环境”。

\\

如何保持管道的流动性

\\

Mobile Labs总裁兼首席执行官Dan McFall说,管道“实际上是发布流程自身的一个循环。它是一个持续的过程,包括编写代码、测试代码、部署代码、在生产环境中重新测试,然后再次完成对整个过程的反馈。这是实现高质量发布并持续运作一切的能力“。

\\

如果能够从更宽泛的角度来思考管道,它将会让你看到更完整的生命周期,不仅包括了将软件交付到生产环境,还会看到它时如何交付的以及交付之后会发生什么。Stovell说,如果事情失败了,你可以看到出了什么问题,并很容易进行恢复。

\\

API Fortress创始人Patrick Poulin说,CI/CD管道中最重要的方面是C,它代表持续性。为了在CI和CD方面获得成功,你必须“具备在不影响其他事情的情况下持续前进的能力”。

\\

管道包含了一个发布阶段,首先你要知道自己要交付什么,然后进入测试阶段、预生产阶段、部署阶段,最后进入生产环境。来自XebiaLabs的首席产品官Robert Stroud说,这当然是一种经过简化的管道,它的基本思想是以自动的方式经过这些阶段或批准点。“目前业界存在几个切入点,我们将这些切入点交给开发团队、测试团队、阶段发布团队和部署团队,而只有自动化所有这些步骤和阶段才能真正加速整个过程。”

\\

来自CA的Scheaffer说,之所以被形象化地称为管道,是因为在理想情况下,变更是从头到尾一个接一个地发生。

\\

来自OpsGenie的Küçükkaraaslan说,从更高的层面来看,管道“包括在代码库合并之前进行的编译、打包和基本测试。将代码合并到主分支之后,将运行其他测试,以确保应用程序能够使用真实的配置和其他服务。性能和安全测试也在这个时候运行。随后就可以将代码部署到staging环境,然后再到生产环境“。

\\

Scheaffer说,保持管道的简单性、可见性和可衡量性是让管道奏效的最好方式。这里的关键因素包括管道的自动化和编排、改进、与利益相关者保持一致,以及对“好”的评估能力。

\\

McFall说,“DevOps让你以渐进和可管理的节奏取得进展,让你能够在软件准备就绪时拥有更强的信心,并且确实交付了正确的东西“。

\\

小心管道出现扭结

\\

Scheaffer说,管道应该是流动式的,不同的阶段可以同时发生。“例如,测试可以不需要等开发完成编码才开始进行。相反,测试可以与开发同时进行——与开发一起并行测试更小的代码块“。

\\

Scheaffer解释说,管道就像一根含有多级玻璃纤维的光缆。“每根玻璃纤维都可以代表单个应用程序的工作流,你可能会有许多不同的应用程序在管道中移动,而你需要做好协调工作”。

\\

不过,同时运行多条线索很容易带来复杂性,所以不要让你的管道成为瓶颈。OpsGenie的Küçükkaraaslan建议DevOps团队要不断监控所有组件,确保能够发现问题并尽快解决。

\\

另外,他还解释说,团队应该密切关注测试性能。“大家都喜欢将新代码快速发布到生产环境,但如果没有经过正确的测试,这样做是非常危险的。系统相互依赖的复杂性意味着一切都有可能出错。监控测试环境中新代码的执行情况对于发布稳定的版本来说至关重要。所以,尝试在快速测试和模拟生产环境测试之间找到最佳平衡。“Stroud说,拥有良好的测试套件和良好的测试覆盖率可以更好地了解部署了什么、部署在哪里和部署时间。

\\

Küçükkaraaslan解释说,CI/CD管道不是一成不变的,它会随着时间推移而发生演化,团队和业务需要能够随着管道一起演化。

\\

他说:“我们不断努力改善我们的CI/CD性能,并拥抱最佳实践。也就是说,我们一直在收集每个参与交付新功能的人的反馈意见,以便找到可以改进的地方。随着业务的发展,我们的CI/CD流程也必须跟着演化“。

\\

McFall说,如果你没有为CI/CD管道创建反馈循环,那么实际上你并没有在实施DevOps。“建立反馈循环的好处是,它可以让你有更强的信心和更快的速度去做事情。”即使现在团队可以把所有东西都推到生产环境中,但这并不意味着他们应该一直这么做。这就是反馈循环发挥作用的地方,因为它确保你可以听到客户的意见,而不只是一直在推出新的东西。“请注意你的同事在做什么,他们的成功之处在哪里,以及是否有机会不要犯同样的错误“。

\\

Scheaffer建议我们远离快速修复方法。他说:“在生活中,快速取得胜利是很诱人的,但也是要付出代价的。在CI/CD管道中,它表现为技术债务,发展脚步停滞不前,其他团队无法参与进来,以及在组织内部对什么是’好’的东西理解不一致。其结果是要花费很多精力重建管道“。McFall相信组织会不断试图找到一种适用于所有工具的方法,而实际上,他们真正需要做的是找出对他们的业务和风险状况有意义的事情。

\\

Stroud表示,要尽可能地利用自动化,但不要陷入自动化孤岛的局面。Stroud解释说,目前管道中存在的一个常见问题是,企业的自动化并没有覆盖所有部门,因此存在自动化孤岛。“DevOps的关键规则之一是我们需要在整个工具链中进行一致的协作,否则它就变成年轻玩家最大的陷阱之一”。组织可以通过标准化和合理化他们在每个孤岛中使用的工具来解决这个问题。

\\

最后,不要陷入责备文化。Stroud说,当事情失败时,关键的不是问责,而是想想如何能够做得更好,如何提高速度,以及如何交付更好的结果。“你希望人们试错,并从错误中学习。这必须成为DevOps的基本原则,而不是在发现部署的变更不符合要求之后对谁严加指责。借鉴这些经验或反馈,并在未来改变你的流程,这样你就可以持续创造价值“。

\\

持续交付与持续部署

\\

Stroud说,尽管CD通常被称为持续交付,但一些组织正在将其视为持续部署。

\\

现如今,软件变更在规模、性质和增量差异方面正逐渐缩小。这种变化使得团队能够达到可以自动部署的程度。Stroud说:“现实情况是,我们最终按照迷你的速率进行部署。变更在瞬间就发生,可能是每周一次,某些组织会收集变更,并把它们组合在一起,然后按月部署。具体情况取决于业务和业务转型的意愿“。

\\

为了跟上变化的速度,团队需要采用良好的部署方法,例如金丝雀发布。如果使用金丝雀发布,变更先被发布到一小组样本实例上,以便验证变更是否没有问题。如果使用蓝绿部署,就可以以一种可控的方式让不同的用户收到变更。开发者可以收到反馈,确保交付的东西符合要求。

\\

Stovell说,在部署软件时一个常见的错误是,团队编译代码并将其部署到测试环境中,而在进入生产环境时再次编译代码。“这不是一个好的做法,因为在你第二次编译代码时,会引入很多潜在的问题。你无法保证你测试过的东西就是最后进入生产环境的那个“。正确的做法是只构建一次,保留构建过程中生成的文件副本,然后将其部署到测试环境和生产环境中。

\\

成功实现持续部署的另一种方式是为每个环境提供一致的流程。Stovell说:“保证生产环境部署成功的最好方法就是确保生产环境的流程尽可能与其他环境保持一致。”

\\

Küçükkaraaslan说,部署管道的高级别视图被称为DevOps组装线。他说:“我们所要面临的挑战是,DevOps工具链并不像CI/CD那样完善,并涉及到对人的依赖,因此可能会效率低下。DevOps组装线尝试将活动连接到基于事件驱动的工作流程中,然后可以将这些工作流程与特定的应用程序或服务相关联“。

\\

实现以API为主导的DevOps方法

\\

API Fortress创始人Patrick Poulin说,如果你将CI/CD管道视为一直在运行的软管,那么API测试就是拖慢流速的扭结。

\\

API测试已经成为DevOps开发过程中的一个痛点,因为它一直被忽视。他说:“这是人们一直在拖延的事情之一,因为可能不存在一种工具可以让这个问题变得容易解决,或者因为它需要大量的开发工作”。

\\

如果团队没有测试这些API,那么在错误发生时他们可能就捕获不到,或者需要数周时间才能发现错误,因为除非API完全不可用,否则他们将看不到任何问题。Poulin说:“如果一直延续下去,可能会变成一个非常严重的错误,只因团队没有对其进行全面的测试”。

\\

与自动化网站和应用程序测试相比,DevOps团队需要在API测试中也投入同样的工作量。Poulin说:“相比前端,API也同样重要,API涉及到公司系统的每个部分,因此对测试、可靠性和正常运行时间有足够的了解”。

\\

团队应该要测试所有的API,而不仅仅是测试单个端点。还要创建集成测试,也就是用于重现常见用户流程的多步骤任务。Poulin解释说,你不仅需要对单个功能很了解,而且还需要知道它们在与其他功能或过程结合在一起时是如何工作的。“当你以真实的用户体验方式来测试你的东西,就会发现它们之间存在的差别”。

\\

关键在于要找到一种工具或平台,让每个人都可以知道API的状态,比如我的API在运行中吗?昨天有没有出现API问题?Poulin说:“如果你有适当的工具,任何人都可以通过几次点击就可以得到答案,并充分了解他们的API的健康状况”。

\\

将基础设施引入管道

\\

根据云管理解决方案提供商TriNimbus的首席技术官Goran Kimovski的说法,DevOps和CI/CD管道有两个价值原则。第一个原则是不断整合代码变更,并按照一组定义好的测试标准进行测试。Kimovski说,这是一个非常有吸引力的主张,因为你可以持续确保代码可以正常运行。第二个原则往往难以实现,那就是加速采用。Kimovski解释说,开发人员编写的应用程序代码需要部署到某种基础设施上,但这一过程通常与手动变更管理流程相关联。

\\

他说:“软件行业已经花了多年时间在单元测试以及像自动化集成测试、最终用户测试、性能测试这样的概念上,但测试基础设施的整体概念仍处于早期阶段,测试代码本身都很困难。”

\\

Kimovski说,这是因为开发人员需要调配和部署基础设施。而传统方案则包括实际的硬件或虚拟环境,要求传统的网络工程师、IT运维和系统管理员了解相关技术,将硬件组合在一起,建立网络,创建虚拟机并将它们交给开发人员或QA去配置,然后再让其他人在上面部署应用程序。“这一过程需要由多人来处理,并依赖大量的体力劳动,不稳定或不可重复“。Kimovski补充说,这不仅耗费时间,还会引入外部成本。

\\

Kimovski建议基于云来实现CI/CD管道。他说:“在云中配置一台服务器,运行15分钟后关闭,你只需要为此支付15分钟的费用。而在某个数据中心里配置服务器意味着你必须拥有物理硬件,这对你的业务而言是额外的成本。”另外,使用物理硬件来测试基础设施代码会有所限制,因为不是每个人都可以访问到它。他解释说,云将其大众化,并将其转化为运营成本。

\\

英文原文:https://sdtimes.com/cicd/cicd-driving-force-behind-devops

\\

感谢张婵对本文的审校。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cpongo4/article/details/89099357

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签