GitHub 自动合并 pr 的机器人——auto-merge-bot
本文首发于 Nebula Graph Community 公众号

背景
作为一款开源的分布式图数据库产品,Nebula 所有的研发流程都在 GitHub 上运作。基于 GitHub 生态 Nebula 技术团队有一套 pr 的自动化流程:每次 pr 提上来的时候, pull request bot 跑一遍测试,看看这个 pr merge 到主分支以后是否可以保证当前的一些功能还可以继续正常运行。
这时候,问题出现了:每个 pr 上来一次都要跑一遍测试,这样的操作既费时又对测试机造成不必要的消耗。于是,Nebula 研发团队打算演变现有的 pr 合并机器人。
本文主要讲述如何在原先的设定下,优化设计,从而节省测试资源。
设计思路
基于现有 bot 的实现思路,来开发一款新的 bot 优化 pr 合并。新的 bot 主要特点是,利用 github action 提供的 on schedule 功能,在每隔一段时间后可以自动执行所有 pull request 合并后的测试,这样一来就不需要每个 pull request 都跑一次 CI,节省了时间和性能消耗。若测试失败,则用随机剔除的方案剔除其中某个 pull request 然后继续执行测试,直到测试通过或者没用可用的 pull request 为止。随后将此次测试通过中的包含的 pull request merge 到主分支中,并且提供发送此次 merge 信息到钉钉群里的功能。
假设用户有一个新的 pull request 提上来,它的一生需要经历:
pull request 被 reviewers approve
Repository maintainer 评论/merge,表明同意 merge
完成 1,2 后, pull request 就会被 bot 识别为可 merge 的 pull request
bot 将所有标为可 merge 的 pull request 预加载到 runner 的本地基于 master 的分支中进行 ci 测试
测试通过,pull request 被 merge 到主分支;测试失败,bot 会随机剔除现有包含的 pull request,再进行测试,直到测试通过或者没有可用的分支为止。
(可选)bot 将本次 merge 的结果发送到钉钉群中
需要注意:
使用 auto-merge-bot 时,repository 需要在 GitHub orgnization 中配置一个 team,这个 team 里的部分 member 的 role 需被标识为 maintainer,对应上述步骤2。
maintainer 可以通过评论 / merge 表示同意 merge 该 pull request,也可以通过评论 / wait a minute 或者删除评论取消 merge,但是目前如果 bot 已经在运行中,只能通过手动停止此次 bot 的 workflow 来取消 merge,在未来版本中会加入该功能。
关于钉钉群发送功能,需在钉钉群中配置机器人,详见 https://developers.dingtalk.com/document/robots/custom-robot-access 和 https://developers.dingtalk.com/document/robots/customize-robot-security-settings,目前仅支持加签的安全设置方式。
ci 测试的代码需要用户在入参中传入。
Github Action 的 schedule 有延迟,并不会按照指定的时间如期运行,通常延迟 15 - 30 分钟。
测试用例
...
on:
schedule:
- cron: '* */1 * * *'  --- 每小时跑一次
workflow_dispatch:
...
- name: Run merge script
  uses: klay-ke/auto-merge-pr@master  --- 该地址以后可能会改
  id: merge-pr
  with:
    send-to-dingtalk-group: true
    dingtalk-access-token: ${{ secrets.DINGTALK_ACCESS_TOKEN }}
    dingtalk-secret: ${{ secrets.DINGTALK_SECRET }}
    maintainer-team-name: ${{ secrets.MAINTAINER_TEAM_NAME }}
    gh-token: ${{ secrets.GH_TOKEN }}
    ci-command: 'bash ./build.sh'
输入
参数	类型	required	默认值	描述
send-to-dingtalk-group	boolean	否	false	若为 true,则表明需要发送 merge 信息到钉钉群中,同时 dingtalk-access-token 和 dingtalk-access-token 字段需要提供
dingtalk-access-token	string	当 send-to-dingtalk-group 为 true	空字符串	钉钉群机器人的 access token
dingtalk-secret	string	当 send-to-dingtalk-group 为 true	空字符串	钉钉群机器人的 secret.
maintainer-team-name	string	是	None	maintainer team 的名字
gh-token	string	是	None	Github Token
ci-command	string	否	None	ci 测试代码
输出
可通过 ${{ steps.{action设置的id - 对应用例中的merge-pr}.outputs.{参数名} }} 在后续 step 中读取输出;
参数	类型	描述
merge-info	string	本次 merge 信息
error-log	string	错误日志
pass-log	string	日志信息
merged	boolean	是否有 pull request 成功 merge
以上。
Nebula 社区首届征文活动正式开启啦 奖品丰厚,全场景覆盖:撸码机械键盘、手机无线充、健康小助手智能手环,更有数据库设计、知识图谱实践书籍等你来领,还有 Nebula 精致周边送不停
欢迎对 Nebula 有兴趣、喜钻研的小伙伴来书写自己和 Nebula 有趣的故事呀~
交流图数据库技术?加入 Nebula 交流群请先填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~
GitHub 自动合并 pr 的机器人——auto-merge-bot的更多相关文章
- 如何参与开源项目 - 细说 GitHub 上的 PR 全过程
		目录 一.概述 二.为什么要参与开源项目 三.为什么我想介绍如何 PR 四.我想参与开源项目,怎么开始? 4.1.寻找一个合适的开源项目 4.2.寻找贡献点 五.我要提交 PR,怎么上手? 5.1.第 ... 
