DevOps落地笔记-11|持续集成:软件持续集成,发布信手拈来

上一讲我主要介绍了如何快速的构建环境,以及测试阶段对环境的要求。现在测试环境已经不是阻碍软件开发的障碍了,但另一个问题又出现了:每次测试结果不是不理想,就是问题太多无法继续测试。这是因为,团队成员平时都在自己的本地开发,只有开发完成才能提交到代码仓库,统一发布到测试环境中进行测试。这期间非常容易出现问题。今天介绍的内容——持续集成,就为解决这一问题而来。它通过频繁提交,每天多次将团队成员的工作内容进行集成,并通过自动化测试平台验证集成后的系统是否可用,尽早地发现问题,修复问题,使得开发中的软件一直保持可工作的状态。

什么是持续集成?

先说一下什么是“持续”,持续的意思并不是“始终,一直”,它的意思是“随时”。比较恰当的频率是:每当有人提交代码,同时集成一次。

“持续集成”实践最早来自 1996 年 Kent Beck(肯特·贝克)提出的极限编程方法(XP)。他在《解析极限编程——拥抱变化》一书中给出了一个简短的说明:“持续集成是每天多次集成和生成系统,每次都完成一个构建任务”。

在 2006 年 5 月 1 日,Martin Fowler(马丁·福勒)在其个人官网给出了相对正式的定义:

持续集成是一种软件开发实践,团队成员频繁地将他们的工作成果集成在一起。通常是每人每天至少提交一次,这样每天就有多次集成。每次提交后,自动触发一次包含自动化测试的构建任务,以便能尽早发现集成问题。

通过这种方式,许多团队大大减少了集成阶段的问题。由此可以看出,持续集成是一种质量反馈的机制,能够尽早地发现代码中的问题,并提前解决问题。

为什么要做持续集成?

作为软件从业人员,我们都知道,软件开发有一个特点,就是在没有开发完成之前,很长一段时间内是无法运行应用程序的。一般都是前期大家开发各自的功能模块,最后在集成阶段将功能集成在一起,进行验收测试。这样做就会导致几个问题:

& 由于长期在各自的分支上开发,导致在集成阶段合并分支时产生大量冲突,无法合并;

& 由于之前并未进行过任何集成,导致在集成阶段耗时太长,或者根本无法集成;

& 由于之前并未进行过任何测试,导致系统集成后发现并不满足要求。

解决上面问题的最佳方法就是持续集成。

目前在谈到集成时,主要有以下两种集成方式。

& 即时集成:是指团队成员每次提交之后就进行集成,并执行编译、构建、自动化测试等任务来检查个人提交的代码是否可用。这种集成方式要求执行的时间要短,要快速反馈结果,因此只能执行一些简单地测试。

& 定时集成:类似每日构建(Daily Build),是指每天定时(一般为晚上)自动执行一次集成过程,第二天将执行结果发送给关系人。这种集成方式注重的是检测的全面性和彻底性,对执行时长要求不高。

持续集成一般是指即时集成,但定时集成在某些场景下也是非常有用的。比如,比较耗时的集成过程。

持续集成的工作流程

下面介绍一下持续集成的基本工作流程。持续集成服务器可以采用目前最受欢迎的 Jenkins,如下图所示:
在这里插入图片描述
每次提交后具体的执行步骤是:

1.开发人员在本地工作空间提交代码到代码仓库;

2.版本控制系统通过 WebHook 等机制实时通知持续集成服务器;

3.持续集成服务器克隆最新的代码和构建脚本到服务器本地,或者专用的服务器;

4.在持续集成服务器或专用服务器上执行构建脚本,对最新的代码进行检查,包括编译构建、代码动静态扫描、单元测试以及部署到测试环境运行功能测试等;

5.运行结束后,自动生成执行结果报告;

6.将执行结果通过邮件等方式通知给开发人员。

为了保证每次集成的效率,以上步骤都是通过自动化方式执行的。开发人员只需要专注于代码开发,提交后只需等待几分钟就能够收到执行结果。这里需要强调的是,虽然开发人员不需要关注除代码开发之外的事情,但对每次提交有要求,比如:要保证每次提交的是一个完整的功能项。代码只写了一半就提交,功能测试肯定是通不过的。

