如何使用极狐GitLab 机器人大幅提升研发效率

news2024/11/25 15:37:19

本文来自:

黄松 极狐GitLab 后端工程师

研发效率对互联网/科技类公司来说至关重要,效率高意味着你能用更低的人力、时间成本在市场试错,成功的概率也会更大。

而说到研发效率的常见阻碍,主要有两点

1. 研发流程中需要大量人工决策介入,带来了高度的不确定性,导致无法形成清晰简单的流程规范;

2. 研发流程中出现大量重复冗余的工作,增加了工作量。

先确定好研发流程规范,再逐步分析识别需要人工决策以及大量重复冗余的步骤,并尝试使用自动化程序代替,这就是极狐GitLab 研发团队提升研发效率的探索方向。极狐GitLab 研发团队当前主要维护着两个机器人项目:Triage Ops 和 Danger Bot ,下面我会详细讲解极狐GitLab 是如何通过机器人来提升研发效率的,希望对关注研发效率的朋友们有所启发。

极狐GitLab 团队最佳实践


自动化议题的组织与分类

议题清晰的分类标记对处理效率很有帮助,在机器人自动化处理之前,基本要靠人工来识别和提醒。我们在处理议题分类的自动化时,先为议题 (Issue) 做了很详细的分类(使用极狐GitLab 标记功能):

然后在流程上做出一些约定:

1. 每个议题都应该有个分类标记,方便快速定位处理人;

2. feature 和 maintenance 这两类议题需要明确指定下一级分类。

最后,我们开发以下功能,整个议题的自动化处理就完成了:

1. 对于规范要求的 “每个议题都应该有个分类标记”,我们开发了一个机器人提醒功能,对每个符合条件的议题做出提醒;

2. 对于 “feature 和 maintenance 这两类议题需要明确指定下一级分类”,我们也开发了一个机器人提醒功能,对符合条件的类型标记做出进一步的提醒;

3. 之前有用户认为如果直接指定一个二级标记,那么应该自动帮我们补全他的一级标记,而且不应该再提醒需要类型标记,这个我们也实现了。

自动化议题的工作流转

议题的工作流转情况有很多,在自动化之前,我们需要全部手动判断处理,容易出错。在自动化之后一切都变得轻而易举

实现极狐议题自动化流转,首先我们增加了四个 workflow 标记来区分不同阶段状态(极狐GitLab 议题原生的状态只有 opened 和 closed 两种,不够区分),以下是完整的状态流转图:

接下来,我们开发了这些功能来让研发过程中的议题流转变得自动化:

1. 自动为 bug 类型议题打上 workflow::in confirmation 标记,并自动分配给 QA 工程师处理。保证每个 bug 处理前需要先被复现,这也是保证验收合格的前提;

2. 当议题指派给 DEV 角色时,自动给议题打上 workflow::in dev 标记,表示已经进入开发阶段;

3. 当议题关联的合并请求准备就绪 (Ready) 时,自动给议题打上 workflow::in review 标记,表示已经进入代码审核阶段;

4. 当议题指派给 QA 角色时,自动给议题打上 workflow::in qa 标记,表示已经进入 QA 验收阶段。

自动化代码的审核流程

代码的审核 (Review) 在研发过程是很耗时的,提高审核效率能直接为研发周期节省很多时间

极狐研发流程规范里,为代码审核添加了 “安全审核” 的步骤,保证代码进入主分支前没有安全隐患,以下是极狐GitLab 完整的代码审核流程:

在自动化之前,我们的安全审核全靠手动找人和沟通,而在自动化后机器人会自动提醒推动流程,且整个过程也会详细记录下来,方便追溯。我们安全审核机器人的逻辑是:

1. 当代码审核者审核第一次通过时,机器人会通知一名安全审核者来做安全审核,并打上 security-review::pending 标记;

2. 安全审核通过时,机器人会自动修改标记为 security-review::approved,维护者可以根据这个标记状态判断是否已经完成安全审核;

3. 当代码再次被修改时,机器人会自动撤销安全审核结果重新打上 security-review::pending 标记,并且通知上次的安全审核者再做一次安全审核。

最后,整个安全审核流程就基本被自动化了。另外代码审核还有一个需要解决的问题:如何选择 “审核者” 和 “维护者”。对此我们开发了以下功能:

1. 首先对每个合并请求进行分析归类,常见的类型有:Backend, Frontend, QA, Document 等,一个合并可能同时符合多个类别;

2. 机器人自动为合并请求打上对应的类别标记,比如如果代码同时修改了前后端代码,就同时打上 Backend, Frontend 两个标记;

