CI/CD 的原理

一、CI/CD 的概念

CI/CD是一种软件开发流程,旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。
CI(Continuous Integration)持续集成
目前主流的开发方式是协同开发,即多位开发人员同事处理同意应用不同模块或功能。
如果企业在同一时间将所有分支代码集成在一起,那么将难以避免的出现代码冲突问题,从而导致效率低下。
而CI可以帮助开发者更方便地将代码合并到主分支。当开发人员将代码合并到主分支时,系统会自动对这些更改进行自动化测试,如果发现这些代码存在问题,CI可以更加轻松和快速地修复这些问题。

CD(Continuous Delivery)持续交付
在CI完成了集成工作之后,持续交付便可以自动将已验证的代码发布到对应的存储库。
持续交付旨在建议一个可以随时将开发环境中的功能部署到生产环境的代码库。

CD(Continuous Deployment)持续部署
对于一个完整、成熟的 CI/CD 管道来说,最后的阶段是持续部署。
它是作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。
实际上,持续部署意味着开发人员对应用的改动,在编写完成后的几分钟内就能及时生效(前提是它通过了自动化测试)。这更加便于运营团队持续接收和整合用户反馈。
总而言之,所有这些 CI/CD 的关联步骤,都极大地降低了应用的部署风险。
不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期工作量还是很大的。

二、CI/CD 的核心流程

自动构建:这个过程通常指使用构建工具(如 Maven、Gradle 等)对代码进行编译、打包和生成可执行文件等操作。构建工具需要与版本控制系统配合使用,当有新的代码提交时,构建工具会自动触发构建操作。

自动化测试:这个过程通常指使用测试框架(如 JUnit、TestNG 等)对代码进行单元测试、集成测试、功能测试和性能测试等操作。测试框架需要与构建工具配合使用,当构建成功后,测试框架会自动运行相应的测试用例,并生成测试报告。

自动化部署:这个过程通常指使用部署工具(如 Ansible、Puppet、Chef 等)将构建好的软件包部署到目标环境中。部署工具需要与测试框架配合使用,当测试通过后,部署工具会自动将新版本的软件部署到生产环境中。

自动化监控:这个过程通常指使用监控工具(如 Nagios、Zabbix、Prometheus 等)对部署在生产环境中的应用程序进行监控和故障排查。监控工具可以对系统资源、应用程序性能、日志等方面进行监控,并提供报警、自愈等功能。

三、CI/CD的重要性

快速交付:CI/CD减少了手动干预,加速了代码的构建、测试和部署,缩短了交付周期。
错误减少:自动化测试和部署减少了人为错误的风险,提高了软件质量。
持续反馈:CI/CD流程提供了快速的反馈,使开发者能够快速识别和修复问题。

四、CI 和 CD 有什么区别

CI/CD 中的“CI”始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。
CI/CD 中的“CD”指的是持续交付和/或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。

持续交付(第一种CD)通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。
持续部署(另一种“CD”)指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。

CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。更为复杂的是,有时“持续交付”也包含了持续部署流程。
归根结底,我们没必要纠结于这些语义,您只需记得 CI/CD 其实就是一个流程(通常形象地表述为管道),用于实现应用开发中的高度持续自动化和持续监控。

五、常用CI/CD工具

1. Jenkins

开源,基于Java开发的一种持续集成工作,用于监控持续重复的工作,旨在提供一个开放易用的软件平台。
特点
1) 安装方便,直接通过安装包安装。
2) 配置简单,可以通过Web界面轻松地设置和配置,提供动态错误检查和内置帮助。
3) 插件丰富。
4) 可扩展,可以通过插件架构进行扩展。
5) 分布式,可以在多台机器上发布工作,帮助用户在多个平台上更快地驱动构建、测试和部署。
在这里插入图片描述

2. Travis CI

托管的持续继承服务,适用于GitHub仓库。
最初开源,多年后转为闭源,专注于CI工作,通过自动化测试和警报系统提高构建过程的效能。
特点
1) 使用YAML文件配置。
2) 基于云。
3) 支持Docker运行测试。
4) 开箱即用支持更多语言。
5) 支持构建矩阵。
6) 开源项目免费计划。
缺点
1) 价格高,没有免费的企业方案
在这里插入图片描述

3. GitLab CI/CD

集成在GitLab中,支持从源代码管理到部署的全流程。
除了测试和构建项目之外,该工具还可以将build部署到基础设施中,而且只要了解各代码段的位置,就能对其开展针对性追踪。

