关于研发过程中的代码版本控制的思考

news2024/9/24 7:26:04

文章目录

  • 前言
  • 一、研发
    • (1)分支管理
    • (2)代码提交规范
    • (3)版本号控制
  • 二、测试
    • (1)研发自测与用例评审
      • 研发自测
      • 测试人员测试
    • (2)BUG反馈与复测
    • (3)回归测试
  • 三、发包
    • (1)自动化打包
    • (2)打基线
    • (3)发版记录
  • 总结


前言

通常,在项目管理过程中,我们会对代码管控进行分类,比如分支、主干、基线等等。
但是,有些项目,它需求来来回回反复变更(就好比女盆友的脸,说变就变),发包日期无法自主把控(犹如女盆友的大姨妈,时而提前,时而延后,让人终日不能心安)。简单的主干、分支管理根本无法解决那么多突发情况。(有时恨不得一行代码一个分支去干!夸张了哈)
在这里插入图片描述

说点儿题外话: 在目前的公司呢,也呆了有快六年时间了,发现来到这家公司后,博客很少更新了。开始时是因为确实有很多新东西要学,很多业务知识要补习,很多行业知识要了解。慢慢的陷入了更多的琐事、杂事中。回过头来看,这几年在项目中应用了不少技术,但都没有深入沉淀下来,日常中一直在处理类似管理或设计上的事情。虽然我一直认为技术并不是一个研发人员的最重要技能,但一直深陷到琐碎的事务中,长期如此下去,对身心都不会太好。所以,上周我离开了奋战多年的公司,希望给自己些时间休息下,思考下未来的道路,顺便这几年的一些技术总结整理下,与大家共勉!

言归正传!下面是我在日常的项目代码管控中的一些思考与总结:


提示:以下是本篇文章正文内容,下面案例可供参考

一、研发

研发-测试-发包,这是一个软件功能从研发到上线的基本流程,在流程中的每个环节都有相应的关键点。下面对每个环节进行说明:
在这里插入图片描述

(1)分支管理

即代码域的划分。一般情况下,是主干、分支、基线,三个大域。

  • 主干(trunk): 主要用于提测、打包、发包和打基线;只进行提测前的分支合并与提测期间的bug修复。

也有人认为主干不能进行直接开发。我个人认为,应该视情况而定:比如就是一个小的bug修复,可以不用拉分支,直接在主干改;如果是复杂bug问题,修改内容较多,或是新需求,这些都需要创建分支进行开发,然后发版提测前把分支合并到主干。凡事不能因循守旧,项目管理不是一成不变的按既定规则执行,很多情况下,起始是需要技术负责人根据实际情况灵活变通。

  • 分支(branches): 分支有几个类型:新功能研发分支、已发版问题修复分支;

新功能研发:是基于trunk的代码进行创建,开发完成后,达到发版时机时,合并到主干后提测;

已发版问题修复:是基于tags或稳定定版的代码版本进行创建(每次发版后,必须对代码打基线tags),哪个版本有问题,就根据哪个版本的基线域创建分支,测试通过后,再将此分支合并到主干。(如果需要立即发包,就直接将该分支提测,如果后续修复,则此分支现场验证通过后,可合并主干,随后续功能一同提测发包)

  • 基线(tags): 只用于发正式版时的代码备份。

一般由测试人员在版本发布前,将代码备份

在这里插入图片描述
以上是对三个代码域的介绍,下面是实际项目开发过程中的一些注意事项的总结:

  • 创建分支时,最好注明该分支是基于哪个代码创建的,用于做什么功能,方便后续代码合并;
  • 代码合并时,可通过将合并的路径及合并的svn版本区间一并写入到提交记录中,方便后续排查问题;
  • 分支合并后,技术负责人需要将分支的svn进行锁定,避免其他人员再次修改提交;
  • 一定要做好代码提交时的记录编写,说明每次提交的内容及关键代码类;

(2)代码提交规范

代码提交规范
即指svn或其他版本控制工具,严格限制代码提交的格式。需要按照规范格式描述提交信息的具体内容。(具体如何实现,可能和SVN钩子强制提交日志等相关,各位自行百度或脑补吧,这块可能涉及到QA、质管部门的一些自动化工作)
格式规范描述内容比如:修改内容、新增功能或需求描述,是否自测等等。
在这里插入图片描述
代码格式规范
为了避免过多的代码冲突,规范代码的格式是必要的。
这一点,各种开发工具都有其自动格式化的插件或工具,比如AndroidStudio在进行svn提交时,就能自动进行代码格式化。
在这里插入图片描述
对于已经在运的项目,之前如果没有进行格式化,也建议统一对项目进行一次格式化处理,保障代码既整洁又便于管理。
方法如下:对项目进行格式化(快捷键Ctrl+alt+L)
在这里插入图片描述

