GitHub项目的同行审查自动化工具
作为一名程序员,肯定听说过GitHub。作为全球最大的社交编程及代码托管网站,GitHub允许程序员们分享和协作开发开源项目。对于微软的开源软件工程师 Felix Rieseberg 来说,他们的团队有时会在GitHub上,通过撰写研究案例的方式向微软内部和外部的工程师们来介绍他们所做的一些具有技术含量的工作。为了在研究案例发布之后尽量少发现错误,在将案例合并到代码库之前通过一些同行评审(peer review,PR)是必要的过程。假如用户的博客是一个GitHub的页面,意味着每一个后面增加到网站的post都是以pull request的形式。然而检查和跟踪GitHub上同行评审的pull request是相当繁琐的工作,因此Felix Rieseberg编写了一个 基于Node.js的机器人 来自动化整个流程。
管理工作流程很困难
管理同行评审工作的流程并不是一件有趣的事情。根据团队的规模,可能同时有一大堆的pull request,如果再加上团队的工程文化比较好,会经常提前收集一些反馈信息,这就意味着pull request列表中会有各种不同阶段的pull request,导致同行评审工作的流程变得困难。
有人会认为自我管理是一个很好的解决方案,的确现实中往往也是这样的。很多团队对一些未完成的pull request仅仅是在标题中加上一个“WIP”或“wip”的标签,任何人打开这个pull request,它都会被更新。对一个极具创意和非常有成效的团队来说,如果是通过手动的方式检查和跟踪研究案例的状态,比如它们在哪里评审,以及它们是否已经准备好发布等,这往往是说不过去的。
自动化却很容易
代替雇人去不断检查所有pull request,Rieseberg决定自己开发一个自动化工具,通过注册了一个小的Node.js机器人,可以对以下事件作出响应:
- 检查是否有新的pull request被打开或对已有的pull request有新的评论。
- 如果有,机器人从GitHub上收集关于pull request的最新信息。
- 一旦得到信息,检查pull request是否已被标记。如果它被标记为“no-review”或“peer-reviewed”,停止一切动作。
- 如果还没有这样做,发表评论来对过程进行解释。
- 如果其他人已经评论过,检查是否收到了足够的'LGTM'或' Looks good to me! “评论。如果收到,更新标签。
- 如果机器人被配置为允许自动合并pull request,让GitHub合并它。如果pull request是不可以合并的,GitHub会自动拒绝。
在这种情况下,这个机器人还只是单一接口的小规模应用程序:
http://botaddress.com/pullrequests
一个GET HTTP请求为打开的pull request检查配置,而POST HTTP request需要一个GitHub风格JSON有效载荷,并且仅仅处理提到的pull request。
自行构建机器人
除了简要介绍他们的自动化机器人,Felix还为读者提供了如何自行构建机器人的方法。如果想查看代码库中pull request的同行评审,在开始之前,需要做一些必要的准备工作:
为机器人创建一个GitHub用户
机器人需要一个GitHub用户来与GitHub交互。在GitHub网页上,可以使用已有的用户,或者从众多的机器人( Terminator,Tinman,Bender )中选择一个,创建一个新用户。虽然机器人使用用户名/密码组合就可以正常工作,但我们还是建议建立一个OAuth2令牌。 GitHub上有API速率限制, OAuth认证的机器人可以获得更高一些的速率。
部署机器人
如果是使用Azure,建立一个机器人大约只需要一分钟。只需导航到同行评审机器人的代码库,并点击“Deploy to Azure '按钮。 Azure的部署向导会自动为用户创建一个网站,而且还会为配置机器人设置环境变量。
如果是使用其他平台,确保是在运行的节点(至少在0.10.x)上。然后,通过直接编辑config.js或通过设置环境变量来设置配置。选项如下:
- User 拥有代码库的用户/组织
- repo 代码库(研究案例)
- botUser 机器人的GitHub用户名
- botPassword 机器人的Github密码
- labelReviewed 表示获得足够的同行评审的标签名
- labelNeedsreview 表示没有同行评审的标签名
- reviewsNeeded 需要的评审数量
- instructionsComment当一个新PR打开,机器人发布的评论,如果在评论中使用reviewsNeeded,它会自动替换为需要的评审数量
- mergeOnReview(默认值:false) 如果设置为true,机器人会自动合并PR,并迅速将其当做评审过的PR
- pullRequestsStatus(默认:open)pull request状态。选项包括:all|open|closed
- oauth2token 如果设置,将使用OAuth令牌代替用户名/密码组合对机器人验证。
- excludeLabels 如果设置,机器人会自动忽略带有“no-review”、“ i-hate-reviews”标签的PR。
配置完成后,使用npm start或node ./bin/www启动机器人。这样,一个机器人就可以帮助管理同行评审工作流了,而程序员则可以将精力放在更需要他们的地方。