软件开发常说的CI/CD是什么
本文翻译自国外论坛 medium,原文地址:本文翻译自国外论坛 medium,原文地址:https://medium.com/gitconnected/basics-of-ci-cd-a98340c60b04
任何软件项目的主要目标都是通过业务流程快速更新迭代来赚钱。我们越快向客户发布新版本,对我们的公司就约有好处。但如何快速实现版本更新迭代呢?我们可以手动完成。例如可以通过 SSH 连接到远程服务器。然后我们可以使用新代码克隆代码库、构建它并使用命令行运行它。尽管这个方式确实有效,但这并不是一种便捷的方法。
因此本篇文章我们将讨论如何将产品发布和开发过程实现自动化。
本文标题所写的 CI 和 CD 是两个缩写,分别代表持续集成和持续交付。
CI
CI:持续集成描述了代码库变更的过程。让我们看一个简单的模式,它给出了团队开发的示例。

一群人可以同时工作。但所有更改最终都会转移到 master 分支。不管怎样,即使是这样一个简单的模型也会引发一些问题。
- 我们如何知道进入 master 分支的代码可以编译通过?
- 我们希望开发人员为代码编写测试。我们如何验证测试覆盖率没有下降?
- 所有团队成员都应使用指定的代码风格来格式化代码。我们如何检查可能存在的违规行为?
软件开发中,通常会将 master 分支作为主分支。dev 作为本地开发分支。
为了完成以上几点,我们可以把所有描述的要求都进行手动验证。不过这种方法非常复杂,当代码库越来越庞大时,这个方式并不可取。
于是乎 CI 的出现是为了完成以上所提出的几点建议并将其自动化。
第一点,我们如何知道进入 master 分支的代码可以编译通过?
我们需要在架构中添加另一个模块,如下图。

大多数 CI 流程都可以根据这个架构来描述。
- 每次打开 Pull 请求(以及推送新更改)时,Git 服务器都会向 CI 服务器发送一条通知。
- CI 服务器克隆代码库,检出错误分支(例如
bugfix/wrong-sorting分支),并与主分支合并。 - 然后构建脚本将被启动。例如
./gradlew脚本执行构建操作。 - 如果上一步脚本命令返回 0 代码,则构建成功。否则视为失败。
- CI 服务器将带有构建结果的请求发送到 Git 服务器。
- 如果构建成功,则允许合并 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/

Jacoco 报告被发送到 SonarCloud 服务器。
SonarCloud 服务器保存先前老项目代码计算的统计数据,再计算新代码的统计数据。然后分析结果被发送到 CI 服务器,CI 服务器将其发送回 Git 服务器。
应用了 SonarCloud 的工作流程能提供在任何产品演化阶段应用强制测试文化的机会,非常方便易于集成。
第三点,所有团队成员都应使用指定的代码风格来格式化代码。我们如何检查可能存在的违规行为?
说到代码风格,没有太多区别。我们可以尝试 Checkstyle 插件。它会自动使违反任何规定要求的构建失败。例如代码中可能有未使用的导入语句。此外我们还可以查看运行代码分析并将结果显示为一堆图表。
Checkstyle 是一种开发工具,可帮助程序员编写符合编码标准的 Java 代码。它自动化了检查 Java 代码的过程,从而使人们摆脱了这项无聊(但重要)的任务。这使其成为想要强制执行编码标准的项目的理想选择。
Checkstyle 地址:https://checkstyle.sourceforge.io/
CD
CD:持续交付描述了新产品版本自动部署的过程。
让我们对 CI 模式进行一些更改。如下就是真实项目中 CI/CD 流程的样子。