3. 机器人生成一条 “审核者推荐” 的评论,为每个类别进行 “审核者” 和 “维护者” 推荐,推荐算法会根据员工的状态(请假、忙碌、主动状态)和员工与代码的关联程度进行打分,优先推荐最高分:

“安全审核” 和 “审核者推荐” 两个问题都解决后,代码审核工作基本就已经实现自动化了。

自动化里程碑的过渡

极狐GitLab 研发团队的里程碑周期是每个月 18 号到下个月 17 号:

每次里程碑过渡,我们都会有这两类固定工作需要处理:

1. 每个里程碑都有两个重要会议 “Planning 会议” 和 “Retro 会议”,在 “Planning 会议” 之前我们研发同事需要完成工作余量的评估,而在 “Retro 会议” 之前我们研发同事需要总结这个里程碑做的好的以及待改进的点。这些提醒每个里程碑会发生几次,是简单且重复的,因此我们开发机器人功能,自动在固定时间里做出提醒。实际上程序比人更不容易遗漏和出错。

2. 议题指派到研发处理时,都应该指定好里程碑(我们的里程碑就是版本),但并不是所有议题都会正确设置里程碑,此时我们的机器人需要能够做到自动纠正:

  • 当一个合并请求被合并却没有里程碑时,机器人会自动根据代码上线版本设置好里程碑;

  • 当一个议题在里程碑结束后仍没有被关闭时,机器人会自动延期到下个里程碑。

在完成以上两类工作后,里程碑过渡时我们需要手动处理的工作越来越少了。

自动化研发的相关报表

通过报表汇总一些数据和任务,是一种很方便的总结和提醒方式。这里实际能做的报表有很多种,比如我们极狐GitLab 研发团队处理了(或计划处理)的报表有:

1. 里程碑回顾报表:分类汇总上个里程碑已完成任务和未完成任务,帮助里程碑回顾时做总结参考;

2. 需关注议题报表:按创建时间和紧急程度列出一段时间内的议题,帮助那些紧急的议题得到优先关注;

3. 需关注合并请求报表:按创建时间倒序列出一段时间内的合并请求,帮助优先关注持续时间较长的合并请求。

以上报表可以让机器人在固定的时间自动生成,帮助研发团队提升效率。

对于研发效率的提升,我们用了五个典型例子来讲解:“议题分类”、“议题流转”、“代码审核”、“里程碑过渡”和“自动报表”,实际上能做的事情还有很多,大家也可以积极探索,进一步提升企业研发效率,让研发工作更高效!

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

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

相关文章

基础二分查找总结

前言 由于我在学习二分查找的过程中处于会了忘,忘了复习的状态,因此总结一套适合自己记忆的模板。建议先看参考资料[1,2,3]^{[1,2,3]}[1,2,3],理解二分查找各种细节的由来。 二分查找又死循环了?【基础算法精讲 04】手把手带你撕出…

9656教程总结

9656 世界机器人大会青少年电子信息智能创新大赛官网少儿编程办学经验介绍机器人体验展馆体系课程知乎加盟介绍 知识点汇总 年龄 4-6岁 韩纳机器人主题体验馆 赛事 WRC世界机器人大赛, NOC全国中小学信息技术创新和实践大赛 5岁前:乐高积木,孩子年龄小只需对科特、编程…

事关网站数据安全,你真的了解https与SSL证书之间的关系吗?

虽然根据网上的建站教程,大多数站长都知道要给域名添加一个SSL证书,以此来开启https进而可以获得更好的用户体验以及提高网站的安全性。但是SSL证书为什么能使得网站https?你真的去细究过两者之间的关系吗?本文就来说说https与SSL…

python模拟三颗恒星的运动

