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

王海鱼  金牌会员 | 2025-2-12 11:57:49 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

文章首发在我的博客:https://blog.liuzijian.com/post/af1f30e3-c846-650e-9a3f-34e326bf950d.html
hexo博客想在提交后自动部署,使用连续集成工具比较繁琐也消耗资源,于是用python脚本加gitee webhook实现自动化拉取打包部署。
1. 安装 pip 和 Python

首先,确保你已经安装了 Python。如果没有安装,可以使用以下命令来安装 Python 和 pip:
1.1 检查 Python 版本
  1. python3 --version
复制代码
如果你已经安装了 Python 3.x 版本,可以跳过安装 Python 的步骤。否则,继续安装:
1.2 安装 Python 3
  1. sudo yum install python3 -y  # 适用于 CentOS 或其他 RHEL 系统
复制代码
1.3 安装 pip

安装 pip 的方法:
  1. sudo yum install python3-pip -y  # CentOS/RHEL 系统
复制代码
安装完成后,确认 pip 是否已经成功安装:
  1. pip3 --version
复制代码
2. 使用 pip 安装依赖

一旦 pip 安装好,你可以使用以下命令来安装需要的库:
  1. pip3 install flask gitpython
复制代码
之后你就可以运行之前的 Python Webhook 脚本了。
3.编写脚本
  1. vim webhook.py
复制代码
  1. import os
  2. import subprocess
  3. from flask import Flask, request, jsonify
  4. import git
  5. app = Flask(__name__)
  6. # 配置你的本地仓库路径和构建命令
  7. REPO_PATH = "/path/to/your/hexo/blog"
  8. PUBLIC_PATH = os.path.join(REPO_PATH, 'public')
  9. # 拉取代码的函数
  10. def pull_code():
  11.     try:
  12.         repo = git.Repo(REPO_PATH)
  13.         origin = repo.remotes.origin
  14.         origin.pull()
  15.         return True
  16.     except Exception as e:
  17.         print(f"Failed to pull code: {e}")
  18.         return False
  19. # 构建 Hexo 站点的函数
  20. def build_hexo():
  21.     try:
  22.         # 执行 Hexo 命令
  23.         subprocess.run(["npm", "run", "build"], cwd=REPO_PATH, check=True)
  24.         
  25.         return True
  26.     except subprocess.CalledProcessError as e:
  27.         print(f"Failed to build Hexo: {e}")
  28.         return False
  29. @app.route("/webhook", methods=["POST"])
  30. def webhook():
  31.     # 验证请求是否来自 Gitee
  32.     if request.headers.get("X-Gitee-Token") != "": #这里改成你设置的密码
  33.         return jsonify({"message": "Unauthorized"}), 401
  34.     # 获取事件类型,确保是 push 事件
  35.     event = request.headers.get("X-Gitee-Event")
  36.     if event != "Push Hook":
  37.         return jsonify({"message": "Not a push event"}), 400
  38.     # 拉取代码并构建
  39.     if pull_code() and build_hexo():
  40.         return jsonify({"message": "Hexo build success"}), 200
  41.     else:
  42.         return jsonify({"message": "Failed to pull or build"}), 500
  43. if __name__ == "__main__":
  44.     app.run(host="0.0.0.0", port=5000)
复制代码
代码优化,参加线程控制,防止webhook链接被并发调用后,两个hook使命线程同时执行出现安全问题。
  1. import os
  2. import subprocess
  3. from flask import Flask, request, jsonify
  4. import git
  5. import threading
  6. app = Flask(__name__)
  7. # 配置你的本地仓库路径和构建命令
  8. REPO_PATH = "/blog"
  9. PUBLIC_PATH = os.path.join(REPO_PATH, 'public')
  10. lock = threading.Lock()
  11. is_building = False  # 标志位,用于指示是否有任务正在进行
  12. # 拉取代码的函数
  13. def pull_code():
  14.     try:
  15.         repo = git.Repo(REPO_PATH)
  16.         origin = repo.remotes.origin
  17.         origin.pull()
  18.         return True
  19.     except Exception as e:
  20.         print(f"Failed to pull code: {e}")
  21.         return False
  22. # 构建 Hexo 站点的函数
  23. def build_hexo():
  24.     try:
  25.         # 执行 Hexo 的清理和生成命令
  26.         subprocess.run(["npm", "run", "build"], cwd=REPO_PATH, check=True)
  27.         #subprocess.run(["hexo", "generate"], cwd=REPO_PATH, check=True)
  28.         return True
  29.     except subprocess.CalledProcessError as e:
  30.         print(f"Failed to build Hexo: {e}")
  31.         return False
  32. @app.route("/webhook", methods=["POST"])
  33. def webhook():
  34.     global is_building
  35.     # 验证请求是否来自 Gitee
  36.     if request.headers.get("X-Gitee-Token") != "":
  37.         return jsonify({"message": "Unauthorized"}), 401
  38.     # 获取事件类型,确保是 push 事件
  39.     event = request.headers.get("X-Gitee-Event")
  40.     if event != "Push Hook":
  41.         return jsonify({"message": "Not a push event"}), 400
  42.     if is_building:
  43.         return jsonify({"message": "Build in progress, try again later"}), 429
  44.     with lock:
  45.         is_building = True  # 设置标志位为 True,表示任务开始
  46.         try:
  47.             # 拉取代码并构建
  48.             if pull_code() and build_hexo():
  49.                 return jsonify({"message": "Hexo build success"}), 200
  50.             else:
  51.                 return jsonify({"message": "Failed to pull or build"}), 500
  52.         finally:
  53.             is_building = False  # 重置标志位,表示任务结束
  54.             
  55. if __name__ == "__main__":
  56.     app.run(host="0.0.0.0", port=5000)
复制代码
4.执行脚本
  1. nohup python3 webhook.py &
复制代码
5.配置hook到gitee

设置好署名(暗码),设置回调地点,勾选两项


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表