什么是 CI/CD ?

news2024/11/18 15:43:12

在这里插入图片描述

说在开头
CI、CD 其实是三个概念,包含了一个 CI 和两个 CD,CI全称 Continuous Integration,表示持续集成,CD包含 Continuous Delivery和 Continuous Deployment,分别是持续交付和持续部署。这三个概念之间是有前后依赖关系的。
CI/CD 并不是一个工具,它是一种软件开发实践,核心是通过引入自动化的手段来提高软件交付效率。CI/CD 最终目的:让工程师更快 & 更高质量 & 更简单的交付软件!

持续集成 & 持续交付 & 持续部署
持续集成(Continuous Integration)

什么是持续集成?
定义:持续频繁的(每天多次)将本地代码“集成”到主干分支,并保证主干分支可用

持续集成这个词,起源于极限编程,是当时原始的12种实践之一,持续集成的目的快速反馈问题让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过编译、代码扫描、安全扫描、自动化测试等。只要编译失败、扫描出高级别问题或测试用例失败,就不能集成。
Martin Fowler 说过,“持续集成并不能消除Bug,而是让它们非常容易发现和改正。”

好处?
(1)通过自动化手段提高集成速度
在传统的研发过程中,一般通过手动方式执行编译、测试、部署,自动化后,可大幅提高集成频次,同时可以减少维护手工脚本带来的低级问题
(2)将问题前置
在每次 commit 时就触发编译、测试,更快的发现问题
(3)防止本地代码大幅偏离主干
如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
在这里插入图片描述

触发方式?
自动触发,通过自动化的 CI 服务或工具,自动监听代码库 Git Push & MR 等事件触发

常见的工具如 Jenkins、GitlabCI、CircleCI、GithubActions 等等

蚂蚁支持持续集成平台有:雨燕(前端)、LinkE CI(后端)、伙伴(终端)、ACI(多语言)等

面临的问题 & 阻碍?
理想很丰满,现实很骨感,持续集成理念虽好,但实践过程中却有非常多的问题和阻碍,远没有想象中那么简单!

常见的问题如:
(1)执行环境异构导致结果差异
比如Java测试,用户执行测试一般是本地通过IDEA右击执行测试或 mvn 命令,但是 CI 服务上的环境&机器规格和本地有很多差异,比如 JDK 不一样、Maven 版本不一样、Mac 和 Linux 差异等等会造成很多本地执行可以通过但是 CI 上执行不通过,或者 CI 上执行明显比本地慢的现象。
解决此类问题本质还是减少异构,比如通过容器化方式让执行环境标准化,通过 Maven 缓存提高测试时间等等,同时作为 CI/CD 平台方,也最好将测试、构建的过程透明化(执行机制、清晰的错误码和解决方案),方便在出现问题的时候开发可以很方便的自助排查。

(2)没有严格的测试要求
持续集成的理念是只要有问题一定要及时修复,比如执行测试,必须保证所有case全部通过才能集成到主干,但是在现实中的场景,特别是一些规模大的历史项目,由于历史债等原因,导致测试case无法全部通过或者必须通过重试解决,开发很难有动力去改,导致集成质量低效。
所以,持续集成的前提是,需要有一个心里准备花大精力去治理项目中的一些历史债,尤其是改善历史 case ,补充新 case ,降低 case 噪音,确保每次自动化触发的测试可以准确反馈集成质量!

(3)非常慢的构建 & 测试速度
在 CI 上执行构建或测试的速度非常慢,导致集成效率非常低,这里的慢有两种原因,一种是本身测试&编译就慢,这时需要深入分析,需要结合并行分组、分布式缓存等技术解决。
这里的自动化测试中的集成测试可能会非常慢,所以一般保证在持续集成阶段先让单元测试通过,集成测试放在在持续交付阶段完成。

持续交付(Continuous Delivery)
什么是持续交付?
定义:是持续集成的下一步,持续频繁地将软件的新版本交付到类生产环境(类似于预发),交付给测试、产品验收。
持续交付强调的是“交付”,不管怎么更新,软件是随时随地可以交付的,相比持续集成,持续交付除了交付到类生产环境之外,还会执行一些集成测试、API测试等等,确保交付的产物可以直接交付部署。

触发方式?
手动触发,通过研发平台手动触发(如触发LinkE预发部署流水线),一般交付结果是一个二进制包或者镜像

面临的问题 & 阻碍?
(1)很难保证和线上环境完全一致
由于持续交付的环境很难和线上环境一致,所以可能导致一些问题无法验证,使得交付的产物具备一定风险
探索方案:仿真环境

