CI/CD 最佳实践,让研发团队效率起飞!

目录

CI/CD 是什么?

CI/CD 有哪些最佳实践?

深入研究 CD 的最佳实践

如何改进 CI/CD 流水线?

如何衡量 CI/CD 是否成功?

遵循 CI/CD 最佳实践有哪些收益?

CI/CD 部署策略

如何在组织中实施 CI/CD?


本文来源:about.gitlab.com

作者:Valerie Silverthorne

译者:极狐(GitLab) 市场部内容团队

CI/CD 是 DevOps 成功实践的核心,想要实现现代化应用程序开发的团队,必须遵从 CI/CD 最佳实践。如何确保团队正确使用 CI/CD?以下内容供你参考。

CI/CD 是什么?


CI/CD 既是技术流程,又是一种思想,还是一系列步骤......CI/CD 包括以上全部内容。简而言之,CI/CD 能让 DevOps 团队通过自动化来简化代码提交。

  • CI(持续集成) 简化了软件构建和源代码集成,实现版本控制,并通过自动化促进良好协作;

  • CI 结束后,持续交付(CD)开始自动化测试和部署。CD 不仅减少了花费在交付和部署过程中因手动操作所带来的诸多弊端,还能够让团队在管理软件生命周期方面,极大减少所使用的工具数量。

CI/CD 有哪些最佳实践?


如果想用 CI/CD 来获得成功,那就让持续集成、持续交付及持续部署成为团队的习惯,因为它们是软件研发实践的基石。DevOps 的目标就是更快将软件交付给用户,而 CI/CD 实践将让这一切变为现实。

如果问 10 个 DevOps 团队的 CI/CD 实践,会得到 10 个不同答案。但以下几个方面都是大家一致推崇的:

  1. 只构建一次:不要为每个阶段创建一个新构建,这会带来不一致风险。在 CI/CD 流水线中,推荐使用同一个构建制品(与环境无关的构建);

  2. 简化测试:在测试覆盖率和性能之间取得平衡。如果花费很长时间才能出现测试结果,用户则会试图绕开这些流程;

  3. 快速失败:在 CI 侧,提交代码的研发人员需要尽快得知他们提交的代码是否有问题,以便还能在熟悉这些代码的时候快速回滚和修复。“快速失败” 理念帮助开发人员减少上下文切换,让 DevOps 专业人员更加快乐;

  4. 每天提交:代码提交越规律,DevOps 团队将能看到越多价值;

  5. 有问题就修复:CI/CD 让修复失败构建变得更加简单;

  6. 清空预生产环境:环境持续运行时间越长,越难追踪应用在环境上的配置变更和更新。在每次部署之间都清空预生产环境是好习惯;

  7. 始终自动化:不断调整 CI/CD 流水线以确保实现持持续自动化;

  8. 明确步骤:确保版本发布和回滚计划明确写进文档,并被整个团队理解;

  9. 保持安全:CI/CD 是一种左移,因此它提供了一个很好的机会,将安全集成到早期流程中;

  10. 反馈循环:确保整个团队有一个简单办法来接受(或者贡献)反馈。

深入研究 CD 的最佳实践


CD(持续交付/部署)也值得深入研究一下它们的最佳实践,尽管风头总是被 CI 抢走了。以下是 CD 的最佳实践:

  • 立即开始:不要等新平台,从现有的开始调整,让它们变得更快、更高效;

  • 少即是多:最好的 CD 是用最少的工具完成的;

  • 追踪正在发生的事情:Issue 和 Merge Request 可能会失控,但 Milestone 可以提供帮助的,例如在设置敏捷冲刺和发布时,Milestone 具有双重作用:帮助跟踪正在进行的所有事项;进行有计划的交付;

  • 自动化部署变更:通过自动化简化用户验收测试和 staging 环境部署;

  • 管理发布流水线:自动化一切;

  • 建立监控:密切关注生产流程能够节约时间和金钱,还能够对业务侧提供关键数据;

  • 启动持续部署:一旦启动持续交付,就把手从部署上拿开,通过自动化将变更部署到生产环境。

