无序和混乱终结者,极狐GitLab Workflow 到底有什么魔力?

news2024/11/28 10:37:44

效率质量是软件产品追求的两个核心关键点,软件产品研发是一个覆盖多阶段、涉及多团队的过程,业界也已经总结出了一些很好的实践,在保证研发效率的同时还能保证代码质量。比如代码提交规范、Code Review、代码准入、CI/CD。

但是由于缺乏行之有效的研发流程规范,让上述实践在落地的时候往往流于形式、可有可无,让保证质量、提升效率成为悬而难落的话题。而代码提交不规范、不同开发模式下代码审核与准入环节的缺失是导致质量与效率双双下降的重要原因

所见非所得的代码提交


代码变更提交信息能够让外界对所变更的代码有一个快速、清晰的认知,可以初步判断出变更代码的类型(新 feature 上线、bug fix、文档修复等),变更代码的范围(某个接口的增删改、某个功能的增删改等),不仅利于代码审核人员对于审核代码有一个初步认知,也有利于出现问题之后的问题回溯,更重要的是有助于提高代码的可维护性。

代码提交规范是每个企业都在追求实践的,但并非所有的企业都能够通过流程 + 工具将规范进行到底,尤其在项目需要紧急上线,bug 需要紧急修复时,下面的这种代码提价信息也就变得比较常见了:

4deaaed (HEAD -> main) add new feature
5224286 fix api bug
2506aa2 fix typo
70819a2 delete useless code

看似懂了又似乎没懂的代码提交信息折射出了不规范的代码提交带来的后果:所见非所得

简单但是熵增的开发模式


基于 “主” 分支的开发

由于 git 使用的复杂性,当团队的 git 使用技巧(分支的管理、代码的回退等)达不到一定程度时,在业务提交紧急时,git add && git commit && git push 就成了代码提交三步曲,变更代码被直接推送到主分支,走先提交再验证的流程。

这是看似快捷方便的代码提交会带来以下问题:

  • 逐渐失控的代码仓库

代码都是直接推送到 “主” 分支,代码没有先经过验证就提交,容易导致有问题的代码被合并到主分支,主分支可能会随时被阻塞,难以保证主分支实时可用、可交付的状态。另外,在不做提交文件限制(比如 pem、jar、war 等)的情况下,随着功能的迭代,代码仓库就会 “爆仓”逐渐失控。

  • 无法保证质量的代码

代码变更都是先提交再去验证(提交之后,在主线验证),在提交前或提交后都不做 Code Review,代码的质量是难以保证的,最终导致产品的整体质量下降。

  • 返工严重,耗时耗力

代码提交到主分支上,验证不通过就需要返工进行故障查找和修复。由于缺乏提交前的充分验证和审核,就会导致这种返工是频繁的、耗时耗力的。

基于 “多” 分支的开发

当然,随着团队对于 git branch 的熟悉,基于 branch 的业务开发也成为被很多团队所采用的开发模式。开发人员不管是上线新功能还是修复缺陷,都是先创建一个新的分支,基于这个新分支完成代码变更,经过验证之后再合入主分支。

这种模式虽然能够让开发者之间 “互不干扰” 的进行开发,也能够比上述基于 “主干” 分支的开发,让 “主干” 分支被阻塞的时间大大缩短,但是依旧存在代码质量无法保证的问题,因为缺失了两个关键环节:

1. Code Review

Code Review 是保证代码质量的有效一环。“只要眼睛多,bug 容易捉”,如果让其他同行人员对于代码变更进行 Review,不仅能够对于变更代码是否符合业务逻辑做一些检查,还有可能发现一些潜在的缺陷,并且将反馈直接反馈给代码提交者,在修复之后再进行代码提交。很多时候,这种 Review 可能是多个回合,对于代码质量的提高是非常重要的。

2. Approve Rules

代码的合并需要有一定的准入规则,一来可以防止代码提交者自己直接进行代码合并,二来需要确保变更的代码是经过了充分验证的,诸如需要经过 QA 的验证确认、需要安全团队的安全扫描确认等,才能够有特定的人员批准代码的合入,变更代码才会最终进入到主分支。

不管是上述的哪种开发模式,都没有将项目管理、代码变更、代码审核、代码准入完整的串起来,形成真正的规范化的研发流程来在保证效率的同时,保证代码质量。

因此,寻求一个可以落地、可以推广的规范化研发流程,是可以帮助研发团队将一些想实施但是容易流于形式的做法真正实践起来,真正的帮助团队提高研发效率、保证代码质量。而这一规范化的研发流程有几个要素是不可或缺的

  • 所有变更的发起都要有迹可查,有地方记录变更发起的原因,范围等;

  • 所有变更代码都要强制执行 Code Review,避免流于形式;

  • 所有变更代码的准入要有一定的规则,只有被特定人员批准的代码才可合入主分支;

  • 所有变更代码从构建到部署尽量自动化,避免过多手动步骤。

极狐GitLab Workflow


