使用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
设置好签名(密码),设置回调地址,勾选两项

使用python实现一个可自动部署hexo博客的gitee webhook的更多相关文章
- 使用Travis CI自动部署Hexo博客
自从使用GitHub Pages和Hexo来发布博客之后,不得不说方便了许多,只需要几个简单的命令博客就发布了.但在不断的使用中发现每次的发布操作也挺耗时的. 我一般的操作是将平时整理好的md文件放到 ...
- 基于 Github Actions 自动部署 Hexo 博客
前言 前不久使用了 Hexo 搭建独立博客,我是部署在我的腾讯云轻量应用服务器上的,每次都需要 hexo deploy 然后打包.上传.解压和刷新 CDN,非常麻烦.我的服务器配置也不高 2C2G 无 ...
- 在腾讯云上部署Hexo博客
推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...
- 在 Ubuntu 14.04 服务器上部署 Hexo 博客
版权声明:本文由宋秉金 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/241080001487926962 来源:腾云阁 ...
- 码云上部署hexo博客框架
title: 码云上部署hexo博客框架 Hexo框架在码云上实现个人博客 本文受 https://www.jianshu.com/p/84ae2ba1c133 启发编写 本地调试 安装完Node.j ...
- 使用GitHub Actions自动编译部署hexo博客
前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...
- 使用 Azure 静态 Web 应用服务免费部署 Hexo 博客
一.前言 最近在折腾 Hexo 博客,试了一下 Azure 的静态 Web 应用服务,发现特别适合静态文档类型的网站,而且具有免费额度,支持绑定域名.本文只是以 Hexo 作为示例,其他类型的框架也是 ...
- [还不会搭建博客吗?]centos7系统部署hexo博客新手入门-进阶,看这一篇就够了
@ 目录 *本文说明 请大家务必查看 前言 首先介绍一下主角:Hexo 什么是 Hexo? 环境准备 详细版 入门:搭建步骤 安装git: 安装node: 安装Hexo: 进阶:hexo基本操作 发布 ...
- github travis-ci持续部署hexo博客
引言 目前我的博客源码是在coding上的,因为有很方便的持续部署,但是coding目前还不提供push文件的开放API. 因为最近做了一个一键分发平台,将博客分发到简书.CSDN等等的平台,但是我的 ...
- 在Github上面搭建一个自己域名的Hexo博客
前言 在一次看到别人的博客主页,觉得设计很漂亮.但是由于自己对于前台这块没什么办法,煞是羡慕.偶然中发现这种样式是在Github上面搭建的,使用的是Next主题.于是便想自己也搭建一个,于是便去就去查 ...
随机推荐
- 抓包工具之Charles(mac)
下载地址:https://www.charlesproxy.com/download/ 因为软件是收费的,所以破解方式可以参考:https://www.zzzmode.com/mytools/char ...
- 不求甚解--详解ansible-playbook中roles的用法
前言 本文将详细介绍ansible-playbook中roles的各种用法,它允许你将相关的任务.变量.处理器.文件和模板等集合在一起,以便于在不同的项目中复用 环境准备 组件 版本 操作系统 Ubu ...
- ProWindow的控制按钮状态
在使用ArcGIS.Desktop.Framework.Controls.ProWindow时,有网友发现,设置窗口调整模式后,窗口的控制按钮是不全的. ProWindow win = new Pro ...
- 六步取消win11开机PIN密码登录
0.前言 新买的电脑打开后首先要进行一系列的操作激活操作系统.在这些操作中最令人讨厌的是设置开机密码(pin). 也许有很多人的电脑需要保密,限制别人登录,这时使用登录pin是很有必要的.而还有很多人 ...
- Element Plus组件v-loading在el-dialog组件上使用无效
前情 公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vu ...
- HarmonyOS鸿蒙开发 - 解决上下两栏白边 - 沉浸式效果
鸿蒙应用开发从入门到入行 预览器上下两栏白边 自从HarmonyOS升级到release版后,很多同学会问猫林老师:为什么他的预览器上下有白边,为什么明明根容器写了宽高百分百但没铺满.如下图 白边原因 ...
- Flutter ListView报错RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT
RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT 使用ListView.builder()布局时,如果 ...
- Linux&shell通过正则表达式查找文件练习
linux&shell编程中通过正则表达式来匹配查找文件极大的提高查找效率. 首先,解释一下下边出现的命令. linux部分: ls:查看文件夹内的命令. |:管道. grep:搜索后边匹配的 ...
- mysql命令行创建数据库并设置字符集
CREATE DATABASE test1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
- Consul 命令(CLI)
Consul通过一个非常简单易用的命令行界面(CLI)进行控制.Consul只是一个单一的命令行应用程序:Consul. 然后,这个应用程序将取代诸如" agent"或" ...