- 2019-8-30-Jenkins-配置自动合并-release-分支到-master-分支
		title author date CreateTime categories Jenkins 配置自动合并 release 分支到 master 分支 lindexi 2019-08-30 08:5 ... 
- Jenkins 配置自动合并 release 分支到 master 分支
		本文告诉大家如何在 Jenkins 配置合并到 release 的内容自动合并到 gitlab 的 master 分支 首先需要两个仓库,一个是 gitlab 的仓库,另一个是 Jenkins 的仓库 ... 
- Jenkins 配合 GitLab 实现分支的自动合并、自动创建 Tag
		Jenkins 配合 GitLab 实现分支的自动合并.自动创建 Tag 背景 GitFlow工作流简介 Gitflow工作流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提供了用于一个健 ... 
- julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域
		编程界的新宠 Julia 发布 1.0 正式版本,多种优势集于一身2018-08-14 14:14 公司Julia 的累积下载次数超过 200 万,已被应用于自动驾驶汽车.机器人.3D 打印.精准医疗 ... 
- git报错:Auto Merge Failed; Fix Conflicts and Then Commit
		本文来源:http://blog.csdn.net/trochiluses/article/details/101007191.出错场景: 协同开发时,我们从远程服务器上pull下代码的时候,出现以下 ... 
- 分支合并git checkout adview       git merge adview3
		分支合并 git checkout adview git merge adview3 
- 手写代码自动实现自动布局,即Auto Layout的使用
		手写代码自动实现自动布局,即Auto Layout的使用,有需要的朋友可以参考下. 这里要注意几点: 对子视图的约束,若是基于父视图,要通过父视图去添加约束. 对子视图进行自动布局调整,首先对UIVi ... 
- 使用compass自动合并css雪碧图(css sprite)
		本文转载自: 使用compass自动合并css雪碧图(css sprite) 
随机推荐
- 利用Redis对批量数据实现分布式锁
			需求背景 在开发的收入结转平台界面上有一个归集按钮,可以实现抓取结转表里面的多条数据进行归集操作.为了防止多人多电脑同时操作一条数据,我们自己开发了一个简单的基于Redis实现的分布式锁. 代码实现 ... 
- 仿真pda,部署时出现问题
			为什么部署到基于 Windows Mobile 的 Pocket PC 设备或模拟器会因共享冲突错误而失败 自己遇到了网上找到的解决方案http://hi.baidu.com/yeflower/blo ... 
- Linux源码安装RabbitMQ高可用集群
			1.环境说明 linux版本:CentOS Linux release 7.9.2009 erlang版本:erlang-24.0 rabbitmq版本:rabbitmq_server-3.9.13 ... 
- Oracle :value too large for column "SCHEMA"."TABLE"."COLUMN" (actual: 519, maximum: 500)的解决方案
			原因:我是使用 CREATE TABLE XXX AS subquery 进行创建的数据表,主要是将相关的数据聚合在一起,然后通过导出为SQL脚本文件,进行导入到新库中,导致部分INSERT INTO ... 
- (转)Linux的文件权限与目录配置
			ref:https://www.cnblogs.com/ysocean/p/7712412.html#_label1_0 (转)Linux文件权限和目录配置 1.Linux命令的普遍语法格式 命令格式 ... 
- 说出几点 Java 中使用 Collections 的最佳实践?
			这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ... 
- WebSQL是什么?
			WebSQL是客户浏览器端的结构化的关系数据库.这是浏览器内部的本地RDBMS,你可以在这个本地RDBMS上执行SQL查询. 
- CountDownLatch和CyclicBarrier:如何让多线程步调一致?
			案例:对账系统的业务是这样的,用户通过在线商城下单,会生成电子订单,保存在订单库:之后物流会生成派送单给用户发货,派送单保存在派送单库.为了防止漏派送或者重复派送,对账系统每天还会校验是否存在异常订单 ... 
- 基本类型数组转List
			基本类型数组转List 小数 double[] src = {1.1,2.1,3.1}; List<Double> list = Arrays.stream( src ).boxed(). ... 
- the compatibility problem of ie
			ie8hack ie8下的兼容问题处理:背景透明,css3圆角,css3和jquery支持部分css3选择器(例如:nth-child),支持html5的语义化标签,媒体查询@media等. 在htm ... 
