本文最后更新于:2024年4月18日 晚上
起因
这个博客是同时部署在github page 和 我自己的服务器上,通常在更新博客内容时,会产生数据同步问题。即使用hexo d
指令后,上传到 Github page 仓库,不同时更新自己服务器上的内容。在更新完成仓库后,需要手动登录服务器进行拉取仓库。
解决方法
首先,在上传到github仓库时,所产生的网页文件已经是被打包好的了,因此在部署到服务器只需要拉取仓库。因此,可以使用github中Webhooks功能来拉取更新时候的代码。
Webhooks是什么
Webhook 允许在某些事件发生时通知外部服务。当指定的事件发生时,我们将向您提供的每个 URL 发送一个 POST 请求。
启动github webhook
在github的设置页设置webhook参数
编写sh脚本处理post请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #!/bin/bash
nc -l 7000 | while read line do if [[ "$line" == "POST"* ]] then echo "HTTP/1.1 200 OK" echo "Content-Length: 2" echo "" echo "ok" cd /www/hexo/1328411791.GitHub.io/ git pull origin
fi done
|
这段代码这有基础的功能,没有对请求进行验证,同时也没有http返回状态和参数(shell不如py)
shell真不如py写脚本,下面是python的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import git from flask import Flask, request
app = Flask(__name__)
@app.route('/update', methods=['GET']) def update(): if(request.headers.get('X-GitHub-Hook-ID') != "11"): return json.dumps({'msg': 'Not a valid github hook'}) repo = git.Repo('/path/to/repo') origin = repo.remotes.origin repo.git.reset('--hard') origin.pull("master") print("Updated PythonAnywhere source to commit {}".format(str(repo.head.commit))) ret = {'msg': 'Updated PythonAnywhere source to commit {}'.format(str(repo.head.commit))} return ret
if __name__ == '__main__': app.run(host= '0.0.0.0',port= 4000, debug=True)
|
安装对应的依赖,代码仅供参考
写完后,发送测试请求,发现成功被接收
下面将脚本进行后台运行即可
nohup 命令可以用来处理脚本后台运行,将输出重定向到log文件
1
| nohup ./update.sh > ./log 2>&1 &
|
查看log 发现代码被正确拉取
用websocket不如用ssh稳定