Someday, all software will be built this way.
原文链接:http://alblue.bandlem.com/2011/02/someday.html
(笔者注:文章主要介绍Git,Gerrit,Jenkins为代表的版本控制,代码审核,持续集成工具在现代软件开发中的使用,笔者认为这些都是当下最时髦,最先进的开发工具和工程思想,特做简单翻译与大家共享。)
先从代码审核说起,代码审核系统总的来说分为两类,各有优缺点:
- 提交前的审核,即把所做的改动附到审核系统。好处是避免了因为不准确或者不存在的版本号码而搞乱版本控制系统;缺点是提交的审核意见可能和提交的代码改动不吻合。
- 提交后的审核,即不管三七二十一先把代码提交到版本控制系统。好处是所有的改动和审核意见都保存到了版本系统中;缺点是错误的改动可能会搞乱版本控制系统。
以Git为代表的分布式版本控制系统(DVCS)是如何在这个问题上发挥作用的呢?首先要认识到核心问题并不是因为代码的改动被存到版本控制系统,而是因为大多数情况下代码的改动被直接存到版本控制系统的HEAD(trunk,即主干)里面。这样的话,保存一个错误的改动很可能导致后续的保存不能得到有效审核,这个错误的改动也不容易被修复(唯一有效的方法就是打一个相反的补丁,即做反向改动)。
解决方案是使用branch(笔者暂且称之为分支,以区分称为主干的HEAD)。当改动被保存到分支时,就不会影响到其他在主干上工作的开发人员。审核人员可以独立地在这个分支上进行代码审核,提出建议,修改,完成审核后最终把改动保存到主干。当然,如果需要做两个同时发生的改动,则需要两个分支。
显然,分支就会带来合并。以使用Git为例,开发人员可以在本地的分支上做代码改动,push这个分支到中央仓库,请审核人员(一般即同组的其他开发人员)进行代码审核,最后把审核过的改动合并到master(HEAD,trunk,即主干)中。因为Git是分布式版本控制系统,最后的合并将包含所有的历史改动(包含审核人员的意见和签名),这样当有人说“张三批准了01b3cd这个改动”时,开发人员可以准确地看到这个改动具体是什么。
下面来说说Gerrit。
Gerrit是和Git有良好互动的代码审核系统。Gerrit一般处在开发人员的本地Git仓库和Git中央仓库之间。简单来说,开发人员将改动push给Gerrit,Gerrit提供一个专业的审核平台,审核人员可以对每个改动过的文件,甚至对每一行改动进行评论。Gerrit同时保存审核投票,包括+1和-1两种,默认情况下,每个改动需要得到+2的投票才算审核合格。
下面说说Jenkins(即以前的Hudson)。
作为一项近年来十分流行的持续集成工具,Jenkins能够从版本控制系统中取出最新的代码,编译,运行测试,并将结果email给相关人员。Jenkins支持随心所欲的触发。开发人员可以设定每天晚上服务器空闲的时候触发Jenkins,或者设定当版本控制系统检测到改动时触发。通常情况下,每次只触发一个分支上(或者主干上)的编译运行。Gerrit有一个触发器可以在每产生一条新的审核意见时触发Jenkins,它甚至能告诉Jenkins取出改动的那个或者那些文件,编译,然后自动运行所有的测试。当Jenkins完成编译运行无误时,Gerrit会自动针对这些改动发表+1(Verified)意见,相反地,如果Jenkins上编译运行有错,则发表-1意见。通过配置,所有这些可以在审核人员还没有开始审核时就全部完成。另外,Git还有一个插件(Git
Plugin)可以用来把成功的改动push到远程仓库中,这样所有人都知道这个改动已经在Jenkins上成功通过了编译和测试。
这样,一旦一个改动被push到Gerrit,Jenkins自动进行集成(编译,测试,标记+1),审核人员进行审核,填写评论(可以不填),增加+1标记(可以设置为不需要增加),这个改动就视为一个正确改动了。因为Gerrit参与整个流程(Jenkins成功后会在Gerrit标记+1,失败后会标记-1),因此Gerrit能够代表开发人员将审核合格的改动push到主干(远程服务器,比如Github或者bitbucket)中去。
一旦开发人员开始使用Git,就会充分体会到分布式版本控制系统的好处。一旦开始使用Gerrit,就不存在未经审核的改动。一旦开始使用Jenkins,开发人员就不需要手动运行编译,测试工作。这就是当下最红的软件开发工具和思想。
分享到:
相关推荐
"30天学通Java项目案例开发 源代码" 提供了一个宝贵的资源,涵盖了多个实用的Java应用实例,对于初学者和有一定经验的开发者来说都是极好的学习材料。 首先,我们来看《30天学通Java项目案例开发》这本书籍,这是一...
**软件危机**是指在软件开发和维护过程中遇到的一系列问题,这些问题严重影响了软件的质量和效率。主要原因包括: 1. **软件规模和复杂性的增加**:随着软件规模的增大,其复杂性也随之增加,这使得管理和控制变得...
)一个设计师花了几天, 为聊天窗口滑入屏幕的交互绘制了一个完美的动画。(用户体验过度优化, 你是否对整个团队统一了“ 这次只是一个测试” 的预期?) 一周的测试完成之后,数据分析师发现无法产出你要的报告,...
2. **分时图与K线图**:软件通常会提供分时图和K线图两种图表形式,帮助用户直观了解股票一天内或更长时间内的走势。分时图显示每分钟的价格变化,而K线图则包含了开盘价、收盘价、最高价和最低价,便于分析趋势。 ...
邦仁液化气配送管理软件根据上百家成功企业独到管理经验开发而成,软件一上市便受到了业内专家和客户的高度赞许与肯定。实用性的功能模块完全按照气站配送管理行业流程设计。已成为业内一流的软件产品,产品的业务...
每天下班后,我都会花时间预习第二天可能遇到的问题,这种习惯让我逐渐适应了工作后的自我学习模式。在团队合作中,我们通过讨论和分析解决问题,不仅提升了技术水平,也加深了团队间的默契和友谊。 在魅族智能硬件...
邦仁桶装水配送管理软件根据上千家成功企业独到管理经验开发而成,软件一上市便受到了业内专家 和客户的高度赞许与肯定。实用性的功能模块完全按照水店配送管理行业流程设计。已成为业内一流的软 件产品,产品的...
macos电脑一台,安装xcodes开发工作,同时安装证书服务器与相关软件环境。 二、系统修改 xcodes打开项目工程,进行开发者的配置与发布选项的配置,进行游戏名称与版本号修改等,进行编译,发布等。这里面的游戏...
甲公司和乙公司的软件设计师分别完成了相同的涉及计算机程序的发明,两家公司同一天向专利局申请发明专利,此情形下专利权申请人是谁? - **解析:** - 根据我国专利法的规定,在同一天提出相同发明的申请时,应当...
Photoshop,简称“PS”,是由Adobe公司开发的一款图像处理软件,是数字图像编辑与创作的行业标准。在“ps学习第一天”这个主题中,我们将会接触到PS的基础操作和技术,包括但不限于图像打开、保存,基本工具的使用,...
计算器程序通常会有一个用户界面(UI),可能是基于Windows Forms或WPF。在Windows Forms中,开发者会创建一个`Form`,然后在上面添加按钮和文本框,按钮代表不同的操作,文本框用于显示输入和结果。每个按钮的点击...
成本分为直接成本(直接与项目开发相关,如工资、外包费用)和间接成本(如房租、水电费等运营成本),这两部分都会被分摊到项目中。 成本估算方法包括:代码行(LOC)法、功能点(FP)法、类比估算法、参数估算法...
但作为老师和家长,当我看到很多孩子在电脑上只会一个劲玩游戏家长还没办法,我就下决心开发一套能体现家长意愿使孩子能自觉操作的教学软件。 汉字的识记是小孩子很重要的事情。这套软件是我废寝忘食、日夜苦战很多...
系统选用的开发软件是ASP,后台数据库为ACCESS2000 系统的开发用结构化设计思想。本文介绍了考试系统的开发初衷和背景,系统的开发工具,结构化开发的具体步骤,其中包括实体-联系模型,数据流图,功能结构图等 ...
第一天主要介绍API概述和AutoCAD的"Hello.arx"基础步骤;第二天涉及ObjectDBX的结构和扩展;第三天则讲解AutoCAD的多文档环境以及通知系统。 【培训材料】包含了本次培训的所有资源,如ObjectARX的演示文稿、...
圣天诺系列产品是一种智能型的软件加密系统,它包含一个安装在计算机并行口或 USB 口上的硬件,及有一套相应的接口软件和加密工具。 圣天诺加密锁是全球销量第一的软件加密锁。截止到 2002 年底,圣天诺加密锁的总...
总的来说,“2024年春节计时器记录距离过年还有多少天”这一主题涵盖了软件开发、日期时间处理、用户体验设计、跨平台技术以及人工智能等多个IT领域的知识点。这些技术的综合运用,使得一个简单的倒计时功能变得更为...
C#是微软公司开发的一种面向对象的编程语言,广泛应用于Windows平台上的软件开发,尤其是游戏开发、桌面应用以及Web应用等领域。在21天的学习过程中,读者将逐步了解并熟悉C#的各项特性。 在学习C#的过程中,首先要...
MDA(Model Driven Architecture)是一种软件开发方法论,强调以模型为中心的开发过程,旨在提高软件系统的可维护性和可扩展性。 **详细说明:** - **MDA 的优势:** - **可移植性:**MDA 将逻辑模型与物理实现...