为了账号安全,请及时绑定邮箱和手机立即绑定

GitHub 自动合并 pr 的机器人——auto-merge-bot

GitHub 自动合并 pr 的机器人——auto-merge-bot

背景

作为一款开源的分布式图数据库产品,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 提上来,它的一生需要经历:

  1. pull request 被 reviewers approve
  2. Repository maintainer 评论/merge,表明同意 merge
  3. 完成 1,2 后, pull request 就会被 bot 识别为可 merge 的 pull request
  4. bot 将所有标为可 merge 的 pull request 预加载到 runner 的本地基于 master 的分支中进行 ci 测试
  5. 测试通过,pull request 被 merge 到主分支;测试失败,bot 会随机剔除现有包含的 pull request,再进行测试,直到测试通过或者没有可用的分支为止。
  6. (可选)bot 将本次 merge 的结果发送到钉钉群中

需要注意:

  • 使用 auto-merge-bot 时,repository 需要在 GitHub orgnization 中配置一个 team,这个 team 里的部分 member 的 role 需被标识为 maintainer,对应上述步骤2。

测试用例

 ...

 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

以上。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消