使用python实现一个可自动部署hexo博客的gitee webhook

文章首发在我的博客:https://blog.liuzijian.com/post/af1f30e3-c846-650e-9a3f-34e326bf950d.html

hexo博客想在提交后自动部署,使用持续集成工具比较繁琐也消耗资源,于是用python脚本加gitee webhook实现自动化拉取打包部署。

1. 安装 pipPython

首先,确保你已经安装了 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

设置好签名(密码),设置回调地址,勾选两项

使用python实现一个可自动部署hexo博客的gitee webhook

发表评论

评论已关闭。

相关文章