如何改进 CI/CD 流水线?


所谓流水线,其实只是一种描述部署新版本软件所涉及到的一系列步骤的方式。监控和自动化被引入到 CI/CD 中,用以改进应用程序开发流程,特别是在集成和测试阶段,以及软件交付和部署阶段。

一个典型的 CI/CD 流水线应具有这些元素:计划、分析、设计、构建、测试、发布、部署、验证、合规及维护。这些步骤都可以手动实现,但是 CI/CD 流水线的价值体现在自动化。

如果要微调 CI/CD 流水线,可以考虑通过以下几点来增强性能:

  • 混合发布策略。金丝雀发布(或金丝雀部署)或许值得考虑。在金丝雀发布中,只有特定用户群体能看到新功能特性部署。

  • 增加更多自动化测试,因为自动化测试用不嫌多。

  • 持续做减法。更少的工具意味着更少的手动操作和步骤。如果 CI/CD 是 DevOps 平台的一部分,那么一切都应该在一个平台上。

  • 将软件组件分析视为常规实践,以确保 DevOps 团队持续追踪重要的开源软件问题。

如何衡量 CI/CD 是否成功?


DevOps 团队可能不知道他们的 CI/CD 实践运行如何,除非能够衡量它们。指标在改进系统性能及帮助识别何处可以增加价值时,扮演了非常重要的角色,还为任何改进的影响提供了基准。

以下是一些衡量 CI/CD 是否成功的指标:

➤ 循环周期

指从开始编写代码到推出功能特性需要的时间。

为计算出循环周期平均时长,需衡量研发流程整个阶段。该指标提供总体开发时长以及过程瓶颈的洞察。

➤ 价值实现时间

指发布编写的代码需要多长时间。集成、测试、交付及部署应该需要几分钟到几小时才能完成测试周期。如果 CI/CD 流水线的构建需要数天才能完成,则无法实现价值,需要对整个流程进行调整。

➤ 持续运行时长

正常运行时长是对稳定性及可靠性的一种衡量,这是运维团队首要任务之一。

当 CI/CD 策略自动化时,运维负责人就可以将更多时间聚焦在系统稳定性上,而在工作流问题上花费更少时间。

➤ 错误率

应用程序错误率是研发过程中的一个既定事实。追踪错误率非常重要,因为错误率不仅能够指出质量问题,还可以指示连续的性能问题以及与正常运行时间有关问题。

如果持续运行时长和错误率都很高,说明开发团队和运维团队之间存在常见的 CI/CD 挑战。

➤ 基础设施成本

在云原生开发中,基础设施成本非常重要。如不加以控制,部署和管理一个 CI/CD 平台会带来巨大成本。为了确定它们如何定价,云厂商将考虑网络硬件、基础设施维护及人力成本。

➤ 团队留存率

众所周知:当开发人员或者任何一个人真切感受到自己的价值和被重视的时候,他们会留下来。

当团队默契协作,那么留存是必然结果。相反,开发者合作不顺畅、进展缓慢等,他们可能会感到不舒服。通过查看团队留存率,可以发现潜在问题。

遵循 CI/CD 最佳实践有哪些收益?


当遵循最佳实践时,CI/CD 的好处会贯彻整个组织:

从 HR 到运维,团队能够更好的工作并达到最终目的;围绕 CI/CD 性能建立指标不仅可以提供有关开发的洞察,还可以延伸到业务的诸多方面;一个功能良好的 CI/CD 流水线能够改变 DevOps 团队的游戏规则。

以下是一些巨大的优势:

开发人员不是在修东西,而是在写代码。越少的工具和工具链意味着在工具维护上花更少时间,从而将更多时间用于在生产高质量软件。

代码即生产。不要让代码排队等待,而应该立马进入真实世界。这能让开发人员收到及时反馈的成就感。

开发人员可以专注于解决业务问题。简化的 CI/CD 流水线能够让开发者真正聚焦在重要的事情上,而不是让问题代码、繁琐的手动操作、生产问题等其他事项来分散注意力。

