Github应用程序(或Github机器人)是Github上的一流演员,用于从存储库维护人员的手中卸下多余的工作。 Github上的一流演员表示,它具有执行维护者想要的功能的能力,并且可以在事先获得适当权限的情况下对机器人进行编程。该机器人通过接收在Github上触发的事件的webhooks(评论,要求该机器人删除受让人,添加标签,将该问题移至另一个回购),然后触发适当的代码(该代码是事件样式的,稍后会变得明显)来工作。在文章中)对此做出回应。触发的代码使机器人执行操作。可以外包给机器人的一项工作是管理问题的标签。在本文中,我们将使用Probot来构建Github应用,以添加或删除问题标签。
使用的框架:Probot
我们还将使用probot-commands npm模块输入命令。
GitHub App的初始设置
要设置github应用,可以查看probot的文档。由于设置不是本文的重点,因此我们将在Glitch上重新混合Probot应用程序。可以在此处找到此设置的链接。
小故障混音中的README.md对于设置应用程序提供了出色的指南。
要检查正确的应用程序设置,请通过在存储库中发出一个问题(假定应用程序已安装在存储库中)来运行应用程序安装随附的默认代码。
输出:机器人(GitHub应用程序)应写如下注释。
如果这不是输出,则表示该应用未正确安装,应在此处查阅文档。
在完成应用程序设置并完成初始测试(以确保正确配置应用程序并正常工作)之后,就可以安装我们需要的npm模块了。
安装依赖项/模块
我们需要一个probot-commands npm模块才能使该应用程序正常工作。要安装它们,请从左侧导航窗格中转到“ package.json”文件。在编辑器的左上角,找到一个标记为“ Add Package
”的按钮。使用此按钮,将’ probot-commands
‘添加到应用程序。
添加这两个模块后,转到“ index.js
”文件(使用左侧的导航窗格)并添加
const commands = require("probot-commands");
在index.js文件的顶部,如下所示:
在这一点上,我们应该去开发为问题添加或删除标签的核心逻辑。
index.js代码在这里。
代码(来自项目的index.js文件) :
在这里,我们将使用probot-commands模块从问题注释中识别命令。有关命令模块如何工作的更多详细信息,请参见其GitHub存储库。简短介绍一下,“斜杠命令”的结构如下:
/keywordToIdentifyCommand arg1 arg2 arg3
//In our app, we'll use the following command structure
/lm [add/remove], label1, label2, label3
解释:
Logic:
- Listen to the event: a new comment on the issue is created
- If the content of the comment contains a ‘slash command’ starting with /lm, execute the following code.
- Split the commands on the ‘, ‘ and assign to a new var(labelvals, here). For example, if the slash command is ‘lm add, bug, easy’, we’ll get an array [‘add’, ‘bug’, ‘easy’]
- Slice the array obtained to get the values of labels in an array ‘labels’, for example, [‘bug’, ‘easy’]
- Check for the ‘add’ or ‘remove’ argument. If ‘add’, then do x, else if ‘remove’, then do y.
- If ‘add’, supply the entire array to method ‘addLabels’. Else if ‘remove’, iteratively pass ‘labels’ elements to the method ‘removeLabel’.
Note: In the remove section, as no method exists to bulk remove the list of labels, we iteratively remove the labels one at a time. - If neither ‘add’ nor ‘remove’ is supplied, create a comment to let people know of an unsuccessful attempt.
最后的工作是这样的:
提示:让任何人(就用户权限级别而言)执行此类命令是不明智的。因此,将代码块封装在“ if”检查中以检查权限级别是一个好主意。
if ((context.payload.issue.author_association === "OWNER") ||
(context.payload.issue.author_association === "COLLABORATOR"))
{
// commands... code block here
}