我正在使用nodejs和probot框架开发GitHub应用程序。我可以看到应用程序类(https://probot.github.io/api/latest/classes/application.html)probot框架的包含以下事件:
> event: "pull_request" | "pull_request.assigned" |
> "pull_request.closed" | "pull_request.edited" | "pull_request.labeled"
> | "pull_request.opened" | "pull_request.reopened" |
> "pull_request.review_request_removed" |
> "pull_request.review_requested" | "pull_request.unassigned" |
> "pull_request.unlabeled" | "pull_request.synchronize
我注意到,当点击"创建拉取请求">按钮时,就会触发pull_request以及pull_request.opened事件。
为了理解在单击同一按钮时触发多个看似相似的事件的行为,我尝试重新打开一个关闭的请求,并打印出pull_request事件和pull_request.reopened事件的Context对象。
我对这两个上下文进行了比较,发现两个事件返回的上下文是相同,除了pull_request事件的上下文包含在附加属性下面:
merged: false,
mergeable: null,
rebaseable: null,
mergeable_state: 'unknown',
merged_by: null,
comments: 6,
review_comments: 0,
maintainer_can_modify: false,
commits: 1,
additions: 1,
deletions: 0,
changed_files: 1 },
repository:
{ id: 123456789,
node_id: '',
name: '',
full_name: '',
private: true,
owner: [Object],
html_url: 'some-url-here'
.
.
///////////////////--------many more urls-------//////////////////////
created_at: '2020-04-0',
updated_at: '2020-04-0',
我们知道返回的上下文对象的一般格式如下:
Context {
name: 'pull_request',
id: '187128937812-8219-89891892133-16752-1234576765545',
payload:
{ action: 'reopened',
number: 1,
pull_request:
{ url:
.
.
.and so on.......
上述信息在这两种情况下都存在。我们可以看到,这也告诉了我们所执行的具体操作,这由context.p有效负载.action表示。因此,如果某人的要求是获得pull_request.opened,他/她可以通过使用pull_request事件来完成,如下所示:
app.on('pull_request', async context => {
console.log('---------------------- on pull_request event')
console.log('Context returned :----', context)
})
并且不需要关心其他更具体的事件(此处pull_request.opened(,即除了从上面的代码中实现的内容外,下面的代码不会提供真正的额外帮助:
app.on('pull_request.opened', async context => {
console.log('---------------------- on pull_request.opened')
console.log('Context returned :----', context)
})
因此,以下是困扰我的问题:如果pull_request事件的其他特定形式(如pull_request.reopened(没有携带不同的信息(更准确地说,如果它们的上下文没有包含不同的信息(,那么它的目的是什么?
我确信这背后确实有一些智慧。我在互联网上找不到任何东西,在文档中也找不到可以解释这一点的东西。
请帮助我理解隐藏的智慧。
编辑1:开始
忘了提一个观察结果,那就是:重新打开pull请求也会触发issue_ecomment.created事件。因此,一个操作会触发三个事件(单击创建拉取请求(。
编辑2:开始
pull_request事件的目的是什么,如果它的其他特定形式(如pull_request.reopened(没有携带不同的信息(更准确地说,如果它们的上下文中没有包含不同的信息(?
这只是Probot的一个功能,用于简化处理GitHub中的webhook事件。我会尽力解释为什么它很有用。
如果要在没有Probet的情况下使用webhook事件,则必须解析每个pull_request
事件,检查action
字段中的案例,并决定是否处理它
有几个事件在有效载荷中具有顶级action
字段,包括:
check_run
issue
project
pull_request
- 还有更多的文档
他们没有让应用程序开发人员自己执行JSON的解析和检查,而是决定简化回调,以便您可以使用特定的[event].[action]
模式订阅Webhook,并且框架在接收到匹配的事件和操作时负责调用回调。
因此,您有两个处理pull_request
事件的选项:
- 如果您不知道需要哪些事件,或者需要动态处理事件,那么订阅
pull_request
就是接收所有请求事件的方式 - 如果您知道应该处理哪些事件,并且可以忽略其余事件,那么订阅显式
pull_request.[event]
将简化应用程序代码
您也可以订阅*
,它表示probot应用程序接收的所有事件,而不是显式列出应用程序中所有支持的事件。