基于Gitee的webhook编写hugo的自动构建实现博客自动更新

news2024/12/26 22:01:19

前言

差不多半年前趁着某云优惠,我买了5年的轻量级应用服务器。

拿着这个服务器原本打算做我的某个APP的服务端的,后来又觉得迁移数据好麻烦,所以随便搞了个博客上去。

选来选去,使用了 hugo 作为构建引擎。

正好,那时我刚从某流水线提桶跑路没多久,就琢磨着记录一下我的提桶生涯。

但是提桶生涯的文章太多了,足足有70多篇,如果每次更新都手动登录服务器构建或者在在本地构建完成后上传静态页面上去太麻烦了。

所以,我将所有文章托管到了 Gitee,然后利用 Gitee 的 Webhook 功能实现了 push 文章到 Gitee 后自动构建页面并复制到服务器指定目录的功能。

对了,别问我为啥不用 github 成熟的 Action 功能,问就是网络原因。

实现方法

准备工作

创建代码仓库

首先,我们需要将自己的文章包括 hugo 的完整代码托管到 Gitee,这样我们才能使用 webhook。

需要注意的是,因为 hugo 每次构建页面都是删除所有页面后完全重建的,为了减少 commit 到 git 时的工作量,记得在 .gitignore 中添加生成目录 public/

服务器环境搭建

然后,我们需要在服务搭建一个程序用于接收 webhook 并执行构建命令。

这里我选择使用 flask ,原因无他,纯粹因为 python 简单,flask 环境搭建也很简单。

而对于存放生成好的博客静态页面的程序,我直接使用了 nginx。

构建代码

在 flask 的入口文件中编写代码:

from flask import Flask, request
from webhook import webhook

app = Flask(__name__)

@app.route('/xxx/yyy/webhook', methods=["POST"])
def hugo_webhook():
    return webhook.update_hugo(request)

if __name__ == '__main__':
    app.run()

其中路径 /xxx/yyy/webhook 即为 webhook 需要请求的 URL 路径。

webhook.py 代码如下:

import os


def update_hugo(request):
    try:
        password = request.headers.get("X-Gitee-Token")
        hook_name = request.headers.get("X-Gitee-Event")

        if password != "push password" or hook_name != "Push Hook":
            return '401 Unauthorized', 401, {}

        os.system('sh xxx/fetch_hugo.sh '
                  '2>&1 | tee xxx/fetch_hugo.log')
        return 'ok'

    except Exception as e:
        print(e)
        return '400 Bad Request', 400, {}

在这段代码中,我们首先验证了请求头中的 X-Gitee-Token 字段,这个字段是我们在设置 Gitee 仓库 webhook 时自定义的验证密码。

X-Gitee-Event 这个字段则是触发 webhook 的事件类型,这里我们只接收 push 事件,即 Push Hook

验证请求没问题后执行 fetch_hugo.sh 脚本,并将执行脚本的输出内容写入到 fetch_hugo.log 文件中,方便我们有需要的时候查看日志用。

fetch_hugo.sh 的内容如下:

# 设置只要有一条命令执行失败就直接退出整个脚本
set -e

# 输出日志,下同
echo "cd to path..."

# 切换到 hugo 根目录
cd ~/xxx/likehide_home_hugo

echo "start pull..."

# 从仓库拉取最新代码
git pull

echo "delete old files..."

# 删除生成的页面文件,这里如果不删除的话即使在hugo中删除对应的文章或文件,实际服务器上还是会保留已删除的文件
sudo rm -rf /xxx/www/hugoHtml
sudo rm -rf ./public

echo "start build..."

# 调用hugo命令开始构建页面,如果这个命令失败则输出构建失败
hugo || echo "build fail!"

echo "create dir..."

# 创建 nginx 静态页面文件夹
sudo mkdir /xxx/www/hugoHtml

echo "start copy..."

