如何调试 PyGitHub 没有响应?

问题描述

我正在使用 PyGitHub 从使用 Python 脚本的 Ubuntu 服务器内部更新我的 GitHub.com 存储库。

我注意到有时我的脚本只是挂在那里,而没有错误消息表明出了什么问题。

这是我的剧本

from pathlib import Path
from typing import Optional

import typer
from github import Github,GithubException

app = typer.Typer()


@app.command()
def add_deploy_key(
    token: Optional[str] = None,user_repo: Optional[str] = None,repo_name: Optional[str] = None
):
    typer.echo("Starting to access GitHub.com... ")
    try:
        # using an access token
        g = Github(token)

        # I skipped a bunch of code to save space
        
        for key in repo.get_keys():
            if str(key.key) == str(pure_public_key):
                typer.echo(
                    "We found an existing public key in " + user_repo + ",so we're NOT adding it"
                )
                return
        rep_key = repo.create_key(
            "DigitalOcean for " + repo_name,current_public_key,read_only=True
        )
        if rep_key:
            typer.echo("Success with adding public key to repo in GitHub.com!")
            typer.echo("")
            typer.echo("The url to the deposited key is: " + rep_key.url)
        else:
            typer.echo("There's some issue when adding public key to repo in GitHub.com")
    except GithubException as e:
        typer.echo("There's some issue")
        typer.echo(str(e))
        return


if __name__ == "__main__":
    app()

我触发的方式是在 bash 脚本中

output=$(python /opt/github-add-deploy-keys.py --token="$token" --user-repo="$user_repo" --repo-name="$repo_name")

它有效。但有时它只是挂在那里没有任何输出。而且由于它是间歇性的,而且不是始终如一地发生,因此很难调试。

我不确定这是打字机问题、网络问题还是 GitHub.com 问题。什么都没有。

我希望它快速且频繁地失败。我知道 GitHub 对象存在超时和重试。

https://pygithub.readthedocs.io/en/latest/github.html?highlight=retry#github.MainClass.Github

我想知道我是否可以用这两个参数做任何事情,所以至少我可以看到正在做的事情。我可以添加很多 typer.echo 语句,但这会非常冗长。

我也不熟悉重试对象。我希望即使进行了重试,也会有一些 echo 语句告诉我正在尝试重试。

我可以尝试什么?

解决方法

超时应阻止 github 请求挂起,重试应使其工作,但根据文档,已经有一个默认超时。由于此问题用于调试,因此我建议将日志记录 python 库用于您的脚本在文件中运行的步骤。您可以找到一个很好的日志教程 Default logged in user to SQL Server column

至于日志记录样式,由于您的案例有很多未知数,我会在脚本启动时、“创建密钥”步骤之前和“创建密钥”步骤之后进行记录,以防万一。您可以在脚本挂起时查看日志文件。

您可以创建一个 bash 脚本以在超时时运行您的脚本,并在程序以非零退出代码退出并让它运行过夜时收到通知:

timeout 5 python <yourscript>.py