更容易创新。这是一个充满竞争的世界,组织需要所有可用的工具来勇立潮头。一个构建良好的 CI/CD 流程能够让软件研发更容易、更快和更安全,这也意味着 DevOps 团队有更多时间和精力去创新。

吸引并留下人才。人力市场的竞争激烈,DevOps 人才难以被打动。与其画大饼说 “我们很重视 DevOps 团队”,不如围绕 CI/CD 流程和技术来进行一些实际投资。

每一个人发挥所长。CI/CD流水线帮助研发、运维、安全以及测试各司其职,发挥所长。

CI/CD 部署策略


请记住,CI/CD 的目标是更快、更好地将软件交付到客户手中,提高生产力。诀窍在于采用在企业内部行之有效的部署策略。以下是一些让 CI/CD 成功的策略:

  • 频繁提交代码;

  • 自动化构建流程;

  • 并行运行测试,并构建一个部署流水线;

  • 快速失败并且采取左移措施,为开发人员提供技能和工具,以便在不破坏整体流程的基础上实现加速;

  • 使用能够快速获得反馈的 CI 工具。

如何在组织中实施 CI/CD?


在实施任何软件之前,关键是要确定业务驱动因素是什么,采用 CI/CD 也是如此,所有研发相关者都应该尽早参与实施过程。研发人员应该提供意见,因为他们将是产品的主要用户。

虽然这看起来有违直觉,因为 CI/CD 是以自动化方式加速软件交付的步伐,但是需要以缓慢而平稳的心态开始整个过程。

在集成过程中保持一致性很重要。执行单元测试、手动发版以及追踪指标。然后决定什么可以自动化、什么应该自动化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信协议开发,API接口调用

产品说明 一、 hook版本:企业微信hook接口是指将企业微信的功能封装成dll,并提供简易的接口给程序调用。通过hook技术,可以在不修改企业微信客户端源代码的情况下,实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…

支持向量机,硬间隔,软间隔,核技巧,超参数设置,分类与回归

SVM(Support Vector Machine,支持向量机)是一种非常常用并且有效的监督学习算法,在许多领域都有广泛应用。它可以用于二分类问题和多分类问题,并且在处理高维数据和特征选择方面非常强大。SVM算法的核心思想是通过找到…

【刷题】双指针

双指针 76. 最小覆盖子串 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t …

C++this指针与静态成员函数的使用方法

this指针 在C中,this指针是一个非常重要的概念,它指向当前对象,可以在成员函数中使用,以访问对象的非静态成员变量和非静态成员函数。而静态成员函数则是一个与类关联的函数,而不是与类的实例关联的函数。 下面分别对…

在PyCharm中运行OpenCV

一、安装Anaconda配置python环境 这里选用清华大学开源软件镜像站:anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载的速度更快。 点击下载链接:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsin…

linux磁盘的分区,格式化文件系统,以及挂载

目录 磁盘 介绍 机械 HDD 固态SSD 磁盘分区: 磁盘分区类型 MBR分区方式 GPT分区方式 制作文件系统 挂载磁盘 文件类型 磁盘命令 磁盘分区类型切换 mkfs:格式化文件系统操作 mount:挂载文件系统到目录 umount :取消…

统信桌面版arm系统安装火狐浏览器和浏览器驱动

一、系统信息 二、下载浏览器和驱动 1、浏览器 https://security.debian.org/debian-security/pool/updates/main/f/firefox-esr/firefox-esr_115.5.0esr-1~deb10u1_arm64.deb 2、驱动 https://github.com/mozilla/geckodriver/releases geckodriver-v0.33.0-linux-aarch6…

鸿蒙【HarmonyOS】开发初体验

官方开发文档 依照官方开发文档进行配置,官方的文档很详细(虽然有些粗糙)。 其实只要下载了deveco studio,其他就按照next来就行了。配置都很清楚。 顺便提一下,deveco是基于intellij 的,体验很不错&…

什么是供应链攻击?