特点
1) 使用YAML文件配置。
2) 继承了GitLab管理的Git仓库,可直接执行GitLab提供的CI/CD管道。
3) 可以基于Docker容器和Kubernetes集群等运行环境。
4) 可以使用共享和分布式运行策略,以调高性能和可靠性。
5) 采用分布式架构来降低压力和提高容错能力。
6) 通过容器化部署来简化运维和降低故障率。
在这里插入图片描述

4. TeamCity

是Java中基于服务器的CI/CD管道工具。由JetBrains开发和维护,可以安装在Windows和Linux服务器上。

特点
1) 支持各种版本呢控制系统。
2) 用户管理简单可靠。
3) 与VS、IntelliJ Concept等IDE简单集成。
缺点
1) 输出日志对用户不友好。
2) 很难手机不同项目的状态。
在这里插入图片描述

5. Circle CI

这是一款基于云的工具,可以自动执行集成和部署任务,适用于为开源项目和大型项目实现CI/CD。
官网
特点
1) 基于云,同时也提供了本地解决方案,允许在私有云或数据中心运行。
2) 商业账户也有免费计划。
3) 可以通过SSH模式访问容器并进行自己的检查。
4) 使用方便,只需要很少的配置。
5) 会检查第三方依赖项,缓存必要的安装内容,而不是持续安装所需的环境。
缺点
1) 仅支持两个版本的Ubuntu免费(12.04和14.04)。
2) 基于云,所以若其停止支持某个软件,将无法被阻止。
3) 开箱即用仅支持以下语言:Go(Golang), Haskell, Java, PHP, Python, Ruby/Rails, Scala。
在这里插入图片描述

6. Bamboo

Bamboo是一种CI工具,由Atlassian开发,提供了在单个窗口中执行、测试和发布的工具。
特点
1) 内置Jira Software和Bitbucket Server集成
2) 内置Git分支工作流程
3) 提供REST API
在这里插入图片描述

7. GoCD

GoCD是来自Thoughtworks的开源持续继承服务器,与其他CI/CD工具相比,他的主要区别在于VSM功能。
VSM跨Pipeline的完整端到端视图,他成功地将其映射到“部署Pipeline”或“持续交付Pipeline”的概念。

特点
1) 专注于持续交付
2) 支持插件
3) 易于定制
在这里插入图片描述

8. CodeShip

这是一个托管的持续继承平台,如果公司使用GitHub进行版本控制系统,使用CodeShip可以大大提高效率,主要原因是他能够直接从GitHub项目进行测试、build和部署。

特点
1) 提供分布式构建环境。
2) 可以与云平台无缝集成。
3) 与Docker紧密集成。
缺点
1) 扩展性受限制。
2) 社区支持小。
在这里插入图片描述

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

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

相关文章

高效数据集成案例:从聚水潭·奇门到MySQL

聚水潭奇门数据集成到MySQL的技术案例分享 在企业信息化建设中,数据集成是实现业务流程自动化和数据统一管理的关键环节。本文将分享一个具体的系统对接集成案例:如何将聚水潭奇门平台上的销售出库单数据高效、可靠地集成到MySQL数据库中,以…

编译,链接,加载

编译、链接、加载 编译、链接、加载是基础,十几年前从《深入理解计算机系统》等相关书籍中获得了比较全面的理解,现在已经变得有些模糊了。当时没有做总结的习惯,现在零零散散的记一些吧,有时间还要重温书本。 Build time 编译器…

Python(pandas库3)

函数 随机抽样 语法: n:要抽取的行数 frac:抽取的比例,比如 frac0.5,代表抽取总体数据的50% axis:示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例: 输出结果都为随机抽取。 空…

YOLOv8实战野生动物识别

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对野生动物数据集进行训练和优化,该数据集包含丰富的野生动物图像样本…

Semantic Kernel进阶:创建和管理聊天(ChatCompletion)历史记录对象(四)

一、引言 在构建基于Semantic Kernel的AI应用时,聊天历史记录对象(Chat History)是维护对话上下文和连续性的关键。本文将一步步指导你如何创建和管理聊天历史记录对象,从而为你的AI代理提供一个强大的对话管理工具。 二、聊天…

规划控制复现:Apollo LQR横向控制(C++/simulink实现)

本文在前文已经搭建好的ROS-C规划控制验证平台中进行LQR算法的复现,理论部分详见于: 规划控制复现:Apollo LQR横向控制(算法原理推导与流程)_apollo 规划控制-CSDN博客 Prescan-Carsim-ROS的仿真平台搭建详见于&…

ASO优化秘籍!

根据 App Annie 发布的报告显示,现全球移动设备使用时长达到新高,日均 4.2 小时。在这大环境下,App 的竞争也愈演愈烈,App 想让更多人看到,似乎越来越难。那么,App 可以通过哪些方式进行推广? …