(2)大量脑壳疼的联调环境问题
经常遇到的场景是虽然本系统开发好了,但是由于各种原因导致上下游系统没有 ready 导致无法持续交付,针对上下游依赖非常多的系统,对联调环境稳定性、效率有非常强的依赖

(3)很难保证严格充分的自动化测试
持续交付最终要做到交付的产物可直接部署线上,那么对代码的质量要求就非常高,需要覆盖全场景充分的测试 case

持续部署(Continuous Deployment)
什么是持续部署?

定义:是持续交付的下一步,“自动”将代码部署到生产环境

持续部署强调的是“部署”,它的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。

持续部署和持续交付触发方式的区别是,持续部署是自动完成的,持续交付是手动完成的

触发方式?
自动触发,通过研发平台配置定时任务,自动获取交付产物进行自动部署。

目前即使在蚂蚁,应该很少有团队和研发平台能够真正做到持续部署,因为持续的部署的条件更加严苛

面临的问题 & 阻碍?
(1)发布条件受限
部分场景上线需要严格的审批的流程 & 频繁的封网
(2)低效手工发布流程
发布过程需要人工一次次确认,灰度和线上发布过程多分组场景下,需要一次次人工确定,不放心自动发布
目前蚂蚁解决方案:无人值守
(3)缺乏线上问题快速准确的反馈机制( 精准 OPS 能力)
没有 OPS 或者 OPS 噪音太大都会导致反馈不及时,这样研发就不敢把部署过程直接交给系统,也是上面发布需要人工确认的根因

目前公司对线上安全要求非常高,持续部署现阶段很难在蚂蚁大规模落地,特别针对类似金融核心这些安全要求非常高的系统,不过其实也未必要“一刀切”,公司还有很多级别不是特别高的应用,可以尝试小范围针对这些应用试点,同时不断持续改进周边 OPS 工具

在这里插入图片描述

最后
最后,我们来畅想一下,一个优秀的 CI/CD 研发过程应该是什么样子的?
假设开发同学小蚂第一天入职,他打开电脑,通过以下几步完成上线:
第一步:从 AntCode clone 代码到本地,修改了几行代码,本地测试后,通过git commit & push到代码仓库
第二步:push 过程自动触发了 CI 流水线,5 min 后,执行结束,通过钉钉通知告诉小蚂某个测试case失败了
第三步:小蚂本地修改失败 case ,重新 commit & push ,再次触发 CI 流水线,自动执行编译、测试、扫描等,收到钉钉消息,执行通过
第四步:小蚂将功能交给测试&产品验收,发现问题或收到建议,重新到第二步修改代码。
第五步:测试&产品验收没有问题后,手动触发预发部署流水线,并自动生成部署产物交付,后面流程就不用管啦。
第六步:持续部署流水线每几分钟自动检测交付产物包,发现更新后,自动将产物部署到线上。发布成功后,小蚂收到通知小蚂的功能生效啦。

理想状态?
(1)由于发布而导致的加班频次应该大幅减少
(2)开发大部分精力是花在写代码和思考如何写好代码,扫描、部署的事情交由平台自动化完成,并且体验良好,反馈精准。

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

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

相关文章

chatgpt赋能python:Python如何等分区间

Python如何等分区间 Python是一种高级编程语言,经常用于数据分析和科学计算。在数据分析中,等分数据区间是常见的操作。本文将介绍Python如何等分区间,并提供一些实用的代码示例。 什么是等分区间 等分数据区间是将数据划分为几个大小相等…

网络编程的无冕之王-Netty入门和核心组件介绍

最近我在研究Netty,之前只是经常听说,并没有实际做过研究,为什么突然要好好研究一下它,主要是因为前段时间,我在看RocketMQ底层原理的时候发现它的底层的网络通信都是基于Netty,然后网上一查,果…

【软件设计师暴击考点】网络安全等杂项高频考点暴击系列

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

读发布!设计与部署稳定的分布式系统(第2版)笔记11_无限长的结果集

1. 无限长的结果集是导致响应缓慢的常见原因 1.1. 当违反稳态模式时,就可能产生无限长的结果集 1.2. 当调用方允许另一个系统支配调用时,就会出现一个无限长的结果集 2. 数据库突然返回500万行,而不是通常的100多行时会发生什么&#xff1…

密码找回流程绕过测试-业务安全测试实操(20)

密码找回流程绕过测试 测试原理和方法 很多网站的密码找回功能一般有以下几个步骤 (1) 用户输入找回密码的账号: (2) 校验凭证:向用户发送短信验证码或者找回密码链接,用户回填验证码或单击链接进入密码重置页面,以此方式证明当前操作用户是账号主人;(3) 校验成功进入重置密…

重构项目的十大注意事项