极狐GitLab Workflow 通过将需求管理、代码审核、CI/CD、代码准入、安全扫描等流程融合在一起形成规范的标准化研发流程,能够提高不同团队、不同人员之间的协作效率,加速软件产品从想法到生产上线的速度,而且整个过程能够保证代码的质量和安全。

一切变更从 issue 开始

对于软件产品的任何变更,诸如新功能添加、缺陷修复、安全补丁升级等,都应该有所记录,这会让故障回溯、安全审计变得更容易

极狐GitLab Workflow 的起始就是利用 issue 来完成对于所需变更的详情描述与记录,而且可以通过 issue assign 来指定具体的负责人对 issue 进行处理与跟踪。

比如针对一个需要修复的缺陷,可以通过下面的方式来完成缺陷的记录:

在 issue 描述中可以详细描述缺陷的特征、发现的版本、如何复现、期望修复时间等信息方便修复人员对于缺陷有更清晰的认识,再通过 assignees 来指定 issue 的具体负责人,将修复责任落到实处

此外,Epic、Milestone 等极狐GitLab 项目管理功能有助于项目管理人员对缺陷的修复进度进行查看与把控。

基于分支的开发

创建完 issue 之后,可以创建一个 MR(Merge Request)来实现基于分支的开发,后续的所有操作(代码变更、CI/CD、代码审核等)都与此 MR 相关联,这也完成了 issue 与 MR 的关联。

极狐GitLab Workflow 支持在 issue 创建的同时创建 MR,而且可以指定要创建的分支:

 

Code Review + Approve Rule,严格把控代码质量

可以在 MR 中直接指定 Reviewer 对于 Code 进行 Review,而且可以指定多个 Reviewer。Reviewer 可以在提交的变更文件中进行代码 Review,如果需要添加 Review 意见,直接在对应的代码行数前点击 comment 图标,即可出现添加 Review comment 的方框,输入 Review comment,点击 Start a review 即可。

代码提交者可以根据 Review comment 进行相应的修改,在确定可以合并后,即可和 Approver 进行沟通,进行代码合并。

可以通过添加 Approve Rules 来对代码的准入规则做限定:

比如可以指定对应的 Approver 以及最少 Approve 人数以及 Rules 生效的分支:

而且可以通过额外的设置还组织代码提交者自己进行 Code Approval、组织随意修改 Approval Rule 等,来进一步规范 Code Approval 流程:

这种多人进行 Code Review,多级进行 Code Approve 的机制,形成了把关代码质量的双保险。

CI/CD 实现变更的自动化构建

CI/CD 能够完成变更代码的自动化构建、测试、安全扫描等,不仅能够加速代码从变更到部署的速度,也保证了每次代码变更都会经过同样的构建、验证流程。而且最重要的是 CI/CD Pipeline 的构建结果、测试结果、安全扫描等结果都可以直接反馈到 MR 中,为 Code Approver 提供数据决策:

没有规范可落地的研发流程就无法在团队、组织内推广提高代码质量与提升研发效率的一些最佳实践。

极狐GitLab Workflow 通过将需求管理、代码质量保证、CI/CD、安全防护等手段融合在一起,用流程 + 配置的方法让流于形式、难以落地的实践都发挥真正的作用,实现用标准化研发流程来实现效率与质量的双提升

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

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

相关文章

冒死开源。阿里新产Spring Boot+Spring Cloud微服务开发实战笔记

昨天跟粉丝聊到了一个问题,他说现在很多招聘要求需要有微服务经验,本人目前生产上没有微服务经验,该如何弥补? 小编在这儿就分享一份学习资料,这份资料既是初学者学习微服务开发的技术宝典,又是中级开发人…

不同版本的谷歌浏览器跨域怎么设置?

由于项目前端使用8001端口,后端使用的8080端口,因此前端调用后端接口时需要跨域,在浏览器中需要设置跨域,否则会由于跨域安全性导致请求失败。 一. 浏览器版本大于49 1.在chrome中,需要新建一个chrome浏览器的快捷方…

HiveSQL分位数函数percentile()使用详解+实例代码

前言 作为数据分析师每个SQL数据库的函数以及使用技能操作都得点满,尤其是关于统计函数的使用方法。关于统计出数据的中位数,众数和分位数的方法必须掌握几种,一般在实际业务上大部分都是以写SQL查询为主,因为如果想用Python的Pa…

植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(下)

植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(下)36、全屏秒杀37、秒杀实现37、PVZ聚怪38、种植CALL的查找与调用39、OpenProcess错误40、错误:constchar[19]”转换为“LPCWSTR”附录:36、全屏秒…

opencv的相机校准和3D建模的理论知识

一、相机标定的四个坐标系 1、世界坐标系(Xw,Yw,Zw):也称真实或现实世界坐标系,或全局坐标系。它是客观世界的绝对坐标,由用户任意定义的三维空间坐标系。一般的3D场景都用这个坐标系来表示。 …

SSM框架使用多数据源(druid连接池)

