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)
随机推荐
- CVE-2017-12635(Couchdb垂直权限绕过漏洞)
简介 Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapRedu ...
- xss平台搭建
1. xss平台搭建 l 将xss平台源码放置在网站目录下 l 进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库 l 修改XSS源码文件目录下的config.php中的数 ...
- 记-Golang获取本机IP及快速搭建局域FTP
1 package main 2 3 import ( 4 "fmt" 5 "net" 6 "net/http" 7 "strin ...
- java字节流和字符流,以及java文件操作
A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...
- Dubbo 如何优雅停机?
Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才 会执行.
- keybd_event 在F按键系列不起作用的解决办法
最近给公司做自动化测试工具,主要用到的功能是模拟鼠标键盘录制回放.一切都很完美了,但在客户大机系统上使用的时候,发现F1-F24系列按键无法正确使用,查了很多资料,主要有2个方面的原因: 1.一些游戏 ...
- spring-boot-learning-Web开发知识
1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自己编写业务代码: 文件名的功能 x ...
- screen--后台不挂断运行
方法一:1.进入项目目录下,运行下面程序:nohup python manage.py runserver 0.0.0.0:5008 &nohup(no hang up)用途:不挂断的运行命令 ...
- Netty学习摘记 —— Netty客户端 / 服务端概览
本文参考 本篇文章是对<Netty In Action>一书第二章"你的第一款 Netty 应用程序"的学习摘记,主要内容为编写 Echo 服务器和客户端 第一款应用程 ...
- 时间工具类之“ JDK1.8中 LocalDate、LocalTime、LocalDateTime、LocalDateTimeUtil四个时间工具类”
一.使用的原因 在JDK8发布的时候,推出了LocalDate.LocalTime.LocalDateTime这个三个时间处理类,以此来弥补之前的日期时间类的不足,简化日期时间的操作. 在Java8之 ...