在使用 Hexo 搭建博客并推送到 GitHub Pages 后,我希望每次更新博客时,能够自动同步到我们的服务器(服务器上有其他域名,也是为了解决github page只能使用一个自定义域名的问题)。虽然可以通过在服务器上定期执行 git pull 来实现,但这种方法略显不够优雅。因此,我想到了使用 GitHub Actions 来实现这个自动化流程。💡

问题背景 🤔

每次执行 hexo cl && hexo g -d 后,GitHub Actions 的配置文件会被覆盖掉,因为 Hexo 部署时不会包含 .github 目录下的文件。这是因为 Hexo 默认不会编译以 . 开头的文件夹,这导致 public 目录中不会有 .github/workflows/<文件名>.yml 文件,从而使得 Actions 失效。

解决方案 🎯

通过阅读 hexo-deployer-git 的文档,我发现可以使用 extend_dirs 字段来包含特定的文件或目录,将其一同提交到远程仓库。这样就可以完美解决这个问题。👌

配置 Hexo

在 Hexo 的 _config.yml 中进行如下配置:

1
2
3
4
5
deploy:
type: git
repo: <github 地址>
branch: main
extend_dirs: [.github/workflows/]

注意:extend_dirs 读取的是博客根目录下的文件夹,而不是 source 中的。因此,GitHub Actions 的 yml 文件应该位于 /blogroot/.github/workflows/<文件名>.yml,并且不支持通配符。

这样配置后,每次执行 hexo d 时,.github/workflows/ 文件夹中的内容会被放到提交目录的根目录,即 /blogroot/.deploy_git/ 中,GitHub 就能成功识别并执行 Action。🎉

使用 GitHub Actions 同步到服务器 🖥️

在项目根目录 /blogroot/ 下创建 .github/workflows/deploy.yml 文件,填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
name: Deploy to Server

on:
push:
branches:
- main # 监听 main 分支

jobs:
deploy:
runs-on: ubuntu-latest
environment: # 表示使用github-pages变量,这个在github的setting设置
name: github-pages
steps:
- name: Checkout
uses: actions/checkout@v2

- name: Setup SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Deploy to server
env:
SERVER_IP: ${{ secrets.SERVER_IP }}
SERVER_USER: ${{ secrets.SERVER_USER }}
SERVER_PORT: ${{ secrets.SERVER_PORT }}
REPO_URL: https://github.com/Pleiadem/Pleiadem.github.io.git
TARGET_DIR: ${{ secrets.TARGET_DIR }} # 我这里会先删除目录再重建,避免git pull失败,!注意风险!
run: |
ssh -o StrictHostKeyChecking=no -p $SERVER_PORT $SERVER_USER@$SERVER_IP "
if [ -d $TARGET_DIR ]; then
rm -rf $TARGET_DIR
fi
mkdir -p $TARGET_DIR
git clone $REPO_URL $TARGET_DIR
"

配置 GitHub Secrets 🔑

接下来,到 GitHub Pages 项目的设置中配置环境变量:

  1. 点击 Settings,找到 Environments

  2. 进入 GitHub 默认创建的 github-pages 环境变量组。

  3. Environment secrets 中点击 Add environment secret,设置以下变量:

    • SERVER_IP:你的服务器 IP 地址。

    • SERVER_PORT:SSH 连接的端口。

    • SERVER_USER:SSH 用户名。

    • SSH_PRIVATE_KEY:用于连接服务器的私钥。

    • TARGET_DIR:服务器上的目标目录。

完成这些配置后,运行 hexo cl && hexo g -d,即可自动运行github action,可到后台查看进度。🚀

通过这样的设置,每次你更新 Hexo 博客并推送到 GitHub 时,GitHub Actions 将自动同步更新到你的服务器上,省去手动操作的麻烦。希望这个方法对你有所帮助!😊