面向对象编程中类与类之间的关系(一)

目录 1.引言 2."有一个"关系 3."是一个"关系(继承) 4.“有一个”与“是一个”的区别 5.not-a关系 6.层次结构 7.多重继承 8.混入类 1.引言 作为程序员,必然会遇到这样的情况:不同的类具有共同的特征,至少看起来彼…

React写关键字高亮的三个方案

1.js正则replaceAlldangerouslySetInnerHTML{{ __html: xxx }}危险属性 步骤最简单,但是是危险属性,不推荐使用,项目中实在没有头绪,可以使用它应急 通过useMemo计算得到新的状态值,赋值给dangerouslySetInnerHTML属性的__html 关键代码: const [state1, setState1] useSt…

Linux 生产者消费者模型

1. 背景概念 假设现在有多个线程,一部分线程负责生产任务,称为生产者productor,另一部线程负责执行任务,称为消费者consumer,他们之间是一对一一对一一对一的关系。 现在生产者productor-3有任务要派发,但…

PlantUML在IDEA中使用

1.打开settings,搜索PlantUML Integration并下载 2.安装并重启IDEA 3.学习相关的语法即可进行使用

Java之多线程的实现(创建)(3种实现方式)(面试高频)

目录 一、多线程的3种实现方式 (1)继承Thread类。 (2)实现Runnable接口。(void run():该方法无返回值、无法抛出异常) (3)实现Callable接口。(V call() throw…

企业如何吸引稀缺的高技能员工

高技能员工的稀缺性和招聘难度日益凸显,其原因主要在于技术发展迅速、人才供需失衡、企业竞争加剧。其中,技术发展迅速导致人才培养跟不上市场需求,使得高技能人才更加稀缺。以人工智能领域为例,新技术层出不穷,相关人…

【MySQL】MySQL数据库中密码加密和查询的解决方案

本篇博客是为了记录自己在遇到password函数无法生效时的解决方案。通过使用AES_ENCRYPT(str,key)和AES_DECRYPT(str,key)进行加密和解密。 一、问题 自己想创建一个user表,user表中有一个password属性列,自己想对密码进行加密后再存入数据库&#xff0c…

java质数的判断 C语言指针变量的使用

1. public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入一个值");int num sc.nextInt();boolean flagtrue;for (int i2;i<num;i){if (num%i0){flagfalse;break;}}if (flag){System.out.println(num"是一…

Midjourney 3D:探索未来沉浸式体验的无限可能

一、Midjourney 3D:开启沉浸式新时代 最近,Midjourney宣布即将推出一款全新的3D产品,这不仅仅是一次简单的3D生成技术的升级,而是一场革命。这款新产品将基于先进的光场技术,而非传统的3D网格模型,为用户提供前所未有的沉浸式体验。用户不仅可以“跳入”生成的场景中自由…

CasPL: Cascade Prompt Learning for Vision-Language Model Adaptation

文章汇总 当前的问题 目前可学习的提示符号主要用于适应任务的单一阶段(即适应提示)&#xff0c;容易导致过度拟合风险。 动机 提示符将分两个阶段逐步优化。在初始阶段&#xff0c;学习增强提示&#xff0c;**通过使用大量未标记的领域图像数据对齐其预测逻辑&#xff0c;从…

【文献及模型、制图分享】基于投入品减量增效视角的长江经济带农业生产绿色化演进研究

文献介绍 绿色化转型是农业可持续发展研究的重要议题。以农业生产绿色化转型过程的理论分析为基础&#xff0c;运用文献调查、访谈与问卷调查、脱钩分析相结合的方法&#xff0c;研究了长江经济带农业生产绿色化转型过程和投入品减量增效的趋势。 结果表明&#xff1a; 2015…

记录一个容器间访问不通问题

docker-compose装了zookeeper和一个服务。 zk服务如下&#xff1a; szxc-zk:image: "image.sd001.cn:30003/base/zookeeper:3.8"privileged: trueenvironment:- "TZAsia/Shanghai"#- "ALLOW_ANONYMOUS_LOGINyes"- "ZOO_MY_ID1"- &qu…

redis详细教程(3.ZSet,Bitmap,HyperLogLog)

ZSet Redis 的 ZSet&#xff08;有序集合&#xff09;是一种特殊的数据类型&#xff0c;它允许存储一系列不重复的字符串元素&#xff0c;并为每个元素关联一个分数&#xff08;score&#xff09;。这个分数用于对集合中的元素进行排序。ZSet 的特点是&#xff1a; 唯一性&am…