使用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主题.于是便想自己也搭建一个,于是便去就去查 ...
随机推荐
- Git中使用tag
什么是tag git仓库的tag是git版本库的一个标记,指向某个commit id标记的快照记录指针,所以,标签也是版本库的一个快照. tag主要用于发布版本的管理,一个当版本发布后,可以为git当 ...
- php调试工具之firePHP
让PHP可以像js一样利用浏览器的控制台调试代码 ------- FirePHP(http://www.firephp.org/) 1. 安装FirePHP插件 在Chrome浏览器的应用商店中,搜 ...
- python3安装与使用(Linux)
之前写过有关Windows下的python3的安装与使用,这次看一下Linux下的python3 1. 安装依赖环境 yum -y install zlib-devel bzip2-devel ope ...
- 使用certbot申请免费SSL证书
现在网站使用https已经成为标配,但是SSL证书最便宜的DV证书也要几百块钱一年,对于个人开发者来说很不划算.好在,我们有Let's Encrypt,它是能提供免费的SSL证书,应该也是市面上使用最 ...
- Java8提供的Stream方式进行分组GroupingBy
有时我们需要对集合进行分组操作,这时可以使用Java8提供的Stream方式进行分组.挺好用的,此处记录下.直接贴code: Road实体: @Data @NoArgsConstructor @A ...
- 案例 | 销讯通加持药企SFE部门效能提升
为了获取更大的市场空间,医药健康行业正迎来一波前所未有的产业升级.尽管不少企业取得了许多成绩,但仍面临诸多挑战. 江苏某制药公司在心脑血管.中枢神经.胃肠内科.心脏科.内分泌科.皮肤科和风湿科等领域均 ...
- 自有Jar包生成Docker镜像
前言 经常会有些自己写的一些SpringBoot小项目,为了实现一些小的功能/需求,但是部署的时候,不管是生成jar包,还是war包部署到tomcat中,都容易因为需要部署的环境(比如java版本.t ...
- 一图一知-vue强大的slot
vue常用的slot知识点记录
- SafeHandle 和 Dispose
SafeHandle 和 Dispose 这是从 https://www.cnblogs.com/zeroone/p/3708112.html 复制过来的,原文的格式不够好,重新排版一下. SafeH ...
- error C2664: “HANDLE FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW)”: 无法将参数 1 从“const _Elem *”转换为“LPCWSTR”
Error 30 error C2664: 'HANDLE FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW)' : 不能将参数 1 从"char [260 ...