随着企业越来越依赖技术、连接性和第三方,供应链攻击变得越来越普遍。这些攻击旨在通过供应商和业务合作伙伴损害公司。 供应链攻击可能对企业和组织构成重大威胁,损害其安全以及向客户提供的产品和服务的安全。 在本文中,我们将探讨供应链…

springboot 2.x集成h2数据库

1.引入pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>com.h2database</groupId><artifactId>h2<…

gRPC之grpc负载均衡(resolver)

1、grpc负载均衡(resolver) 1.1 proto编写和编译 syntax "proto3";option go_package "./;echo";package echo;message EchoRequest {string message 1; }message EchoResponse {string message 1; }service Echo {rpc UnaryEcho(EchoRequest) retur…

C# Thread.Sleep 与 await Task.Delay 的本质区别,和异步方法中踩到的坑。

主要区别 Thread.Sleep&#xff1a; 挂起当前线程一段时间。 await Task.Delay&#xff1a; 将当前执行代码的线程空出来&#xff0c;优先去执行其他任务。 在等待时间结束后&#xff0c;交给线程池中的线程接继续执行。 这意味着&#xff0c;经过该方法后&#xff0c;执行当…

Pytest 的小例子

一个简单的例子 下面代码保存到test_pytest.py 一个简单的例子 def inc(x):return x 1def test_answer():assert inc(3) 5def test_ask():assert inc(4) 5 pytest 需要安装一下 pip install pytest (Venv) D:\pythonwork>pip install pytest Collecting pytestDown…

【Java】JDK命令使用总结

目录 1. javac 2. java 1. javac 将源码(*.java)编译成字节码(*.class) javac HelloWorld.java 2. java 运行字节码(*.class)。注意不能加后缀名。 java HelloWorld 直接运行单文件源码(*.java)。注意Java11以上才支持。 java HelloWorld.java

《数据结构、算法与应用C++语言描述》-优先级队列-大根堆的C++实现

优先级队列 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_25Priority queue 定义 优先级队列&#xff08;priority queue&#xff09;是0个或多个元素的集合&#xff0c;每个元素都有一个优先权或值&#xff0c;对优先级队列执行…

面向对象之绑定方法

【1】绑定给对象的方法 绑定给对象方法&#xff0c;对象能调用&#xff0c;类也能调用 # 对象调用会把对象自己当成第一个参数传给方法的第一个形参 对象.方法(参数1&#xff0c;参数2) -------- self参数不用传 # 类调用&#xff0c;方法中有几个参数就要传几个参数(包括…

Sitecore “Insert Link“ 时,默认 Ttarget 设置

一、简介 在我们使用 Sitecore “Insert Link“ 通常会插入站内的链接&#xff0c;通常情况下 Sitecore 默认的 Target 时 Custom&#xff0c;如果不想跳新的浏览器 Tab &#xff0c;就需要手动修改为 Active Browser。如何默认就是 Active Browser 呢&#xff0c;这就是我们今…

[问题解决] no CUDA-capable device is detected

先说环境&#xff0c;在docker下的gpu环境ffmpeg&#xff0c;然后今天突然无法使用&#xff0c;使用时出现如下图所示&#xff1a; 看着报错大致内容是找不到设备&#xff0c;网上寻找一番没有有用的东西&#xff0c;于是决定自己解决&#xff0c;仔细察看一番后&#xff0c;猜…

“华为杯”研究生数学建模竞赛2019年-【华为杯】C题:视觉情报信息分析(续)(附Python代码实现)

目录 五、任务三 5.1 任务分析 5.2 模型建立 5.3 模型计算 5.4 模型评价 六、任务四

MQTT发布_订阅架构(Pub_Sub)

MQTT发布/订阅架构&#xff08;Pub/Sub&#xff09; 本文中&#xff0c;将深入研究Pub/Sub架构&#xff0c;在软件架构中一个消息模式&#xff0c;它支持不同组件或系统之间以解耦的方式进行通信。 在前一片文章[MQTT简介]http://t.csdnimg.cn/6lNeZ中&#xff0c;对MQTT有一个…