如何实现持续集成

实现持续集成需要一定的先决条件,也就是上图中的几个组成部分,包含版本控制系统、持续集成系统和自动化测试。

版本控制系统

版本控制系统用于存储和软件相关的所有内容,比如应用程序的源代码、数据库脚本、构建脚本和部署脚本等。目前采用的都是基于 Git 的分布式版本控制系统,如GitLab、GitHub、Gitea等。不管是自研的还是开源的,对于应用持续集成实践,版本控制系统提供了基本的版本控制能力,能够记录哪个版本的代码是通过测试的,哪个版本还存在问题,并对有问题的版本进行回滚。

为了提高持续集成的效率,当代码提交后,都会采用实时通知机制。目前的版本控制系统都提供了基于 WebHook 或基于消息的通知机制,当不同类型的事件发生后,就会通知注册方。

持续集成系统

虽然持续集成实践中并未要求一定要有个持续集成的工具。但工欲善其事必先利其器,使用持续集成工具可以达到事半功倍的效果。目前常用的持续集成工具有开源的 Jenkins,功能比较完备,基于插件体系可以与构建和部署领域的很多工具进行集成。

持续集成系统与版本控制系统集成时,一个关键点就是如何触发构建。下图是 Jenkins 自由风格流水线的界面,这里主要查看构建触发器这部分。Jenkins提供了多种触发策略来满足不同的需求。这里着重介绍其中的三个。
在这里插入图片描述
定时构建:提供了类似 cron 的功能来定期执行。一般主要用于像每日构建/每周构建这样定期执行的构建。

Build when a change is pushed to GitLab:当 GitLab 发生变更后触发构建,该选项需要添加 GitLab 的 WebHook,当事件发生时才能进行通知。

轮询 SCM:通过轮询的方式检查版本控制系统是否发生变更。该选项是一个成本很高的操作,因为每次轮询都需要 Jenkins 扫描整个工作空间并与服务器进行验证。

自动化测试

持续集成的目的是提前发现代码中存在的问题,保证软件是可工作的。如果没有全面的自动化测试,构建成功只能意味着应用程序能够编译通过,并不能保证软件的功能是正常的。因此,在持续集成流程中,自动化测试是必须的。有三类测试需要加入持续集成的流程中,分别是单元测试、集成测试和验收测试。

单元测试:用于单独测试应用程序中某些小单元的行为,比如一个方法、一个函数。通常不需要启动整个应用程序就可以执行,而且也不需要连接数据库、文件系统和网络。

集成测试:用于测试应用程序中几个组件的行为。与单元测试一样,通常也需要启动整个应用程序,但有可能需要连接数据库、访问文件系统或其他外部系统或接口。

验收测试:用于验证应用程序是否满足业务需求所定义的验收条件,包含应用程序提供的功能,以及其他非功能性需求,如容量、安全性等。验收测试通常要将整个应用程序运行于测试环境之中。

开发人员的要求

为了做好持续集成,除了上面提到的一些工具作为支撑,对每个开发人员也提出了一些要求,主要体现在以下三个方面。

频繁提交
正如在开头提到,持续的含义是“随时”。我也给出了最恰当的频率:只要有人提交就需要进行集成。对于持续集成来说,开发人员需要做的就是频繁提交代码到版本控制库中一,每天至少提交一次。这样做有几个好处:

& 提交得越频繁,越早收到集成的反馈;

& 每次提交的变更很小,就很少会导致构建失败;

& 即便是导致构建失败,也很容易知道是哪里的问题,很容易修复或者回滚。

在持续集成的实践中,建议采用“主干开发”的工作模式,因为这种模式才能真正做到持续集成。但在很多企业里都是采用 GitFlow 等基于分支的工作流模式来进行协同开发。因为每个开发人员都是在自己的分支上开发,并未与其他分支的代码实现实时集成。这里开发人员需要注意的是,不仅要频繁将代码提交到各自的分支,同时每天要至少一次将各自的分支合并到发布分支,进行全流程测试。

提交一个完整的任务

不要只为了频繁提交而随意提交代码,频繁提交不等于随意提交。要保证每次提交的内容都是有意义的,都是一个完整的任务。比如要添加一个查询家庭地址的接口,要把该功能开发完成后一次性提交,而不是接口写了一半就提交了。这个要求和之前谈到的限制在制品数量是有关系,如果同时并行的任务数太多,就会出现在一次提交里同时包含多个任务的代码。这种情况提交的代码会严重影响测试效果。

