通用pull_request事件以及其他更具体的pull_request事件(如pull_request.opened)的意义

时间:2020-04-10 10:26:11

标签: github github-api probot github-app

我正在使用 nodejs probot 框架开发 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_request 以及 pull_request.opened 事件被解雇。

为了理解单击同一按钮会触发多个看似相似的事件的行为,我尝试重新打开已关闭的请求并为两个 pull_request < / strong>事件以及 pull_request.reopened 事件。

我对这两个上下文进行了比较比较,发现两个事件返回的上下文都是 相同,除了 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 ),即,除了上面的代码所实现的功能之外,下面的代码不会提供任何实际的额外帮助:< / p>

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 事件。因此,一个动作(单击创建请求请求)会触发三个事件。

编辑2:开始

1 个答案:

答案 0 :(得分:1)

pull_request 事件的目的是什么,如果其其他特定形式(例如 pull_request.reopened )没有不同的信息(更确切地说,如果其上下文不包含任何信息)不同的信息)?

这只是Probot的一项功能,用于简化从GitHub处理webhook事件的过程。我将尝试解释为什么有帮助。

如果要在没有Probot的情况下使用webhook事件,则必须解析每个pull_request事件,检查action字段是否有问题,然后决定是否处理该事件。

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

他们不是让应用程序开发人员自己执行JSON的解析和检查,而是决定简化回调,以便您可以使用特定的[event].[action]模式订阅webhooks,并且框架负责在以下情况下调用您的回调:匹配到事件和动作。

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

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

您还可以订阅*,它代表了probot应用接收的所有事件,而不是在应用中明确列出所有受支持的事件。