一文搞懂Jenkins持续集成解决的是什么问题
1、持续集成的定义
大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成.
持续集成并不能消除Bug, 而是让它们非常容易发现和改正.
根据对项目实战的理解, 持续集成中的 "持续" 是指不间断的; "集成" 可分为广义和狭义, 广义的集成指软件各个过程的集成, 包括开发、部署、测试等. 狭义的集成即代码和代码之间的集成, 从而保证代码合并不冲突.
每次集成都通过自动化的构建 (包括编译、发布和自动化测试) 来验证, 从而尽快的发现集成错误. 许多团队都发现这个过程可以大大减少代码集成的问题, 让团队更快的开发内聚的软件.
请注意, 持续集成不等于持续编译.
2、当前软件开发过程存在的问题
在没有应用持续集成之前,传统的开发模式是这样的:
项目一开始是先划分好模块,分配模块给相应的开发人员;
开发人员开发好一个模块就进行单元测试;
等所有的模块都开发完成之后,由项目经理对所有代码进行集成;
集成后的项目由项目经理部署到测试服务器上,被交由测试人员进行集成测试;
测试过程中出现 Bug 就提把问题记录进行 Bug 列表中;
项目经理分配 Bug 给相应的责任人进行修改;
修改完成后,项目经理再次对项目进行集成,并部署到测试服务器上;
测试人员在下一次的集成测试中进行回归测试;
通过通过之后就部署到生产环境中;
如果测试不通过,则重复上述“分配 Bug -> 修改 Bug -> 集成代码 -> 部署到测试服务器上 -> 集成测试”工作。
这个过程中可能会出现如下问题:
Bug 总是在最后才发现
随着软件技术的发展, 软件规模也在扩大, 软件需求越来越复杂, 软件已经不能简单地通过划分模块的方式来开发, 往往需要在项目内部互相合作, 模块之间存在一定的依赖关系, 那么早期就存在的 Bug 往往会在最后集成的时候才被发现.
越到项目后期, 问题越难解决
很多开发者需要在集成阶段花费大量的时间来寻找 Bug 的根源, 加上软件的复杂性, 问题的根源很难定位. 而且我们都清楚, 间隔的时间越久, Bug 修复的成本越高, 因为连开发人员自己都忘了当初写得是什么鬼代码, 从而不得不从头阅读代码、理解代码.
软件交付时机无法保障
正是因为我们无法及时修复 Bug, 或者是没能在早期就修复 Bug, 从而令整个修复 Bug 的周期拉长了. 不管怎么样, 我们不可能把明知存在 Bug 的软件交付给客户.
而且, 大量没有在前期预估到的工作量产生了——开发人员不得不花费大把时间在查找 Bug 上; 测试人员不断的需要进行回归测试; 项目经理不得不疲命于该死的代码的集成、部署这些重复性工作——最终导致整个项目的周期拉长, 交付时间点往后拖.
程序经常需要变更
某些项目, 程序会经常需要变更. 由于产品经理在与客户交流过程中, 往往实际的软件就是最好的原型, 所以软件会被当作原型作为跟客户交流的工具. 当然, 客户最希望的当然是客户的想法能够马上反映到原型上, 这会导致程序会经常被修改的. 那么也就意味着“分配 Bug -> 修改 Bug -> 集成代码 -> 部署到测试服务器上 -> 集成测试”工作无形又爆增了.
无效的等待变多
有可能开发在等集成其他人的模块; 测试人员在等待开发人员修复 Bug; 产品经理在等待新版本上线好给客户做演示; 项目经理在等待其他人提交代码. 不管怎么样, 等待意味低效.
用户的满足度低
这里的用户是广义的, 可以指最终的客户, 也可以是产品经理、公司领导、测试人员, 甚至可能是开发人员自己. 你想想看, 本来三个月做完的项目被拉长到了九个月甚至一年, 用户能满意吗! 产品经理、公司领导经常需要拿项目作为演示的原型, 结果告诉我在演示前一刻发现还有很多 Bug 没有解决, 项目启动不了无法访问, 这叫人情何以堪.
3、怎么样才算是“持续”
对于一天需要集成多少次数, 并没有一个明确的定义. 一般就是按照自己项目的实际需要来设置一定的频率, 少则可能几次, 多则可能达几十次. 可以设置按照代码的变更来触发集成, 或者设置一个固定时间周期来集成, 也可以手工点击集成的按钮来 “一键集成”.
持续集成的工作流程
当开始更改代码时,开发人员会从代码库(如 SVN、Git 等)获取当前代码库的副本.
当其他开发人员将更改的代码提交到代码库时, 此副本将逐渐停止反映代码库中的代码. 代码分支保持检出的时间越长, 当开发人员分支重新集成到主线时, 多个集成冲突和故障的风险就越大.
当开发人员向代码库提交代码时, 他们必须首先更新他们的代码, 以反映代码库中的最新更改.
当存储库与开发人员的副本不同, 他们必须要花时间来先处理冲突.
4、持续集成的好处
解放了重复性劳动
自动化部署工作可以解放了集成、测试、部署等重复性劳动, 而且机器集成的频率明显可以比手工的高很多.
更快地修复问题
由于持续集成更早的获取变更, 更早的进入测试, 也就能更早的发现问题, 解决问题的成本显著下降.
更快地交付成果
及早集成、及早测试减少了缺陷遗留到部署环节的机会. 在某些情况下, 更早地查找错误还会减少解决错误所需的工作量.
如果集成服务器对代码进行构建过程中发现错误, 可以及时发送邮件或者短信提供给开发人员进行修复.
如果集成服务器在部署环节发现当前版本有问题不可用, 集成服务器会将部署回退到上一个版本. 这样服务器上始终都会有一个可用的版本.
减少手工的错误
人与机器的一个最大的区别是, 在重复性动作上, 人容易犯错, 而机器犯错的几率几乎为零. 所以, 当我们搭建完成集成服务器后, 以后的事就交给集成服务器来打理吧.
减少了等待时间
持续集成缩短了从开发、集成、测试、部署各个环节的时间, 从而也就缩短了中间可以出现的等待时间. 持续集成, 意味着开发、集成、测试、部署也得以持续.
更高的产品质量
集成服务器往往提供 Code review、代码质量检测等功能. 对代码不规范或者有错误的地方会进行标识, 也可以设置邮件、短信等进行告警. 而开发人员通过 Code review 也可以持续提高编程的能力.
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

