背景

在使用 Github 进行公司源代码管理开发时,我认为创建拉取请求和请求审查的常见流程。

但,当您度过周末或在您通常不使用的存储库中提交 PR 时
经常发生我不小心忘记查看它而无人看管的情况。

每次都需要和他们交流,说:“请给我一个评价!”
老实说,我认为这是在浪费交流。
Graffity 创建了一个机器人,通知每个存储库等待审核的 PR,并在 Slack 上运行它。

它是如何工作的↓
Github上のアクティブなPullRequestがあるときにSlackに通知するBotを作った

每天早上都这样(由于工作从 11:00 开始,所以 11:00 是早上。) 告诉您每个存储库中的活动 PR 数量。

如果你全部合并或者只草稿PR,你会被这样夸。

Github上のアクティブなPullRequestがあるときにSlackに通知するBotを作った

这次,我将介绍这个机器人的实现。

技术选择

语言:Python3(我之所以使用Python,是因为它在公司作为通用语言使用)
库:PyGithub 1.55(实施时)https://github.com/PyGithub/PyGithub
每个人都喜欢使用 IncomingWebHook 发布到 Slack

提前准备

首先,您需要获取 Github 的 PersonalAccessToken 才能使用 PyGithub。
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

如果你在公司中使用,最好创建一个像公司的 Github 帐户一样的帐户。
设置一个易于管理的名称和截止日期。
以防万一,我认为最好无限期地停止。
Github上のアクティブなPullRequestがあるときにSlackに通知するBotを作った

至于权限,这次我们只想知道活跃PR的数量,所以我们检查一下repo。
Github上のアクティブなPullRequestがあるときにSlackに通知するBotを作った

按下生成按钮,将显示令牌。
记下这一点,因为一旦离开页面,您将永远无法再次看到它(1 损失
Github上のアクティブなPullRequestがあるときにSlackに通知するBotを作った

接下来,发出 IncomingWebhook URL 以在 Slack 上发布。
让我们按照手动过程创建它并设置您要通知的 Slack 频道。
创建 URL 后,也要记下它
https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8

最后,让我们安装python使用的库

pip install PyGithub

执行

这是现在的完整代码

矿。 py
import sys
from github import Github
import requests, json

WEB_HOOK_URL = "取得したWebhookURL"

# 監視対象リポジトリ
# ここに追加してね
TargetRepositories = ["https://github.com/HOGEHOGE/FUGAFUGA",
                      "https://github.com/HOGEHOGE/PIYOPIYO"]


def main():
    args = sys.argv
    if len(args) != 2:
        print("引数がおかしいよ: github トークン入れてる?")
        return -1
    try:
        github_instance = Github(args[1])
        result_text = ["プルリクレビューの時間だよ!"]
        for repo in github_instance.get_user().get_repos():
            if repo.html_url in TargetRepositories:
                active_pull_requests = [pr for pr in repo.get_pulls() if not pr.draft]
                if len(active_pull_requests) > 0:
                    result_text.append(repo.html_url + " にアクティブなPRが" + str(len(active_pull_requests)) + "個あり:masu:")

        output = "
".join(result_text)

        send_text = ''
        if len(result_text) >= 2:
            send_text = output
        else:
            send_text = "PR全部レビューしてるわ。偉い"

        requests.post(WEB_HOOK_URL, data=json.dumps({
            'text': send_text
        }))
    except Exception as e:
        print("Error" + e)
        return 1

    return 0

statuscode = main()
sys.exit(statuscode)

使用时是这样的

python main.py Githubのアクセストークン

每个地方的说明

首先,我们有 WebHook URL 和要监控的存储库列表。
目前,代码编写得很扎实。 (因为要监控的仓库数量只有在启动新项目时才会增加)

WEB_HOOK_URL = "取得したWebhookURL"

# 監視対象リポジトリ
# ここに追加してね
TargetRepositories = ["https://github.com/HOGEHOGE/FUGAFUGA",
                      "https://github.com/HOGEHOGE/PIYOPIYO"]

但是,由于我不想管理 Github 的访问令牌(没错),我试图将其作为参数接收。

args = sys.argv
    if len(args) != 2:
        print("引数がおかしいよ: github トークン入れてる?")
        return -1

初始化 PyGithub。
将访问令牌作为参数传递

github_instance = Github(args[1])

这是这段时间最激动人心的部分。我会一步一步解释

矿。 py
for repo in github_instance.get_user().get_repos():
            if repo.html_url in TargetRepositories:
                active_pull_requests = [pr for pr in repo.get_pulls() if not pr.draft]
                if len(active_pull_requests) > 0:
                    result_text.append(repo.html_url + " にアクティブなPRが" + str(len(active_pull_requests)) + "個あり:masu:")

首先,使用 github_intance.get_user() 获取您自己的信息。
从那里,您可以通过执行 get_repos 获得“您可以看到的存储库列表”(这里,“我自己”是发布访问令牌的用户)
通过 for 转动它,您可以检查您可以看到的所有存储库

矿。 py
for repo in github_instance.get_user().get_repos():

由于 repo 中有 html_url,只有匹配上面提到的 TargetRepositories 才会继续处理

矿。 py
if repo.html_url in TargetRepositories:

PullRequest 信息可以通过 get_pulls 获取。
从其中提取不是草稿的内容。如果有 1 个或多个,则将文本添加到列表中作为通知目标

矿。 py
active_pull_requests = [pr for pr in repo.get_pulls() if not pr.draft]
    if len(active_pull_requests) > 0:
        result_text.append(repo.html_url + " にアクティブなPRが" + str(len(active_pull_requests)) + "個あり:masu:")

最后通过数组的长度检查是否有PR,如果没有,把文字给点赞,Post到WebhookURL完成

矿。 py
output = "
".join(result_text)

send_text = ''
if len(result_text) >= 2:
    send_text = output
else:
    send_text = "PR全部レビューしてるわ。偉い"

requests.post(WEB_HOOK_URL, data=json.dumps({'text': send_text}))

尝试操作

实现本身是一个不到一个小时的机器人,但它非常方便。
这很舒服,因为您不会错过任何评论,并且您不必像“请给我评论!”那样相互交流。

Graffity 每个工作日早上都会在构建机器的 cron 上运行这个 python 代码。
早上看review bot的帖子,从那里复习,也是一种套路,感觉很赞。

有兴趣的可以考虑介绍一下~


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308630661.html

相关文章:

  • 2021-07-10
  • 2022-12-23
  • 2021-06-27
  • 2022-12-23
  • 2021-05-08
  • 2021-09-28
  • 2021-10-11
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-07
  • 2021-06-17
  • 2021-12-14
  • 2021-05-25
相关资源
相似解决方案