这种情况非常普遍,我正在处理一个 Bug 或者开发一个功能,已经改了很多文件。但这时需要处理其他更紧急的工作,如果在当前状态下修改就会出现同一次提交包含多个任务代码的问题。这里介绍一个方法来解决这个问题:可以使用 git stash 命令,保存当前对代码库做的更改,并恢复到上次提交的状态。当提交完穿插的任务后,再恢复到上一个更改的状态,继续完成该任务。这样就能保证每次提交都是一个完整的任务。

下面是几个常见的命令:

#保存未提交的变更

$git stash

#查看已保存的清单

$git stash list

stash@{0}: WIP on master: 8a15b20 New Message

#恢复最后一次保存的记录

$git stash apply 

#恢复指定的保存记录

$git stash apply stash@{0}

构建失败后立即修复

当某个团队成员提交代码后导致构建失败,说明本次提交影响了软件的整体质量。这个时候,整个团队都不能再继续提交代码了,而是先处理构建失败的问题。这个实践也是应用了丰田生产管理系统(TPS)中的“立即停止原则”。其含义是:当生产线上已经发现了问题,就应该立即停止来解决问题。如果问题没有得到有效解决还仍然是生产线保持运行,则会生产出更多的残次品。

同样的道理,对于软件团队来说,如果提交构建失败后没有立即修复,其他人再次提交新的代码,就一定会引起提交构建失败。那么,这次失败是上次失败导致的,还是新的代码导致的,就变得很复杂了。

总结

本课时主要介绍了使用持续集成来解决软件在开发后期进行集成出现的各种问题。实践的思想就是快速反馈,通过尽早地集成并进行自动化的测试来发现代码中存在的问题,尽早修复。

为了更好理解什么是持续集成,介绍了持续集成的工作流程、实现持续集成的先决条件以及对开发人员本身的要求。持续集成并不是一个工具,而是一个实践。通过工具、平台加快持续集成落地的效率,通过让团队成员对持续集成的准则达成共识,来提升持续集成的效果。持续集成在很多企业里都是最先被落地的,这里介绍了只是实现持续集成的思路和方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql升级到8.x

1.下载和安装 1.1.下载 mysql下载地址: https://dev.mysql.com/downloads/mysql/5.5.html?os31&version5.1 应该下载这个类似版本 mysql-8.0.36-linux-glibc2.17-x86_64-minimal.tar.xz 1.2 安装 解压: tar xvf mysql-8.0.36-linux-glibc2.17…

学习Spring的第十三天

非自定义bean注解开发 设置非自定义bean : 用bean去修饰一个方法 , 最后去返回 , spring就把返回的这个对象,放到Spring容器 一 :名字 : 如果bean配置了参数 , 名字就是参数名 , 如果没有 , 就是方法名字 二 : 如果方法产生对象时 , 需要注入数据 , 在方法参数设置即可 , …

Acwing---802.区间和

区间和 1.题目2.基本思想3.代码实现 1.题目 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m次询问,每个询问包含两个整数 l 和…

基于Web停车场管理系统

技术架构: Spring MVC JSP MySQL 有需要该项目的小伙伴可以私信我你的Q。 功能描述: 基于Web停车场管理系统主要用于实现停车场相关信息管理,基本功能包括:系统信息管理模块、车位信息管理模块、IC卡信息管理模块、固定车主…

【Docker篇】Linux安装Docker、docker安装mysql、redis、rabbitmq

1.Linux安装docker 官方帮助文档:Install Docker Engine on CentOS | Docker Docs 1.1安装命令 # 1. 卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…

编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程

编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程 一、前言 以下教程以 佳易王眼镜店顾客档案管理系统软件V16.0为例说明 如上图, 点击顾客档案,在这里可以对顾客档案信息记录保存查询,…

Windows Server 2025 Active Directory 新变化

自 Windows Server 2016 以来,AD DS 尚未收到任何重大更新,并且 Server 2019/2022 中的功能级别没有增加。随着长期服务渠道 (LTSC) 中操作系统的下一个版本的发布,该版本暂且被称为 Windows Server 2025。 Windows Server 2025 新功能级别 …

