软件开发常说的CI/CD是什么

news2024/9/22 5:36:09

本文翻译自国外论坛 medium,原文地址:本文翻译自国外论坛 medium,原文地址:https://medium.com/gitconnected/basics-of-ci-cd-a98340c60b04

任何软件项目的主要目标都是通过业务流程快速更新迭代来赚钱。我们越快向客户发布新版本,对我们的公司就约有好处。但如何快速实现版本更新迭代呢?我们可以手动完成。例如可以通过 SSH 连接到远程服务器。然后我们可以使用新代码克隆代码库、构建它并使用命令行运行它。尽管这个方式确实有效,但这并不是一种便捷的方法。

因此本篇文章我们将讨论如何将产品发布和开发过程实现自动化。

本文标题所写的 CI 和 CD 是两个缩写,分别代表持续集成和持续交付。

CI

CI:持续集成描述了代码库变更的过程。让我们看一个简单的模式,它给出了团队开发的示例。

基本团队发展

基本团队发展

一群人可以同时工作。但所有更改最终都会转移到 master 分支。不管怎样,即使是这样一个简单的模型也会引发一些问题。

  1. 我们如何知道进入 master 分支的代码可以编译通过?

  2. 我们希望开发人员为代码编写测试。我们如何验证测试覆盖率没有下降?

  3. 所有团队成员都应使用指定的代码风格来格式化代码。我们如何检查可能存在的违规行为?

软件开发中,通常会将 master 分支作为主分支。dev 作为本地开发分支。

为了完成以上几点,我们可以把所有描述的要求都进行手动验证。不过这种方法非常复杂,当代码库越来越庞大时,这个方式并不可取。

于是乎 CI 的出现是为了完成以上所提出的几点建议并将其自动化。

第一点,我们如何知道进入 master 分支的代码可以编译通过

我们需要在架构中添加另一个模块,如下图。

基本CI

基本CI

大多数 CI 流程都可以根据这个架构来描述。

  1. 每次打开 Pull 请求(以及推送新更改)时,Git 服务器都会向 CI 服务器发送一条通知。

  2. CI 服务器克隆代码库,检出错误分支(例如 bugfix/wrong-sorting 分支),并与主分支合并。

  3. 然后构建脚本将被启动。例如 ./gradlew 脚本执行构建操作。

  4. 如果上一步脚本命令返回 0 代码,则构建成功。否则视为失败。

  5. CI 服务器将带有构建结果的请求发送到 Git 服务器。

  6. 如果构建成功,则允许合并 Pull 请求。否则合并将被阻止。

该过程保证进入主分支的任何代码都不会破坏进一步的构建。

第二点,我们希望开发人员为代码编写测试。我们如何验证测试覆盖率没有下降?

让我们把任务变得更复杂。假设我们要设置最小测试覆盖率。任何时刻 master 分支的测试覆盖率都不应低于 50%。 Jacoco 插件可以轻松解决这个问题。如果测试覆盖率值小于可接受的值,我们只需在构建时返回失败进行配置即可。

JaCoCo 是一个免费的 Java 代码覆盖库,由 EclEmma 团队根据多年来使用和集成现有库的经验教训创建。

JaCoCo 地址:https://www.eclemma.org/jacoco

Jacoco 的使用非常简单,只需要在项目启动后配置插件就能工作。

想象一下,我们正在开发一款已有五年历史的产品。自第一次提交以来,一直没有测试覆盖率检查。开发人员随意添加测试,没有任何纪律。但有一天,我们决定提高测试覆盖率。我们调整 Jacoco 插件,将最小测试覆盖率提高到 60%。一段时间后,开发人员打开一个新的 Pull 请求。然后他们突然意识到整个项目测试覆盖率只有 30%。因此要成功完成任务,整个项目必须覆盖至少 60% 的代码。正如我们可能猜到的,对于这个已有五年历史的项目来说,这几乎是一个无法解决的问题。

如果我们只验证新的代码更改而不验证整个产品的老代码怎么办?如果开发人员在 Pull Request 中更改了 200 行代码,他们需要测试覆盖至少 120 行代码(如果测试覆盖率等于 60%)。我们如何将只验证新代码的测试覆盖率应用到项目中呢?有一个解决方案是 SonarCloud。

SonarCloud 是一个云服务化的代码审查工具,能让团队一致、高效地交付干净的代码,该工具可轻松集成到云 DevOps 平台并扩展 CI/CD 工作流程。

SonarCloud 地址:https://www.sonarsource.com/products/sonarcloud/

CI 与测试覆盖率检查

CI 与测试覆盖率检查

Jacoco 报告被发送到 SonarCloud 服务器。

SonarCloud 服务器保存先前老项目代码计算的统计数据,再计算新代码的统计数据。然后分析结果被发送到 CI 服务器,CI 服务器将其发送回 Git 服务器。

应用了 SonarCloud 的工作流程能提供在任何产品演化阶段应用强制测试文化的机会,非常方便易于集成。