文章目录随机三体三星问题随机三体 目前来说我们并不关心真实的物理对象,而只想看一下三个随机的点放在三个随机的位置,赋予三个随机的速度,那么这三个点会怎么走。所以其初始化过程为 import numpy as np m,x,y,u,v [np.random.rand(3) f…

【java入门系列四】java基础-数组

学习记录🤔数组引出动态初始化数组内的数据会自动转换类型注意事项数组赋值机制数组拷贝数组扩容append?多维数组trick生成随机数Math.random()讨论总结谢谢点赞交流!(❁◡❁)更多代码: Gitee主页:https://gitee.com/G…

如何进行复盘

复盘定义 复盘,原本是围棋术语,指下完一盘棋后,双方棋手把对弈过程重新摆一遍,看哪里下得好,哪里下得不好,哪些关键节点有不同甚至更好的下法,以检查对局中招法的优劣与得失,并从中…

深入理解可变参数列表

目录 1.前言 2.基本使用方法 1.引入 2.相关宏介绍 3.原理剖析 1.传参 2.va_list 3.va_start() 4.va_arg() 5.va_end() 4.注意事项 5.总结 1.前言 在C语言中,对于一般的函数而言,参数列表都是固定的,而且各个参数之间用逗号进行分开。而除…

面试,演讲为什么一说话就紧张? 的底层解读

信息存在损耗在说话中,说话者与接受者之间传递信息存在损耗。而且人表达情绪不管是说话,还有肢体语言,这使得增加了信息接受者的信息量。下面引入两个词语来说明。给予与流露的含义给予:别人评价你做的菜好吃。流露:别人眉头一皱。…

探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存的实现

大家好,又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。 通过前面的文章,我们一起剖析了Guava Cache、Caf…

如何在线录屏?怎么录制网课

当我们需要学习特定知识时,可以在网络上寻找教学视频进行学习。一般情况下,视频会一直保留在网上,可以随时随地观看。那您知道我们平常观看的网络课程是如何录制的吗?如何进行在线录屏?今天小编教您如何在线录制视频网…

C语言——指针进阶(含例题及详细代码分析)

文章目录导语:思维导图:1.字符指针2.指针数组3.数组指针3.1 数组指针的定义3.2 &数组名和数组名3.3 数组指针的使用4.数组参数、指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参5.函数指针6.函数指针数组7.指向函数指针数…

Django自定义认证系统原理及源码分析解读

疑问 Django在如何自定义用户登录认证系统的时候,大家都会里面立马说 自定义一个 或者多个backend,比如通过账号密码、邮箱密码,邮箱验证码、手机号短信验证码等等。 然后设置 在settings中配置一个 AUTHENTICATION_BACKENDS就行。 但是为什…

【尚硅谷】Java数据结构与算法笔记11 - 树结构的实际应用

文章目录一、堆排序1.1 堆排序基本介绍1.2 堆排序的基本思想1.3 堆排序步骤图解1.4 堆排序思路总结1.5 堆排序代码实现二、赫夫曼树2.1 基本介绍2.2 重要概念1.3 赫夫曼树构建思路图解1.4 赫夫曼树代码实现三、赫夫曼编码3.1 基本介绍3.2 原理剖析3.3 实践:数据压缩…

java运算符2023010

运算符: Java语言中的运算符可分为如下几种。 ➢ 算术运算符 ➢ 赋值运算符,/—/各种和等号组合的都是赋值运算符,赋值表达式是有值的,赋值表达式的值就是右边 被赋的值。例如String str2str表达式的值就是str。因此,赋…

Java技能树-操作符(一)-练习篇

算术运算符 执行完下面的代码,变量b的值是: java int a 1; int b a; 答案是:D 在后,先赋值再运算 自动递增和递减 下面代码执行后的结果是: int a 0; a a; int b 0; b b; System.out.println("a " a); S…

Numpy的轴及numpy数组转置换轴

Numpy的轴 import numpy as np 数组np.array([[[1,2],[4,5],[7,8]],[[8,9],[11,12],[14,15]],[[10,11],[13,14],[16,17]],[[19,20],[22,23],[25,26]]]) print(数组.shape) # 返回 (4, 3, 2)最内层一对 [ ] 可以代表一个1维数组 加粗的一对 [ ] 里面有3个一维数组,也…

Layout布局(element ui)

Layout布局嘚吧嘚gutter示例发现el-row行内容居中默认局左上角水平居中垂直居中水平垂直居中嘚吧嘚 其实layout布局的使用在element官网上都有相关描述,也有相关示例,很容易快速上手。但是在实际使用的过程还是发现一些问题,于是做了一些学习…

递归(基础)

目录 一、递归的定义 1、什么时候会用到递归的方法 1. 定义是递归的 2. 数据结构是递归的 3. 问题的解法是递归的 2、应用递归的原则 3、递归调用顺序问题 1. 首先递归的过程可以总结为以下几点: 2. 递归工作栈​​​​​​​ 二、 递归和非递归的转化 …

Allegro如何快速把Class高亮成不同的颜色操作指导

Allegro如何快速把Class高亮成不同的颜色操作指导 在做PCB设计的时候,高亮Class组是一个非常频繁的操作,Allegro支持快速的将Class高亮成不同的颜色,并且还可以形成一个列表,如下图 具体操作如下 选择File选择Change Editor

select ( ) for update 锁行还是锁表?

select ( ) for update 锁行还是锁表? 一、验证 创建SQL表 //id为主键 //name 为唯一索引 CREATE TABLE user (id INT ( 11 ) NOT NULL AUTO_INCREMENT,name VARCHAR ( 255 ) DEFAULT NULL,age INT ( 11 ) DEFAULT NULL,code VARCHAR ( …