Webhooks 持续部署静态博客

博客托管在 github pages 时,可以通过 hexo deploy 命令完成部署。
博客转移到 VPS 上部署后,使用的是 nginx 静态部署。虽然每次写完博客后,使用 hexo 生成静态文件,上传仓库,在 VPS 上 git pull 整个流程并没有几步。
但需要重复的事情不能够自动化,总归不够优雅。

因此,本篇博文的目的是利用 Webhooks 持续部署,完成最后一步在 VPS 上的操作。

原理

git push => Webhooks => 给 VPS 发送 post 请求 => VPS 执行脚本 (git pull)

实践

设置 Webhooks

以下以 Gitee 仓库为例,Github 操作相通。

访问 Gitee,进入博客仓库,点击管理,点击 Webhooks,添加 Webhooks。

填写 URL 和事件,点击添加。

这里没有填写 WebHook 密码,因为在 URL 的路径中使用了复杂的字符串 /webhook_Bb0qztNumeF4cxIF,可以起到一定防御作用。

为了能够接收到 Webhooks 的请求,需要做好URL的域名解析,以及对路径的响应。

Nginx 反代

使用 Nginx 将请求转发到后台端口。

server {
    listen 80;
    server_name api.guoguo.host;
    location / {
        proxy_pass_request_headers on;
        proxy_pass http://127.0.0.1:1314/;
    }
}

VPS 后台程序

使用 go 搭建一个 Web 服务器。

📄 /usr/local/bin/autodeploy.go

package main

import (
    "net/http"
    "os/exec"
)

var hookPath string = "/webhook_Bb0qztNumeF4cxIF"
var port string = "1314"

func autoDeploy(w http.ResponseWriter, req *http.Request) {
    command := "/home/autodeploy.sh"
    cmd := exec.Command("/bin/bash", command)
    // 执行shell脚本
    if err := cmd.Run(); err == nil {
        w.WriteHeader(200)
    } else {
        w.WriteHeader(500)
    }
}

func main() {
    http.HandleFunc(hookPath, autoDeploy)
    // 开启一个web服务器监听端口
    http.ListenAndServe(":"+port, nil)
}

编译代码,移动可执行文件。

go build autodeploy.go
mv autodeploy /usr/local/bin

注册程序为服务

为了实现后台程序的持续运行,需要注册为服务。

📄 /etc/systemd/system/autodeploy.service

[Unit]
Description=Gitee Webhook Server
After=syslog.target network.target Nginx.service

[Service]
Type=simple
ExecStart=/usr/local/bin/autodeploy
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

运行服务,并设置开机自启动

systemctl daemon-reload
systemctl enable autodeploy
systemctl start autodeploy

部署脚本

#!/bin/bash
cd /var/www/xxx # 静态文件目录
git pull 'xxx' master
echo $(date "+%Y-%m-%d %H:%M:%S") >> /home/autodeploy.log

静态文件生成脚本(可选)

Hexo 将 Markdown 文件渲染为网站时,会生成包含静态文件的 public 文件夹。
我们将这个文件夹上传至远程仓库,用于 VPS 部署。
为了优雅,这个步骤我们也可以优化。

先来看看上传静态文件需要哪些步骤。

cd ~/Blog
hexo g
rsync -r --delete ~/blog/public/ ~/site/public # 同步 hexo 项目下生成的静态文件夹到用于上传的仓库文件夹
cd ~/site
git commit -a --allow-empty-message -m '' # 无信息提交
git push

给以上命令指定一个别名

alias blogg="cd ~/blog && hexo g && rsync -r --delete ~/blog/public/ ~/site/public && cd ~/site && git add . && git commit -a --allow-empty-message -m '' && git push"

🎉 至此,我们可以使用 blogg 命令上传静态文件到远程仓库,然后完成 VPS 上的持续部署。

References

GitHub Hook 自动化部署
GitHub Webhook 与静态博客自动部署
WebHooks实现项目CI/CD
syslog之一:Linux syslog日志系统详解


Webhooks 持续部署静态博客
http://guoguo.host/blog/p/f66e616f.html
作者
Guoguo
发布于
2024年3月4日
许可协议