文章目录 1. 确认重构的目的和范围2. 建立好重构计划3. 检查重构前的代码4. 测试重构后的代码5. 避免过度重构6. 保持团队成员沟通7. 使用重构工具8. 使用版本控制系统9. 持续监控重构进度10. 不断改进技能 1. 确认重构的目的和范围 在开始重构之前,需要明确重构的…

Spring(五)基于注解的自动装配

注解:和XML配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。 本质上:所以一切的操作都是java代码…

K8S调度器之污点和容忍

1. Taint和Toleration 节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint则相反,它使节点能够排斥一类特定的pod。Taint和Toleration相互配合,可以用来避免pod被分配到不合适的节点上。每个节点上都可以应用…

阿里云ECS服务器vCPU什么意思?

阿里云ECS服务器vCPU和CPU是什么意思?CPU和vCPU有什么区别?一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定,CPU是中央处理器,一个CPU可以包含若干个物理核,通过超线程HT(Hyper-Threading&am…

chatgpt赋能python:Python中如何合并相同key的元素?

Python 中如何合并相同 key 的元素? 在 Python 编程中,很多时候需要对列表或字典进行合并相同 key 的操作,这篇文章将介绍合并相同 key 的方法及应用。 什么是相同 key 合并? 相同 key 合并指的是将具有相同 key 的元素合并为一…

关于防火墙配置长连接的设置

长连接的使用场景 当业务中客户端和服务器长时间无数据交互,空闲时间超过1800秒,会话会因超时被清除。后续客户端没有重新发起连接,直接发送控制报文时导致数据不通。常见于数据库连接。 重点说明 以天为单位的会话超时需要开启长效会话比例…

考研高数考点总结

一.极限 1.函数的四性&#xff1a; 单调性、周期性、奇偶性、有界性&#xff1a; 周期性、奇偶性各记住一个结论。 有界性判定&#xff1a; 1.定义法&#xff1a;-M<绝对值<M2.函数性质&#xff1a;函数在闭区间上连续一定有界 闭区间连续》开区间连续加左端点右极限…

ML算法——最优化|凸优化随笔【机器学习】【端午节创作】

文章目录 数学预备知识1、最优化问题2、凸优化2.1、梯度下降2.2、牛顿法2.3、阻尼牛顿法2.4、拟牛顿法2.5、总结 数学预备知识 1、最优化问题 最优化问题指的是在给定条件下&#xff0c;找到一个目标函数的最优解&#xff0c;即找到能够使目标函数取得最大值或最小值的变量取…

​LeetCode解法汇总1254. 统计封闭岛屿的数目

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 二维矩阵 grid 由 0 &#xff08;土地&#xff09;和 1 &#xff08;水&#xf…

HuggingFace-RL-Unit2-Part2——初探Q-Learning

初探Q-Learning 文章目录 初探Q-Learning什么是Q-Learning&#xff1f;Q-Learning 算法第一步: 初始化Q-表第二步: 使用epsilon贪心策略选择一个动作第三步: 执行动作At, 得到奖励Rt1和下一个状态St1第四步: 更新Q(St, At) 异策略 vs 同策略Q-Learning算法实例第一步: 初始化Q-…

drone、gogs、docker与项目集成实现自动化部署

目录 前言项目目录结构目录结构测试文件 文件内容Dockerfilerun.shdrone.yml 测试打包部署中查看容器访问项目成功 常见问题Gogs 推送 URL 被解析到默认禁用的本地网络地址1、drone登录没有权限2、cannot ping the remote server3、推送代码以后不能自动clone4、maven编译报错F…

SynchronousQueue源码

介绍 SynchronousQueue作为阻塞队列的时候&#xff0c;对于每一个take的线程会阻塞直到有一个put的线程放入元素为止&#xff0c;反之亦然。在SynchronousQueue内部没有任何存放元素的能力。所以类似peek操作或者迭代器操作也是无效的&#xff0c;元素只能通过put类操作或者ta…

JDBC 和数据库连接池

JDBC 和数据库连接池 1. JDBC 概述 1.1 基本介绍 JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。JDBC的基本原理图[重要!]…

【编译、链接、装载十三】内存中的栈——图解栈的运行过程

【编译、链接、装载十三】内存中的栈——图解栈的运行过程 一、程序的内存布局二、栈1、什么是栈2、寄存器 三、函数执行四、结合汇编——分析函数调用1、demo2、反汇编3、反汇——图解反汇编、栈帧、寄存器 一、程序的内存布局 看看加上动态链接之后进程的地址空间是如何分布…

详解Spring配置文件

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;JavaEE、Spring Spring配置文件 1、简介2、XML3、\<Bean\>3.1、Bean标签范围配置3.2、生命周期3.3、⭐实例…