第三点,所有团队成员都应使用指定的代码风格来格式化代码。我们如何检查可能存在的违规行为?

说到代码风格,没有太多区别。我们可以尝试 Checkstyle 插件。它会自动使违反任何规定要求的构建失败。例如代码中可能有未使用的导入语句。此外我们还可以查看运行代码分析并将结果显示为一堆图表。

Checkstyle 是一种开发工具,可帮助程序员编写符合编码标准的 Java 代码。它自动化了检查 Java 代码的过程,从而使人们摆脱了这项无聊(但重要)的任务。这使其成为想要强制执行编码标准的项目的理想选择。

Checkstyle 地址:https://checkstyle.sourceforge.io/

CD

CD:持续交付描述了新产品版本自动部署的过程。

让我们对 CI 模式进行一些更改。如下就是真实项目中 CI/CD 流程的样子。

CI/CD流程

CI/CD流程

首先 CI 服务器现在被命名为 CI/CD 服务器 CI 和 CD 作业经常是使用同一个任务组件(例如 Jenkins)执行。

虽然这不是规则。例如可以将 CI 工作委托给 GitLab CI,将 CD 工作委托给 Jenkins。

架构的右侧部分代表 CI,我们之前已经讨论过。左侧部分代表 CD,CD 作业构建项目(或重用 CI 阶段生成的制品)并将其部署到终端服务器。

值得一提的是,在如上例子中,终端服务器是一个抽象。例如部署可能会发布到 Kubernetes 集群。因此可能有多个服务器。

部署阶段完成后,通常会发送电子邮件。例如 CD 服务器可以通知订阅者部署成功或失败。

有一个重要的问题。我们什么时候应该运行 CD 作业?触发因素可能会有所不同。

  1. 每次合并请求后进行部署。

  2. 按计划部署。

  3. 在每个拉取请求合并到特定分支后进行部署。

  4. 将以上选项进行组合。

第一点设置流程,以便 CI 和 CD 作业始终按顺序运行。这种方法在开源项目开发中相当流行。语义发布库有助于调整项目以透明地集成此过程。

第二点与 CI 流程无关。因为项目是根据一些预定义的时间表部署的。例如每天凌晨 01:00。

第三点与第一点类似。虽然有差异。假设我们的代码库中有两个主要分支。开发分支和主分支。开发分支包含最新的更改。而主分支只有线上稳定代码。如果我们只需要部署 master 分支,则不需要在合并到 develop 分支时触发 CD 作业。

最后一点是所有方法的汇总。例如开发分支可能会根据计划部署到开发环境。主分支会在每次拉取请求合并时部署到生产环境。

工具

现如今,业界提供了数十种自动化 CI/CD 流程的解决方案。让我们看一下其中的一些。

  1. Jenkins。世界上最受欢迎的 CI/CD 工具之一。由于其开源政策,它变得非常受欢迎。我们无需支付任何费用。Jenkins 允许使用 Groovy 强制描述构建管道。一方面,它提供了更多的灵活性。但另一方面,它也需要更高的能力水平。

  2. GitHub Actions。 CI/CD 工具包含在 GitHub 和 GitHub Enterprise 中。与 Jenkins 不同,GitHub Actions 提供带有 YAML 配置的声明式构建。此外,该解决方案与不同的质量保证系统(例如 SonarCube)进行了大量集成。因此,构建只需几行文本即可描述。

  3. GitLab CI。它与 GitHub Actions 非常相似。尽管如此,它还是有其特殊之处。例如 GitLab CI 可以指出构建失败的特定测试。

  4. Travis CI。云 CI/CD 服务。它提供了许多不需要复杂配置的功能。例如对应该隐藏在公共代码库中的数据进行加密。此外一个不错的好处是 Travis CI 可以完全免费地应用于 GitHub、GitLab 和 BitBucket 中的开源项目。

结论

这就是我想说的有关 CI/CD 流程基础知识的全部内容。如果我们有任何疑问或建议,请在下方留下我们的评论。谢谢阅读!

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!

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

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

相关文章

题集-三路划分和三数取中(快排优化)

快排排序是非常快的,但是有一种情况快排是无法进行的。 912. 排序数组 - 力扣(LeetCode) 这道题看上去没什么问题,但是如果我们用快排去提交的话,发现快排其实是被针对了的。 有一个样例是这样的。如果我们按照快排的…

SpringCloud入门实战(十五)分布式事务框架Seata简介

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

前端基础3——JavaScript基础用法

文章目录 一、基本使用1.1 内部方式1.2 外部导入方式1.3 css标签调用js脚本(触发事件) 二、Windows对象2.1 对象属性2.2 对象方法 三、数据类型3.1 字符串处理3.2 数组处理3.3 对象处理 四、流程控制4.1 操作符4.2 if判断语句4.3 for循环语句4.4 continu…

