使用python实现一个可自动部署hexo博客的gitee webhook
文章首发在我的博客:https://blog.liuzijian.com/post/af1f30e3-c846-650e-9a3f-34e326bf950d.html
hexo博客想在提交后自动部署,使用持续集成工具比较繁琐也消耗资源,于是用python脚本加gitee webhook实现自动化拉取打包部署。
1. 安装 pip
和 Python
#
首先,确保你已经安装了 Python。如果没有安装,可以使用以下命令来安装 Python 和 pip
:
1.1 检查 Python 版本#
python3 --version
如果你已经安装了 Python 3.x 版本,可以跳过安装 Python 的步骤。否则,继续安装:
1.2 安装 Python 3#
sudo yum install python3 -y # 适用于 CentOS 或其他 RHEL 系统
1.3 安装 pip
#
安装 pip
的方法:
sudo yum install python3-pip -y # CentOS/RHEL 系统
安装完成后,确认 pip
是否已经成功安装:
pip3 --version
2. 使用 pip
安装依赖#
一旦 pip
安装好,你可以使用以下命令来安装需要的库:
pip3 install flask gitpython
之后你就可以运行之前的 Python Webhook 脚本了。
3.编写脚本#
vim webhook.py
import os
import subprocess
from flask import Flask, request, jsonify
import git
app = Flask(__name__)
# 配置你的本地仓库路径和构建命令
REPO_PATH = "/path/to/your/hexo/blog"
PUBLIC_PATH = os.path.join(REPO_PATH, 'public')
# 拉取代码的函数
def pull_code():
try:
repo = git.Repo(REPO_PATH)
origin = repo.remotes.origin
origin.pull()
return True
except Exception as e:
print(f"Failed to pull code: {e}")
return False
# 构建 Hexo 站点的函数
def build_hexo():
try:
# 执行 Hexo 命令
subprocess.run(["npm", "run", "build"], cwd=REPO_PATH, check=True)
return True
except subprocess.CalledProcessError as e:
print(f"Failed to build Hexo: {e}")
return False
@app.route("/webhook", methods=["POST"])
def webhook():
# 验证请求是否来自 Gitee
if request.headers.get("X-Gitee-Token") != "": #这里改成你设置的密码
return jsonify({"message": "Unauthorized"}), 401
# 获取事件类型,确保是 push 事件
event = request.headers.get("X-Gitee-Event")
if event != "Push Hook":
return jsonify({"message": "Not a push event"}), 400
# 拉取代码并构建
if pull_code() and build_hexo():
return jsonify({"message": "Hexo build success"}), 200
else:
return jsonify({"message": "Failed to pull or build"}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
代码优化,加入线程控制,防止webhook链接被并发调用后,两个hook任务线程同时执行出现安全问题。
import os
import subprocess
from flask import Flask, request, jsonify
import git
import threading
app = Flask(__name__)
# 配置你的本地仓库路径和构建命令
REPO_PATH = "/blog"
PUBLIC_PATH = os.path.join(REPO_PATH, 'public')
lock = threading.Lock()
is_building = False # 标志位,用于指示是否有任务正在进行
# 拉取代码的函数
def pull_code():
try:
repo = git.Repo(REPO_PATH)
origin = repo.remotes.origin
origin.pull()
return True
except Exception as e:
print(f"Failed to pull code: {e}")
return False
# 构建 Hexo 站点的函数
def build_hexo():
try:
# 执行 Hexo 的清理和生成命令
subprocess.run(["npm", "run", "build"], cwd=REPO_PATH, check=True)
#subprocess.run(["hexo", "generate"], cwd=REPO_PATH, check=True)
return True
except subprocess.CalledProcessError as e:
print(f"Failed to build Hexo: {e}")
return False
@app.route("/webhook", methods=["POST"])
def webhook():
global is_building
# 验证请求是否来自 Gitee
if request.headers.get("X-Gitee-Token") != "":
return jsonify({"message": "Unauthorized"}), 401
# 获取事件类型,确保是 push 事件
event = request.headers.get("X-Gitee-Event")
if event != "Push Hook":
return jsonify({"message": "Not a push event"}), 400
if is_building:
return jsonify({"message": "Build in progress, try again later"}), 429
with lock:
is_building = True # 设置标志位为 True,表示任务开始
try:
# 拉取代码并构建
if pull_code() and build_hexo():
return jsonify({"message": "Hexo build success"}), 200
else:
return jsonify({"message": "Failed to pull or build"}), 500
finally:
is_building = False # 重置标志位,表示任务结束
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
4.执行脚本#
nohup python3 webhook.py &
5.配置hook到gitee#
设置好签名(密码),设置回调地址,勾选两项
作者:changelzj
出处:https://www.cnblogs.com/changelzj/p/18707982
版权:本作品采用「署名-非商业性使用-禁止演绎 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)