首先 CI 服务器现在被命名为 CI/CD 服务器 CI 和 CD 作业经常是使用同一个任务组件(例如 Jenkins)执行。
虽然这不是规则。例如可以将 CI 工作委托给 GitLab CI,将 CD 工作委托给 Jenkins。
架构的右侧部分代表 CI,我们之前已经讨论过。左侧部分代表 CD,CD 作业构建项目(或重用 CI 阶段生成的制品)并将其部署到终端服务器。
值得一提的是,在如上例子中,终端服务器是一个抽象。例如部署可能会发布到 Kubernetes 集群。因此可能有多个服务器。
部署阶段完成后,通常会发送电子邮件。例如 CD 服务器可以通知订阅者部署成功或失败。
有一个重要的问题。我们什么时候应该运行 CD 作业?触发因素可能会有所不同。
- 每次合并请求后进行部署。
- 按计划部署。
- 在每个拉取请求合并到特定分支后进行部署。
- 将以上选项进行组合。
第一点设置流程,以便 CI 和 CD 作业始终按顺序运行。这种方法在开源项目开发中相当流行。语义发布库有助于调整项目以透明地集成此过程。
第二点与 CI 流程无关。因为项目是根据一些预定义的时间表部署的。例如每天凌晨 01:00。
第三点与第一点类似。虽然有差异。假设我们的代码库中有两个主要分支。开发分支和主分支。开发分支包含最新的更改。而主分支只有线上稳定代码。如果我们只需要部署 master 分支,则不需要在合并到 develop 分支时触发 CD 作业。
最后一点是所有方法的汇总。例如开发分支可能会根据计划部署到开发环境。主分支会在每次拉取请求合并时部署到生产环境。
工具
现如今,业界提供了数十种自动化 CI/CD 流程的解决方案。让我们看一下其中的一些。
- Jenkins。世界上最受欢迎的 CI/CD 工具之一。由于其开源政策,它变得非常受欢迎。我们无需支付任何费用。Jenkins 允许使用 Groovy 强制描述构建管道。一方面,它提供了更多的灵活性。但另一方面,它也需要更高的能力水平。
- GitHub Actions。 CI/CD 工具包含在 GitHub 和 GitHub Enterprise 中。与 Jenkins 不同,GitHub Actions 提供带有 YAML 配置的声明式构建。此外,该解决方案与不同的质量保证系统(例如 SonarCube)进行了大量集成。因此,构建只需几行文本即可描述。
- GitLab CI。它与 GitHub Actions 非常相似。尽管如此,它还是有其特殊之处。例如 GitLab CI 可以指出构建失败的特定测试。
- Travis CI。云 CI/CD 服务。它提供了许多不需要复杂配置的功能。例如对应该隐藏在公共代码库中的数据进行加密。此外一个不错的好处是 Travis CI 可以完全免费地应用于 GitHub、GitLab 和 BitBucket 中的开源项目。
结论
这就是我想说的有关 CI/CD 流程基础知识的全部内容。如果我们有任何疑问或建议,请在下方留下我们的评论。谢谢阅读!
关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!
软件开发常说的CI/CD是什么的更多相关文章
- 软件开发中什么是CI/CD
持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误. 持续部署(continuous d ...
- GitLab CI/CD的官译【原】
CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...
- 如何搭建安全的 CI/CD 管道?
Eolink 前端负责人黎芷君进行了<工程化- CI / CD>的主题演讲,围绕 CI/CD 管道安全的实践,分享自己在搭建 CI/CD 管道过程中所总结的重要经验,与开发者深入讨论 &q ...
- 基于 Kubernetes 实践弹性的 CI/CD 系统
大家好,我是来自阿里云容器服务团队的华相.首先简单解释一下何为 Kubernetes 来帮助大家理解.Kuberentes 是一个生产可用的容器编排系统.Kuberentes 一方面在集群中把所有 N ...
- CI/CD持续集成/持续部署 敏捷开发
敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...
- 开发.NET Core NuGet包并实现CI/CD
实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用.上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这 ...
- 面试总结之MISC(操作系统,网络,数学,软件开发,测试,工具,系统设计,算法)
操作系统 解释堆和栈的区别. 分配在堆的内存与分配在堆栈的内存有什么不同 分配在堆的内存要手动去释放 线程与进程的区别 多线程中栈与堆是公有的还是私有的 在多线程环境下,每个线程拥有一个栈和一个程序计 ...
- CI Weekly #8 | CI/CD 技能进阶路线
在使用 flow.ci 进行持续集成的过程中,也许你会遇到一些小麻烦.最近我们整理了一些常见问题在 flow.ci 文档之 FAQ,希望对你有用.如果你遇到其他问题,也可以通过「在线消息」或去 Git ...
- CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享
五月一来,夏天便悄然而至.flow.ci 也带来了几个新的变化,帮你进一步优化开发工作流.一起来看看这几个重点功能: 支持 iOS 项目 Xcode8.3 构建 iOSer 们重点来了,flow.ci ...
- 好代码是管出来的——使用GitHub实现简单的CI/CD
软件开发一般来说是一项团队作业,在本系列文章开始就提到过软件的编码是由一个团队“并行”完成的,为了保证编码任务正常完成,首先引入版本控制工具来完成代码管理,为了保证代码质量引入了代码分析器以及代码测试 ...
随机推荐
- [NOI online22提高A] 丹钓战
题目描述 有 \(n\) 个二元组 \((a_i, b_i)\),编号为 1 到 n. 有一个初始为空的栈 SS,向其中加入元素 \((a_i, b_i)\) 时,先不断弹出栈顶元素直至栈空或栈顶元素 ...
- C++ Qt开发:MdiArea多窗体组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍MdiArea ...
- Diffusion Model扩散模型
1.扩散模型基本原理: 扩散模型包括两个步骤: 固定的(或预设的)前向扩散过程q:该过程会逐渐将高斯噪声添加到图像中,直到最终得到纯噪声. 2.可训练的反向去噪扩散过程pθ:训练一个神经网络,从纯噪音 ...
- FOJ有奖月赛-2015年11月 Problem B 函数求解
Problem B 函数求解 Accept: 171 Submit: 540Time Limit: 1000 mSec Memory Limit : 32768 KB Problem D ...
- pytest框架学习-前置和后置setup和teardown
前置和后置 (1)setup和teardown,方法级 写在类中 方法级,每个用例都会执行setup和teardown. 相当于setup_method和teardown_method (2)setu ...
- 一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
前言 今天给大家分享一个小巧.快速.轻量级的 .NET NoSQL 嵌入式数据库:LiteDB.本篇文章主要是介绍LiteDB和在.NET中如何使用. LiteDB介绍 LiteDB 是一个小巧.快速 ...
- 【wing】一款轻量快捷的团队开发工具
导航 开源地址:[Github] & [Gitee] 新手使用 更多命令 开发指南 说明 wing是一个代码同步管理工具类似repo,具有以下特性: 支持Winddows .Linux .Ma ...
- 测试攻城狮必备技能点!一文带你解读DevOps下的测试技术
[摘要]本文将从DevOps模式下对测试人员的活动的变化,以及常用的测试技术层面进行解读. 项目的软件开发模式主要经历瀑布模型.敏捷开发和DevOps这几个阶段,其中DevOps主要解决开发和运维.运 ...
- 一文带你解读Volcano架构设计与原理
摘要:Volcano主要是基于Kubernetes做的一个批处理系统,希望上层的HPC.中间层大数据的应用以及最下面一层AI能够在统一Kubernetes上面运行的更高效. Volcano产生的背景 ...
- 养殖场新来了个“AI管家”
摘要:定制化算法+端侧一键部署,打通AI全流程. 本文分享自华为云社区<[云享·伙伴]第4期:养殖场新来了个"AI管家">,作者: 华为云社区精选. 民以食为天.肉类是 ...