文章首发在我的博客:https://blog.liuzijian.com/post/af1f30e3-c846-650e-9a3f-34e326bf950d.html
hexo博客想在提交后自动部署,使用连续集成工具比较繁琐也消耗资源,于是用python脚本加gitee webhook实现自动化拉取打包部署。
1. 安装 pip 和 Python
首先,确保你已经安装了 Python。如果没有安装,可以使用以下命令来安装 Python 和 pip:
1.1 检查 Python 版本
如果你已经安装了 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 是否已经成功安装:2. 使用 pip 安装依赖
一旦 pip 安装好,你可以使用以下命令来安装需要的库:- pip3 install flask gitpython
复制代码 之后你就可以运行之前的 Python Webhook 脚本了。
3.编写脚本
- 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
设置好署名(暗码),设置回调地点,勾选两项
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |