0

我正在使用nodejsprobot框架开发一个GitHub 应用程序。我可以看到 probot 框架的Application类(https://probot.github.io/api/latest/classes/application.html)包含如下事件:

> 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_requestpull_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.payload.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:开始

忘了提到一个观察,那就是:重新打开拉取请求也会触发issue_comment.created事件。因此,一个操作(单击Create Pull Request)触发了三个事件。

编辑 2:开始

4

1 回答 1

1

如果它的其他特定形式(如pull_request.reopened)没有携带不同的信息(更准确地说,如果它们的上下文不包含不同的信息) ,那么pull_request事件的目的是什么?

这只是 Probot 的一个功能,用于简化处理来自 GitHub 的 webhook 事件。我将尝试解释它为什么有用。

如果您要在没有 Probot 的情况下使用 webhook 事件,则必须解析每个pull_request事件,检查action字段以查找案例,并决定是否处理它。

有几个事件在有效负载中具有顶级action字段,包括:

他们决定简化回调,以便您可以使用特定[event].[action]模式订阅 webhook,而不是让应用程序开发人员自己执行这种解析和检查 JSON,框架会在收到匹配的事件和操作时调用您的回调。

因此,您有两种处理pull_request事件的选择:

  • 如果您不知道需要哪些事件,或者需要动态处理事件,订阅pull_request是您接收所有拉取请求事件的方式
  • 如果您知道应该处理哪些事件,并且可以忽略其余事件,那么订阅显式pull_request.[event]应该可以简化您的应用程序代码

您还可以订阅*,它表示 probot 应用程序接收到的所有事件,而不是明确列出您的应用程序中所有支持的事件。

于 2020-04-11T14:59:41.873 回答