共计 2490 个字符,预计需要花费 7 分钟才能阅读完成。
本文首发于 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 小助手会拉你进群~~