(3)版本号控制

每个公司对版本号的规定各不相同,参照之前网上流行的版本控制,主要需要注意几点:

  • 版本号的含义,如1.1.1,每段标明不同的含义,比如最前位1是大版本号,第二位1是新功能版本号,第三位1是bug修复版本号;

  • 版本号的区分,如beat-1.1.1就是内测版,debug-1.1.1就是调试版;per-1.1.1就是个性化版本。

  • 通过编译时间打包到程序中,避免人为修改版本号时的遗漏问题;

注:虽然版本号可以让我们区分程序包的版本,但毕竟修改版本号是人为改动的行为,难免会出错(尤其是调试包发包时)。所以为了避免人为因素的干扰,我通常会在程序中定义一个打包编译时间。在日志记录或隐藏按钮处可以查看这个打包编译时间。因为正式包只会编译打包一次,时间就固定下来了,我们去核对程序是否是我们某个时间发布出去的包时,更准确的是核对打包编译时间。
比如:安卓的gradle中能够自定义buildConfigField,webpack的DefinePlugin插件可以定义时间变量等等。

如下图:BUILD_TIME即为编译打包的时间,编译一次,就固定写入到程序包中,后续进行程序对比时,就可以根据编译时间判断程序是否是正式发包的程序。
安卓gradle环境变量配置webpack打包配置
关于webpack的定义打包时间,可以参考往期博客:通过webpack配置【程序打包时间】

二、测试

(1)研发自测与用例评审

测试分为研发人员自测和专有测试人员测试

研发自测

研发人员开发完一个功能后,自测是一个必要的流程。不进行自测就直接提交给测试人员测试,是一种不负责任的表现(和渣男渣女的烂桃花行为无异)。

无论开发的是app程序、中间件、插件或是组件,都需要进行自测。对于中间件、插件等一类需要依赖于其他程序集成调用的组件开发,需要有相对应的测试程序。不求完全复现集成调用的整个流程,至少也要尽可能的覆盖到组件的所有功能调用接口,否则,后续出现问题时,要依赖于其他程序进行测试,这是一个很麻烦的问题。

测试人员测试

各个公司的测试人员配比可能不尽相同,但有一个专业的测试人员是一个项目保障质量的最后关卡。
其中,测试用例编写,是此流程中的一个关键环节,测试用例是否尽可能的覆盖了所有场景,是否能指导其他测试人员开展测试工作等等。

测试人员一般会针对研发提测的功能进行梳理,前期进行系统的冒烟测试,随机测试,然后根据功能、需求以及测试程序,进行测试用例编写。项目组评审完测试用例后,测试人员会根据测试用例展开更细致的功能测试。(测试用例编写和评审没有严格的先后顺序,有时也会依紧急程度而定,但用例评审时,主要研发负责人肯定会参与)

(2)BUG反馈与复测

BUG问题反馈是测试人员与开发人员的沟通环节。通常是需要测试人员对问题现象、操作流程、期待结果等信息进行记录,并转交给开发人员进行排查、定位。一般会使用类似禅道的平台工具进行流程化管理bug问题。
开发人员接收到bug反馈后,会根据描述信息和操作步骤进行复现,或是根据反馈的信息,进行分析定位原因。之后对问题进行修复。并提交给测试人员进行复测。

(3)回归测试

回归测试一般是对一轮问题修复后,再次进行各个功能的复测。分为全面回归、选择性回归等等。有些公司可能还会用一些专业的自动化测试工具来降本增效。但归根结底,其实是对一轮bug修复后的重新验证,避免在修改代码时的相互影响。

三、发包

发包环节,分为两类:调试包和正式包
调试包,一般由开发人员直接打包发布;正式包则必须由测试人员通过svn最新代码进行打包。
包含测试环节,也是由测试人员打包,而非开发人员打包

这里说明下,为什么正式包一定要由测试人员通过svn最新代码打包。
(1)可以避免开发人员因未提交代码导致的代码丢失风险;
(2)在正式包出现问题时,可以完全信任svn的代码,并根据提交记录拉取历史版本进行排查分析;

(1)自动化打包

测试人员并不一定需要了解程序的编译、运行环境等,可以通过各种打包编译脚本实现测试人员对程序的一键打包。(但需要注意的是,打包的代码,必须是svn服务器上的最新代码)

(2)打基线

当测试通过后,发包前,需要对当前测试的代码打基线,将当前程序代码复制备份到基线域做记录。以备后续排查问题时,可以随时拉取基线域代码进行分析定位。

(3)发版记录