基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析 准备说明配置过滤解密分析 准备 1)nRF52840 Dongle 2)Mesh节点 3)手机作为配网器(苹果手机安装nRF Mesh APP) 说明 1)节点使用的例程目录:nrf5sdkformeshv500src\examples\…

手机录屏方法推荐,3种方法带你玩转

随着智能手机的普及,录制手机屏幕已经成为我们在日常生活中和工作中经常需要进行的操作。有时候,我们想录制一段手机游戏的精彩瞬间或者与朋友分享手机操作的技巧。因此,找到一种方便、简单的手机录屏方法变得尤为重要。本文将介绍手机录屏的…

【IEEE会议】第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)

第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023) 2023 5th International Conference on Frontiers Technology of Information and Computer 第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)将在中国青岛举行, 会期是2023年11月17-19日,…

(已解决)ModuleNotFoundError: No module named ‘braceexpand‘

问题描述 import braceexpand, yaml ModuleNotFoundError: No module named braceexpand 解决办法 pip install braceexpand 参考链接https://www.roseindia.net/answers/viewqa/pythonquestions/52026-ModuleNotFoundError-No-module-named-braceexpand.html 其他问题-1 im…

安全狗陈奋:数据安全需要建立在传统网络安全基础之上

8月22日-23日,由创业邦主办的“2023 DEMO WORLD 企业开放式创新大会”在上海顺利举办。 作为国内云原生安全领导厂商,安全狗受邀出席此次活动。 厦门服云信息科技有限公司(品牌名:安全狗)成立于2013年,致力…

钢筋水泥中的信仰--爱摸鱼的美工(16)

好久没有更新了,爱摸鱼的美工摸鱼太久可,终于出了一起钢筋水泥中的信仰,希望人们更加坚定个人的信仰。

Pandas 2.1发布了

2023年3月1日,Pandas 发布了2.0版本。6个月后(8月30日),更新了新的2.1版。让我们看看他有什么重要的更新。 更好的PyArrow支持 PyArrow是在Panda 2.0中新加入的后端,对于大数据来说提供了优于NumPy的性能。Pandas 2.1…

【RabbitMQ】服务启动成功,无法访问localhost:15672(RabbitMQ Management)

问题描述 RabbitMQ 服务已经启动成功,已经安装rabbitmq_management插件,无法访问RabbitMQ Management(http://localhost:15672/)。 原因分析 15672端口被Microsoft Edge占用。 解决方案 打开cmd终端,输入指令&#…

超声波气象站的功能和作用

超声波气象站是一种先进的测量气象要素的设备,其功能和作用在许多领域中都得到了广泛的应用。下面将从功能和作用两个方面来详细介绍超声波气象站。 一、超声波气象站的功能 ①测量各种气象要素 超声波气象站可以测量多种气象要素,包括温度、湿度、气…

Spark 环境安装与案例演示

Spark 环境安装 一、准备工作 1、hadoop成功安装 2、防火墙关闭 二、解压安装 1、上传 spark 安装包到/tools 目录,进入 tools 下,执行如下命令: tar -zxvf spark-2.1.0-bin-hadoop2.7.tgz -C /training/由于 Spark 的脚本命令和 Hadoop…

【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据

目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网(重点) 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置大量请求头随机使用 2.4、登录豆瓣网 三、爬取某一部热门电影…

Redis 7 第四讲 数据持久化

总体 RDB 介绍 RDB 持久化以指定的时间间隔执行数据集的时间点快照 。 把某一时刻的数据和状态以文件的形式写到磁盘上,即使出现故障宕机,快照文件也不会丢失,数据的可靠性得到保证。快照文件就是RDB(Redis DataBase)文件(dump.rdb) 作用 在指定的时间间隔内将内存中的数…

Redis的缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透 什么是缓存穿透? 缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力&…

VB:数值交换

VB:数值交换 Private Sub Command1_Click()Dim a%, b%a 5b 7Call mySwap(a, b)Print "a"; aPrint "b"; b End Sub ByRef 关键字允许子程序直接修改传递的参数的值,而不仅仅是拷贝一份副本,这样可以实现更灵活的数据处…

ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图

文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块&#xff0c;指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…

9.物联网LWIP,ip数据报,udp数据报,tcp数据报

一。ip协议原理&#xff08;网络层&#xff09; 1.网络地址转换NAT 我们上网是通过运营商向我们提供的IP地址来上网的&#xff0c;并不是自身的IP地址&#xff0c;所以这就需要网络地址转换NAT的帮助。即内网访问外网所需要的ip转换装置。 2.ip数据报 &#xff08;1&#xff…

延长Flash存储器使用寿命的研究

发布时间&#xff1a;2009年12月15日   引 言 随着嵌入式系统在数码相机、数字摄像机、移动电话、MP3音乐播放器等移动设备中越来越广泛的应用&#xff0c;Flash存储器已经逐步取代其他半导体存储元件&#xff0c;成为嵌入式系统中主要数据和程序载体。Flash存储器又称闪存&…