# 复制hugo构建出的页面文件到nginx静态页面文件夹中
sudo cp -r ./public/* /xxx/www/hugoHtml

echo "all done!"

每一行的作用都在注释中说明了。

需要注意的是,在构建新的页面之前一定要记得把旧文件删除,否则即使你在提交到 git 仓库时删除了某些文件,服务器上的文件依旧不会被删除。

但是这样有个弊端,就是如果删除文件后,接下来的命令出错了,那么服务器就会所有文件都没有了。

所以这里可以优化一下,不是删除,而是拷贝到某个私有目录备份,在这个脚本执行完毕后检测是否构建成功,如果失败则把备份文件拷贝回去。

这里我就不演示了,感兴趣的可以自己更改。

设置webhook

在 Gitee 你用于存放代码的仓库中依次选择 管理 - WebHooks - 添加 webHook 新建一个 webhook。

s1

然后在这个界面中的 Url 一栏填上你自己写的接收 webhook 的地址,比如:http://equationl.com/xxx/yyy/webhook

按照需求选择 WebHook 密码或密钥,然后填写对应的值,这里我们为了简单直接选择密码。

根据需求勾选需要的 hook 事件,这里我只勾选了 push ,因为其他的我用不上。

记得勾上激活。

最后点击 添加 即可。

s2

这样,每当这个仓库收到新的 push 后都会向我们填写的 url 发送一个 Post 请求,请求的内容我们无需担心,反正只要我们的服务器接收到请求后就验证请求头的密码和事件,符合就执行构建脚本即可。

总结

可以看到,其实添加自动构建非常简单,不过是一个脚本就能解决的事。

但是就是这么一个小脚本,却能给我们节约无数的宝贵时间。

对了,现在我博客的图片都是直接传到 Gitee 中,然后放到服务器的,虽然现在没问题,但是随着文章增大,要么是 Gitee 仓库达到限额,要么就是服务器被塞满图片或带宽被用完。

所以下次有机会我再写一篇文章说说怎么搭建图床或者将图片插入到已有图床。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/549667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟我一起使用 compose 做一个跨平台的黑白棋游戏(1)整体实现思路

前言 为什么写这系列文章 虽然 compose 正式版已经出来很久了,也有很多大佬写了很多教程文章和实例 demo ,但是对于 compose 其实我也还是一知半解的。 特别是对于 compose 的状态管理,由于 compose 声明式的特性,如果不对状态…

chatgpt赋能Python-pythonfor怎么用

PythonFor SEO:如何利用Python提高SEO效果 SEO(搜索引擎优化)是现代数字营销中至关重要的一环。随着搜索引擎算法不断发展,优化网站以提高排名已经成为了一门复杂的艺术。幸运的是,Python提供了一些强大的工具来简化这…

chatgpt赋能Python-pythonelem

PythonELEM - 简易的Python学习工具 作为一名有10年Python编程经验的工程师,我可以深刻地体会到新手们学习Python的难处。PythonELEM是一个以Python为主题的学习工具,它可以帮助初学者更容易地掌握Python编程。 PythonELEM的功能 PythonELEM是一个简易…

餐饮油烟排放监测管理系统的设计与应用

安科瑞虞佳豪 连日来,河东区生态环境保护综合行政执法支队组织开展餐饮行业油烟净化专项检查工作,有效应对即将到来的夏季餐饮油烟对环境的污染,着力解决群众身边的环境问题。 执法人员对辖区餐饮商户集中区域开展常态化巡查,重…

Metal入门学习:绘制渲染三角形

一、编程指南PDF下载链接(中英文档) 1、Metal编程指南PDF链接 https://github.com/dennie-lee/ios_tech_record/raw/main/Metal学习PDF/Metal 编程指南.pdf 2、Metal着色语言(Metal Shader Language:简称MSL)编程指南PDF链接 https://github.com/dennie-lee/ios_te…

chatgpt赋能Python-pythoncumsum

Python中的cumsum-累积求和函数 在数据处理中,经常需要对一个序列的元素进行累加。Python中提供了累积求和函数cumsum(),用于对一个序列的元素进行累加求和操作。 什么是cumsum()函数 cumsum()函数是Python中numpy模块中的一个函数,用于对…

通过小米万兆路由器将小米SoundMove 无缝接入 ChatGPT

通过小米万兆路由器将小米SoundMove 无缝接入 ChatGPT 本教程内容参考 Github 地址(可选)部署查看小米 SoundMove 信息的环境(可选)查看小米 SoundMove 的信息以容器方式部署程序到小米万兆路由器实际效果有待改善点 本教程内容 1 是记录了将小米 SoundMove 接入 ChatGPT 的操…

面向《海贼王》领域数据的知识图谱项目

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本次任务试图为《海贼王》中出现的各个实体,包括人物、地点、组织等,构建一个知识图谱,帮助我们更好的理解这部作品。 项目内容包括数据采集、知识存储、知识抽取、知识计算、知识应用五大部…

【运动规划算法项目实战】如何使用Pure Pursuit算法进行路径跟踪(附ROS C++代码)

文章目录 前言一、简介二、Pure Pursuit算法优缺点三、 代码实现3.1 算法实现步骤3.2 pure_pursuit.h3.3 pure_pursuit.cpp3.4 cubic_spline_path.py3.5 节点连接关系3.6 RVIZ显示四、总结前言 在自动驾驶和机器人导航领域,路径跟踪是一项关键技术,它使车辆或机器人能够按照…

多线程排序法

多线程排序法 chatGPT给我改的多线程排序法 using System.Collections.Concurrent; using System.Threading; ConcurrentBag<int> sortedList new ConcurrentBag<int>(); void Sort() { int[] arr {2, 6, 12, 8}; List<Thread> threads new List<Threa…

chatgpt赋能Python-pythondone

PythonDone&#xff1a;将Python编程变得更加简单 介绍 Python是一种有着广泛应用的高级编程语言&#xff0c;由于其简洁易学、开发效率高、可移植性好等特点&#xff0c;成为业内最热门的技术之一。但是&#xff0c;对于一些初学者来说&#xff0c;Python的学习过程可能还是…

【论文分享|SIGMOD‘22】WeTune 自动发现和验证重写规则

作者&#xff1a;谢其骏 北京航空航天大学在读硕士&#xff0c; Databend 研发工程师实习生 https://github.com/jun0315 论文原文&#xff1a; Zhaoguo Wang, Zhou Zhou, Yicun Yang, Haoran Ding, Gansen Hu, Ding Ding, Chuzhe Tang, Haibo Chen, Jinyang Li. WeTune: Auto…

【AIGC】11、MDETR | LeCun 团队于 2021 年推出的端到端多模态理解模型

文章目录 一、背景二、方法2.1 DETR2.2 MDETR 三、效果3.1 预训练调整后的检测器3.2 下游任务 论文&#xff1a;MDETR - Modulated Detection for End-to-End Multi-Modal Understanding 代码&#xff1a;https://github.com/ashkamath/mdetr 出处&#xff1a;ICCV 2021 Oral…

chatgpt赋能Python-pythonctrl快捷键

PythonCtrl快捷键使用指南 作为一名有10年Python编程经验的工程师&#xff0c;我深知PythonCtrl快捷键的重要性。PythonCtrl作为一个Python的开源编辑器&#xff0c;在每一个版本中都加入了更多的功能和快捷键&#xff0c;使得Python编程更加高效和易用。在本篇文章中&#xf…

卡方分布分析与应用

卡方检验(chi-square&#xff0c;记为χ2检验)是统计学中常用来计数数据分析的方法&#xff0c;对于总体的分布不作任何假设&#xff0c;因此它属于非参数检验法中的一种。本博文从理论到实际应用去阐述卡方检验&#xff0c;最后用python语言去实现卡方分布的代码。 1. 卡方分…

Spring Security的基本组件

一.简介 Spring Security通过一些列的过滤器完成了用户身份认证及其授权工作&#xff0c;每个过滤器都有不同分工&#xff0c;当然这些过滤器并不是全部都一起工作&#xff0c;而是根据我们需要什么功能&#xff0c;才会选取对应的过滤器加入。 当然这些过滤器并不是直接加入…

Linux 终端特殊符号含义大全

Linux特殊符号使用及含义 总结 Linux 终端中有许多特殊符号&#xff0c;本文对常用的进行了总结&#xff1a; $ 表示变量/普通终端用户&#xff1a;用于引用变量的值/表示终端中的普通用户。# 表示注释/超级用户&#xff1a;用于在脚本中注释代码/表示终端中的超级用户。/ &…

Doxygen 源码分析: QCString类

2023-05-20 23:41:56 ChrisZZ imzhuofoxmailcom Hompage https://github.com/zchrissirhcz 文章目录 1. Doxygen 版本2. QCString 类概览3. QCString 特殊成员函数3.1 default 方式的构造函数3.2 单个参数和两个参数的构造函数 4. inline方式实现的成员函数4.1 operator 函数4.…

chatgpt赋能Python-pythonguanwang

Python官网SEO分析 Python是一种高级编程语言&#xff0c;被广泛应用于Web开发、数据科学、人工智能、机器学习等领域。Python官网&#xff08;https://www.python.org&#xff09;是Python语言的官方网站&#xff0c;为Python用户和开发者提供了最新的Python解释器、文档、库…

中文Python(5)中文Python的while条件循语句

中文Python&#xff08;5&#xff09;中文Python的while条件循语句 Python是一种流行的编程语言&#xff0c;其简单而直观的语法吸引了很多人学习和使用。中文Python则是针对中文用户开发的一种版本。中文Python原先为了给不懂编写程序的人写量化程序&#xff0c;我们开发了中…