每次发版的新增功能、修复bug、程序包、程序版本号、相关配套集成环境,都需要进行记录,以备后续进行查看定位。


总结

研发、测试、发包,虽然每个环节都有特定的人去执行,但项目中的成员会参与到每个环节中,对与项目管理中存在的问题,应该勇于提出自己的想法和建议,不断的改进每个环节。项目管理流畅了,每个人的工作才不会受到太多的干扰和影响。

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

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

相关文章

HQL面试题练习 —— 合并数据

题目来源:京东 目录 1 题目2 建表语句3 题解 1 题目 已知有数据 A 如下,请分别根据 A 生成 B 和 C。 数据A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…

【软件设计师】程序语言

1.程序设计语言基本概念 1.1 低级语言与高级语言 低级语言:机器语言和汇编语言称为低级语言 机器语言指0.,1组成的机器指令序列 汇编语言指用符号表示指令的语言,如MOV AX,2 高级语言:从人类的逻辑角度出发&#xff0…

WebGL在医学成像方面的应用

WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…

蓝牙----wireshark抓包查看蓝牙通信过程

一.完整过程 二.过程详细分析 1.广播数据----可连接的无定向广播包:ADV_IND 2.广播数据----主动扫描:扫描请求(SCAN_REQ) 扫描相应(SCAN_RSP)3.被动扫描数据发送连接请求 4.蓝牙配对(没有用到…

香橙派 AIpro开发板:开启AI视觉的无限可能

前言 在当今这个由数据和智能驱动的时代, 人工智能(AI) 已经成为推动技术创新和实现自动化的关键。 特别是在计算机视觉领域,AI的潜能被无限放大,它使得机器能够“看见”并理解视觉世界,从而执行复杂的任务…

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中,良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件,帮助企业做出明智的选择。 一、企业内…

Java面试八股之synchronized关键字的作用

synchronized关键字的作用 同步与线程安全:synchronized是Java中的一个关键字,用于提供一种同步机制,确保线程安全。它通过在多线程环境中控制对共享资源的访问,防止数据的不一致性问题。 修饰代码块:当synchronized…

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…

武汉网红餐馆火灾背后的安全警示:可燃气体报警器需定期校准

在餐饮业快速发展的今天,安全问题一直是行业内外关注的重点。 最近,武汉一家网红餐馆在就餐高峰期突发火灾,事件迅速成为公众关注的焦点。这一事故不仅给餐馆带来了重大损失,也引发了对于餐馆安全管理的深思。 尤其是可燃气体报…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

OrangePi AIPro:次世代嵌入式边缘AI计算与智能机器人应用开发平台

近年来,随着物联网(IoT)和人工智能(AI)技术的快速发展,嵌入式边缘计算板卡在智能设备中的应用越来越广泛。OrangePi AIpro作为一款轻量化高性能的嵌入式边缘人工智能计算SoC,在硬件配置、AI性能和使用便利性方面都有着突出的表现。本文将详细评测OrangePi AIpro的各个方…

【Flutter】Dialog组件PageView组件

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月27日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

重生之while在鸣潮学习HTML

个人主页:终端 今天是开荒的第五天,数据坞都刷了吗,没刷就过来学html! 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

图形学初识--双线性插值算法

文章目录 为什么需要双线性插值算法?双线性插值算法是什么?如何双线性插值?结尾:喜欢的小伙伴可以点点关注赞哦 为什么需要双线性插值算法? ChatGP回答: 双线性插值(bilinear interpolation&am…

【UE5.1 角色练习】08-传送技能

前言 在上一篇(【UE5.1 角色练习】07-AOE技能)基础上继续实现人物通过鼠标点击然后传送技能的功能。 效果 步骤 1. 首先需要显示鼠标光标,我们可以在玩家控制器中勾选“显示鼠标光标” 2. 在项目设置中添加一个操作映射,设置按…

助力企业标准化搭建--图框模板的创建

古有秦皇书同文、车同轨,今各行各业都有国际标准、国家标准,其目的就是为了标准化、统一化,由此可见标准化的重要性;一个企业若是想规范员工的操作,推行标准化也很重要;因此对于需要绘制电气图纸的行业来说…

路由器交换机直连方案(RM50+RTL8367N)

不经过网口和变压器,实现板级网口扩展。 通过网口,网线连接 板级芯片直接连接,验证OK 激光导航控制板通过路由器上网成功

linux定时任务管理操作

1、Crontab命令格式 crontab [-u username] [-l|-e|-r] 参数: -u: 只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度; -e: 编辑crontab 的工作内容; -l: 查阅crontab的工作内容; -r: 删除所有的crontab的工作内容,若仅…