相关文章:
一文搞懂Jenkins持续集成解决的是什么问题
1、持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的理…...
微信小程序去除默认滚动条展示
一、微信小程序改版框架升级后,滚动条默认展示了。 在实际应用中效果不好,如果想默认隐藏掉,代码段如下: /* 去除默认滚动条效果 */ ::-webkit-scrollbar {display:none;width:0;height:0;color:transparent; } 设置成全局样式…...
3.02 创建订单操作详细-订单创建与回滚 (创建订单操作详细)
步骤1: 创建orders订单表,子订单表和订单状态表对应的pojo和mappperOrders和OrderItemsMapperOrderItems和OrderItemsMapperOrderStatus和OrderStatusMapper步骤2:创建OrderService和对应的实现类 public interface OrderService {/*** 用于创建订单相关…...
需求放缓、价格战升级、利润率持续恶化对小鹏汽车造成了严重影响
来源:猛兽财经 作者:猛兽财经 收入和每股收益不及预期,亏损创记录 财报显示,小鹏汽车(XPEV)2023年第二季度收入为50.6亿元人民币(合7亿美元),略低于预期,而且还产生了比预期更大的亏…...
《算法通关之路》chapter19解题技巧和面试技巧
《算法通关之路》学习笔记,记录一下自己的刷题过程,详细的内容请大家购买作者的书籍查阅。 1 看限制条件 1.1数据规模 有的题目数据规模较小,那么暴力法就可行;如果暴力法不行,那么再稍微加一个诸如缓存和剪枝的优化…...
什么是TF-A项目的长期支持?
安全之安全(security)博客目录导读 问题:Trusted Firmware-A社区每六个月发布一次代码。然而,对于生产中的平台,该策略在维护、重要软件修复的向后兼容性、获得最新的安全缓解措施和整体产品生命周期管理方面不具备可扩展性。 开源软件项目&…...
【LinuxC】时间、时区,相关命令、函数
文章目录 一、序1.1 时间和时区1.11 时间1.12 时区 1.2 查看时间时区的命令1.21 Windows1.22 Linux 二、C语言函数2.1 通用2.11 函数简介2.12 数据类型简介 2.2 windows 和 Linux特有函数2.3 C语言示例 一、序 1.1 时间和时区 1.11 时间 时间是一种用来描述物体运动变化的量…...
mac清理垃圾的软件有哪些?这三款我最推荐
没错,Mac电脑真的好用,但是清理系统垃圾可不是件容易的事。由于Mac系统的封闭性,系统的缓存垃圾常常隐藏得让人发现不了。不过,别担心!有一些专业的Mac清理软件可以帮你解决这一系列问题,让清理垃圾变得轻松…...
复习Day11:链表part04: 206. 反转链表、92. 反转链表II、25. K 个一组翻转链表、148. 排序链表
我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了,使用leetcode自带的IDE模拟面试环境。 哈希表章节的题目思路很清晰&…...
一年一度的国庆节又结束了
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...
雷达干扰和烧穿范围简介
一、干扰信号比 J/S或J-to-S是从目标发射的干扰信号接收的功率(J)与从目标的雷达反向散射接收的功率的比率。 二、烧穿范围 通过电子攻击(J)可以首先检测到目标回波信号(S)的雷达到目标的距离。 三、自保护干扰 也称为主瓣干扰(雷达回波源和干扰机并置)。 烧穿范围…...
“秋天第一只大闸蟹”背后,看见京东一体化供应链
京东似乎正在从一个大闸蟹的物流服务商、销售商,转变为一个大闸蟹的“供货商”。 作者|斗斗 编辑|皮爷 出品|产业家 阳澄湖连续几天的降雨,使得通往蟹塘的路异常难走。 长期驻扎此地的京东相关负责人蹲在蟹塘边的小路上,指着蟹塘说道…...
大模型Java编码能力评估
大模型如火如荼发展,不能只看热闹,也需要躬身入局。要想评估大模型的能力,必须有一个评估方法和评估数据集。下面就梳理下当前大模型是如何评估代码能力的 权威评估 opencompass: https://opencompass.org.cn/datalearner: https://www.dat…...
javascript选择框和选择文本的创建与增加以及设置选中项
<script type"text/javascript">//得到选中项的索引,文本和值函数function getselected(selectedIndex){var selectboxdocument.forms[0].elements["location"];var indexselectbox[selectedIndex];var selectedOptionselectbox.options[…...
汽车驾驶任务的隐马尔可夫模型识别方法研究
汽车驾驶任务的隐马尔可夫模型识别方法研究 一、Introduction 自动驾驶汽车经过了几十年的发展,是目前国内外汽车行业中的重要研究方向。自 动驾驶汽车的智能化需要车辆能够有类“人”的行为,在决策策略上可以满足人的心理 需求。人在驾驶过程中&#…...
Java编程题(完数)
题目 一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如61+2+3(6的因子是1,2,3)。 现在,你要写一个程序,读入两个正整数n和m(1<n<m<…...
国庆day6
国庆day6 汇编语言的组成 伪操作 不参与程序的执行,但是用于告诉编译器程序该怎么编译 如: .text .global .end .if .else .endif .data汇编指令 汇编器将一条汇编指令编译成一条机器码,在内存里一…...
力扣 -- 873. 最长的斐波那契子序列的长度
解题步骤: 参考代码: class Solution { public:int lenLongestFibSubseq(vector<int>& nums) {int nnums.size();unordered_map<int,int> hash;for(int i0;i<n;i){hash[nums[i]]i;}int ret2;vector<vector<int>> dp(n,v…...
【程序员必看】计算机网络,快速了解网络层次、常用协议和物理设备!
文章目录 0 引言1 基础知识的定义1.1 计算机网络层次1.2 网络供应商 ISP1.3 猫、路由器、交换机1.4 IP协议1.5 TCP、UDP协议1.6 HTTP、HTTPS、FTP协议1.7 Web、Web浏览器、Web服务器1.8 以太网和WLAN1.9 Socket (网络套接字) 2 总结 0 引言 在学习的过程…...
1.软件测试基础
一、软件测试概念 1.什么是软件 软件是计算机程序,是由计算机代码编写的一系列指令和数据,可以实现各种功能。它指的是计算机系统中的应用程序,包括操作系统、应用软件、驱动程序等。软件可以通过编程语言编写和开发,并可以安装…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
