0

我目前正在从头开始开发音乐流媒体服务。我正在做后端和前端。在此开发阶段,我有一台用于测试的服务器。它有一个 Go 服务器应用程序和一个 GitHub 存储库的克隆,我将 Vue.js 代码推送到前端。

部署过程很简单。一旦我将更改推送到主分支,我就会ssh进入服务器,cd进入 Vue.js 项目文件夹git pullnpm run build然后瞧!由于这是一个如此简单且可预测的任务,我想使用 GitHub 的 webhook 和 Python 的 Flask 框架来自动化它。所以我写了这个(它有点工作):

# this snippet only shows the important bits

def onpush(event: str, info: Dict):
    subprocess.run(SCRIPT, stdout=LOG_FILE)

@app.route('/github', methods=['POST'])
def github() -> str:
    if request.headers['Content-Type'] != 'application/json':
        return '415 - unsupported media type'

    event: str = request.headers['X-GitHub-Event']
    info: Dict = request.json
    onpush(event, info) # takes too long! client times out since ...
    return '200 - OK'   # this return value is used as the response ...
                        # which means it's not sent until `onpush` is done

但是,该onpush函数git pull在其subprocess.run调用中运行(从 GitHub 服务器获取数据需要时间),并且没有一个是并发的。因此,使用路由的return '200 - OK'值作为服务器的响应(如果我没记错的话,这就是 Flask 所做的)会导致以下事实:

  1. GitHub webhook 客户端超时并将有效负载显示为未交付(即使在服务器端一切正常 - 只是客户端无法等待足够长的时间来获得他们期望的响应)。
  2. 我不能先响应然后再调用onpush,因为响应 = 从函数返回

Webhook 调用超时

所以我几乎在寻找一种方法来让这个东西足够快地响应,这样 GitHub 就不会超时,同时仍然能够git pull. 这可能可以通过一些并发或线程来解决,但我真的不知道如何。

4

0 回答 0