C++ 日期类的实现

目录 前言 日期类中的成员函数和成员变量 日期类中成员函数的详解和实现 1.天数前后的判断 2.天数加减的实现 3.前置 && 后置 4.计算天数差值 前言 日期类的实现将综合前面所学的(类的6个默认成员函数),进一步理解和掌握类的…

SOME/IP SD 协议介绍(四)服务发现通信行为

服务发现通信行为 启动行为 服务发现将根据服务实例处于以下三个阶段之一: • 初始等待阶段 • 重复阶段 • 主要阶段 一旦系统启动并且用于服务实例的接口连接已建立,服务发现将进入该服务实例的初始等待阶段。 在进入初始等待阶段并在发送第一条服…

【C++栈和队列:数据结构中的经典组合,高效处理先进先出与后进先出问题的最佳方案】

[本节目标] 1. stack的介绍和使用 2. queue的介绍和使用 3. priority_queue的介绍和使用 4. 容器适配器 1. stack的介绍和使用 1.1 stack的介绍 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的…

c语言--求第n个斐波那契数列(递归、迭代)

目录 一、概念二、用迭代求第n个斐波那契数1.分析2.完整代码3.运行结果4.如果求第50个斐波那契数呢?看看会怎么样。4.1运行结果:4.2画图解释 三、用迭代的方式求第n个斐波那契数列1.分析2.完整代码3.运行结果4.求第50个斐波那契数4.1运行结果4.2运行结果…

2024/2/3 牛客寒假算法基础集训营1

目录 why买外卖 G-why买外卖_2024牛客寒假算法基础集训营1 (nowcoder.com) 要有光 L-要有光_2024牛客寒假算法基础集训营1 (nowcoder.com) why买外卖 G-why买外卖_2024牛客寒假算法基础集训营1 (nowcoder.com) 题目要求:这道题要求计算鸡排最贵为多少 思路&a…

C语言经典面试题——翻转单词顺序VS左旋转字符串

目录 1. 翻转单词顺序1.1 题目描述1.2 解法1.3 完整代码 2. 左旋转字符串2.1 题目描述2.1.1 解法一:2.1.2 解法二:2.1.2.1 strcpy2.1.2.2 strcat2.1.2.3 完整代码 2.1.3 解法三: 1. 翻转单词顺序 1.1 题目描述 输入一个英文句子,…

AI专题:2023年AI和标准化网络安全报告

今天分享的是AI系列深度研究报告:《AI专题:2023年AI和标准化网络安全报告》。 (报告出品方:enisa) 报告共计:37页 文件目的和目标 本文件的总体目标是概述与人工智能(AI)网络安全有关的标准(现有的、正在…

作业2024/2/3

第二章 引用内联重载 一.选择题 1、适宜采用inline定义函数情况是(C) A. 函数体含有循环语句 B. 函数体含有递归语句 C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句…

三路快排解决TopK问题

前言: 我们首先要明白什么是三路快排,什么是topk问题。 三路快排: 思想: 三路快排就是数组分3块,三个指针,先随机取一个基准值key,然后将数组划分为3个部分: 【小于key】【等于…

【八大排序】冒泡排序 | 快速排序 + 图文详解!!

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构冒险记 ✅C语言进阶之路 🌅 有航道的人,再渺小也不会迷途。 文章目录 交换排序一、冒泡排序1.1 算法步骤 动图演示1.2 冒泡排序的效率分析1.3 代码实现1.4 …

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

【计算机视觉】目标检测 |滑动窗口算法、YOLO、RCNN系列算法

一、概述 首先通过前面对计算机视觉领域中的卷积神经网络进行了解和学习,我们知道,可以通过卷积神经网络对图像进行分类。 如果还想继续深入,会涉及到目标定位(object location)的问题。在图像分类的基础上(Image classification)的基础上…

Maven快速入门——基础篇

本篇对Maven基础进行总结,主要对Maven的定义、作用、Maven坐标、依赖管理、依赖配置、依赖传递特性以及Maven的生命周期进行总结,后面会对springboot以及Maven高级进行总结。 文章目录 目录 一、Maven是什么? 二、Maven的作用: 三…