本文首发于 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-accesshttps://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的更多相关文章

  1. 如何参与开源项目 - 细说 GitHub 上的 PR 全过程

    目录 一.概述 二.为什么要参与开源项目 三.为什么我想介绍如何 PR 四.我想参与开源项目,怎么开始? 4.1.寻找一个合适的开源项目 4.2.寻找贡献点 五.我要提交 PR,怎么上手? 5.1.第 ...

  2. 2019-8-30-Jenkins-配置自动合并-release-分支到-master-分支

    title author date CreateTime categories Jenkins 配置自动合并 release 分支到 master 分支 lindexi 2019-08-30 08:5 ...

  3. Jenkins 配置自动合并 release 分支到 master 分支

    本文告诉大家如何在 Jenkins 配置合并到 release 的内容自动合并到 gitlab 的 master 分支 首先需要两个仓库,一个是 gitlab 的仓库,另一个是 Jenkins 的仓库 ...

  4. Jenkins 配合 GitLab 实现分支的自动合并、自动创建 Tag

    Jenkins 配合 GitLab 实现分支的自动合并.自动创建 Tag 背景 GitFlow工作流简介 Gitflow工作流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提供了用于一个健 ...

  5. julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域

    编程界的新宠 Julia 发布 1.0 正式版本,多种优势集于一身2018-08-14 14:14 公司Julia 的累积下载次数超过 200 万,已被应用于自动驾驶汽车.机器人.3D 打印.精准医疗 ...

  6. git报错:Auto Merge Failed; Fix Conflicts and Then Commit

    本文来源:http://blog.csdn.net/trochiluses/article/details/101007191.出错场景: 协同开发时,我们从远程服务器上pull下代码的时候,出现以下 ...

  7. 分支合并git checkout adview git merge adview3

    分支合并 git checkout adview git merge adview3

  8. 手写代码自动实现自动布局,即Auto Layout的使用

    手写代码自动实现自动布局,即Auto Layout的使用,有需要的朋友可以参考下. 这里要注意几点: 对子视图的约束,若是基于父视图,要通过父视图去添加约束. 对子视图进行自动布局调整,首先对UIVi ...

  9. 使用compass自动合并css雪碧图(css sprite)

    本文转载自: 使用compass自动合并css雪碧图(css sprite)

随机推荐

  1. Redis快速入门:初识Redis

    [IT168 专稿]在之前的文章中介绍了<Redis快速入门:选择Key-Value Store>,今天给大家介绍Redis的入门知识.Redis是一个开源的使用ANSI C语言编写.支持 ...

  2. CF487E Tourists(圆方树+树链剖分+multiset/可删堆)

    CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解 ...

  3. mysql索引失效原理(联合索引失效问题)

    单值索引B+树图单值索引在B+树的结构里,一个节点只存一个键值对 联合索引开局一张图,由数据库的a字段和b字段组成一个联合索引. 从本质上来说,联合索引也是一个B+树,和单值索引不同的是,联合索引的键 ...

  4. mybatis 自定义插件的使用

    今天看了别人的mybatis的教学视频,自己手写了一个简单的自定义的插件,有些细节记录一下. 先看下mybatis的插件的一些说明: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用. ...

  5. Spring Bean生命周期回调

    参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory ...

  6. 数据分析之Pandas操作

    Pandas pandas需要导入 import pandas as pd from pandas import Series,DataFrame import numpy as np 1 Serie ...

  7. django基础环境配置

    Django环境搭建 1.下载安装 命令行 pip install django==1.11.21 pip install django==1.11.21 -i 源 pycharm setting - ...

  8. DSP选型

    DSP芯片也称数字信号处理器,是一种特别适合于进行数字信号处理运算的微处理器具,其主机应用是实时快速地实现各种数字信号处理算法.根据数字信号处理的要求,DSP芯片一般具有如下主要特点: (1)在一个指 ...

  9. Altium Designer 设置多层方法及各层介绍

    因为PCB板子的层分类有很多,所以通过帮助大家能更好地理解PCB的结构,所以把我所知道的跟大家分享一下 1.PCB各层简介 1. Top Layer顶层布线层(顶层的走线) 2. Bottom Lay ...

  10. 记一些css 3效果

    半透明边框 background-clip: 规定背景的绘制区域 .div { width: 200px; height: 200px; background: blue; border: 10px ...