文章首发在我的博客: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的更多相关文章

  1. 使用Travis CI自动部署Hexo博客

    自从使用GitHub Pages和Hexo来发布博客之后,不得不说方便了许多,只需要几个简单的命令博客就发布了.但在不断的使用中发现每次的发布操作也挺耗时的. 我一般的操作是将平时整理好的md文件放到 ...

  2. 基于 Github Actions 自动部署 Hexo 博客

    前言 前不久使用了 Hexo 搭建独立博客,我是部署在我的腾讯云轻量应用服务器上的,每次都需要 hexo deploy 然后打包.上传.解压和刷新 CDN,非常麻烦.我的服务器配置也不高 2C2G 无 ...

  3. 在腾讯云上部署Hexo博客

    推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...

  4. 在 Ubuntu 14.04 服务器上部署 Hexo 博客

    版权声明:本文由宋秉金 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/241080001487926962 来源:腾云阁  ...

  5. 码云上部署hexo博客框架

    title: 码云上部署hexo博客框架 Hexo框架在码云上实现个人博客 本文受 https://www.jianshu.com/p/84ae2ba1c133 启发编写 本地调试 安装完Node.j ...

  6. 使用GitHub Actions自动编译部署hexo博客

    前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...

  7. 使用 Azure 静态 Web 应用服务免费部署 Hexo 博客

    一.前言 最近在折腾 Hexo 博客,试了一下 Azure 的静态 Web 应用服务,发现特别适合静态文档类型的网站,而且具有免费额度,支持绑定域名.本文只是以 Hexo 作为示例,其他类型的框架也是 ...

  8. [还不会搭建博客吗?]centos7系统部署hexo博客新手入门-进阶,看这一篇就够了

    @ 目录 *本文说明 请大家务必查看 前言 首先介绍一下主角:Hexo 什么是 Hexo? 环境准备 详细版 入门:搭建步骤 安装git: 安装node: 安装Hexo: 进阶:hexo基本操作 发布 ...

  9. github travis-ci持续部署hexo博客

    引言 目前我的博客源码是在coding上的,因为有很方便的持续部署,但是coding目前还不提供push文件的开放API. 因为最近做了一个一键分发平台,将博客分发到简书.CSDN等等的平台,但是我的 ...

  10. 在Github上面搭建一个自己域名的Hexo博客

    前言 在一次看到别人的博客主页,觉得设计很漂亮.但是由于自己对于前台这块没什么办法,煞是羡慕.偶然中发现这种样式是在Github上面搭建的,使用的是Next主题.于是便想自己也搭建一个,于是便去就去查 ...

随机推荐

  1. elementUI 表格之合并同类项(包括行和列)

    mergeSpan(tableData, arr) { //["areName","indexCode"] let spanArr = new Array(ta ...

  2. Redis循环慢接口优化

    原慢接口 List<String> keys = new ArrayList<>(Arrays.asList("1", "2", &qu ...

  3. 开发Git分支管理

    目前分支管理 AngularJS在github上的提交记录被业内大多数开发人员认可,逐渐被广泛引用. 代码提交Message格式 type (scope): message 参数介绍: 1.type: ...

  4. ELSTICSEARCH 将数据从热节点转到冷节点

    在ES查询时,有些数据是热点数据,这些数据是需要需要更好的机器配置的节点,当数据变得不是那么重要的时候,我们需要转到配置相对低的节点上. 比如热点新闻专题,我们需要更好的机器,热点过后,这些数据不再需 ...

  5. uni-app PDA扫描

    1.前言 PDA扫码是工厂项目中是非常常见的功能,这里记录下工作中的开发思路和模板,仅供参考 PDA扫码模式:模拟输入和广播模式 模拟输入:模拟键盘输入,一般后面会设置追加一个回车,优点是通用型强,缺 ...

  6. iOS自动化打包输出工具

    自动化打包输出工具 做开发的小伙伴有时候会接到自动化打包的需求,公司一般是要求根据一个配置文件来实现自动化配置iOS项目,比如往Xcode工程添加或修改代码.添加Framework.library.S ...

  7. Newstar CTF 2023 week2 pwn

    1.ret2libc 发现存在pop rdi 观察main函数,可以利用puts函数泄露libc from pwn import * from LibcSearcher import * contex ...

  8. elementui多选框部分禁用

    直接上代码 <el-table-column type="selection" :selectable="selectable" align=" ...

  9. 如何优雅地让 ASP.NET Core 支持异步模型验证

    前言 在ASP.NET Core官方仓库中有个一直很受关注的问题Please reconsider allowing async model validation.FluentValidation的作 ...

  10. Dapr-3: 从 20000 英尺之上俯瞰 Dapr

    第 3 章 从 20000 英尺之上俯瞰 Dapr Dapr at 20,000 feet | Microsoft Docs 在第 1 章中,我们讨论了分布式微服务应用的吸引力.但是,我们也指出了它会 ...