最近有个数据归集的需求用到了多数据源,在业务库保存后同时向归集库插入或数据。之前好像还没做过这块的东西,简单记录下防止下次又忘记了~ 踩过的几个坑都是某些知识点不熟悉导致的,而且都是框架配置相关的.. 先上代码,再扯淡 …

PyQt5 拖拽与剪贴板

拖拽与剪切板拖拽剪贴板拖拽 基于MIME类型的拖拽数据传输时基于QDrag类的QMimeData对象管理的数据与其对应的MIME类型相关联。 MimeData类函数允许检测和使用方法的MIME类型 判断函数设置函数获取函数MIME类型hasText()text()setText()text/plainhasHtml()html()setHtml()tex…

【Java八股文总结】之SpringBoot

文章目录SpringBoot1、Spring Boot的优点?2、Spring Boot自动配置原理3、如何定义一个SpringBoot Starter?4、SpringBoot启动原理?5、SpringBoot的常用注解Spring Cache1、Spring Cache介绍2、Spring Cache注解Sharding-JDBCSpringBoot 1、S…

关于vector的迭代器失效

目录 关于迭代器失效的判定 1 迭代器指向的位置是野指针(全部迭代器失效) 原因: 解决 2 erase或者insert之后迭代器被更改了(部分迭代器失效) 原因 迭代器失效的场景: 改进之后 部分迭代器失效之越…

十年前的AlexNet,今天的NeurIPS 2022时间检验奖

目录:十年前的AlexNet,今天的NeurIPS 2022时间检验奖一、前言二、时间检验奖一、前言 作为当前全球最负盛名的 AI 学术会议之一,NeurIPS 是每年学界的重要事件,通常在每年 12 月举办。大会讨论的内容包含深度学习、计算机视觉、大…

三款“非主流”日志查询分析产品初探

前言 近些年在开源领域,用于构建日志系统的软件有两类典型: Elasticsearch:基于 Lucene 构建倒排索引提供搜索功能,DocValue 存储支持了其统计分析能力。Clickhouse:列式存储是其优秀 OLAP 性能的保障。 这里把上述系…

Windows安装MySQL

目录 1、确认本地是否安装了mysql 2、下载安装包 3、安装mysql 4、修改mysql密码 5、配置环境变量 1、确认本地是否安装了mysql (1)按【winr】快捷键打开运行,输入services.msc,点击【确定】; (2&…

大数据开发和软件开发哪个前景好?

大数据开发和软件开发哪个前景好?大数据开发学习有难度,零基础入门要先学习Java语言打基础,然后进入大数据技术体系的学习,学习Hadoop、Spark、Storm等知识。软件开发工程师根据不同的学科从事的岗位也千差万别。 先说说大数据开…

关于激光雷达传感器分类及简介

关于激光雷达传感器(根据特性进行分类介绍)0一些激光雷达的厂商总结1 基本介绍2 基本分类及组成2.1 激光雷达的相关分类2.1.1 机械式激光雷达:2.1.2 混合固态激光雷达:2.1.3 固态激光雷达:OPA和Flash固态激光雷达2.2 机…

Linux shell 脚本学习

目录 1.shell编程的基本格式 开头 注释 加可执行权限 执行脚本的三种方法 2.变量 定义变量和清除变量 从键盘获取值(read) 读取多个值 只读变量(readonly) 位置变量 变量运算 3.条件测试 文件测试 字符串测试 数值测试 逻辑操作符 4. if条件语句 if条件语句语法 单…

SPARKSQL3.0-源码剖析全流程导读

SPARKSQL-源码剖析全流程导读 一、处理流程 spark从一条sql语句一步一步转换成物理执行结果,这中间需要经历几个阶段,如下图: 二、各阶段概述 1、Unresolved-未解析阶段 此阶段主要做了两件事: 1、将sql字符串通过antrl4转化…

元数据管理系统

数据治理工具–元数据系统数据服务基础能力之元数据管理元数据管理系统设计 1.元数据概述 1.1 介绍 如果想建设好元数据系统,需要理解元数据系统的相关概念,如数据、数据模型、元数据、元模型、ETL、数据血缘等等。 首先,要清楚数据的定义…

python_函数

一、函数介绍组织好的,可重复使用的,用来实现特定功能的代码段例如:len() 函数--Python内置函数# 已组织好的、可重复使用,针对特定功能 def my_len(data):count 0for i in data:count 1print(f"字符串{data}的长度是{coun…

WebRTC实现一个网页在线录制视频

电脑录制视频几乎不会用到,当有需要的时候就各种找软件找工具,并且都会找免费的。现在市场上肯定有很多符合需求,只是那么偶尔的情况下,而且使用场景不是那么多要求的情况下,一个网页在线直接录屏是不是非常nice。 很…

40Java Runtime类

目录 Runtime类 1.概述 2.常见方法 (1).getRuntime返回环境对象 (2).exit停止虚拟机 (3).availableProcessors返回线程数 (4). maxMemory返回获得最大内存 (5).totalMemory返回已经获得内存 (6).freeMemory返回剩余内存 (7).exec运行cmd命令 Runtime类 1.概述 ​ Run…