00 前言

在使用 Hexo 时,在写完一些文章/进行一些更改时,我们总是需要手动部署 Hexo ,比如使用 hexo-deployer-git 来使用 git 进行部署。那么,是否可以编写一个 workflow 扔给 GitHub,在我们每次把博客源码推送至 GitHub 仓库时可以自动构建、部署博客?

当然可以。

01 原理

请注意,以下所述方法,适用于将博客分离为两个仓库–一个为博客源代码仓库,一个为被部署的仓库–的用户使用

GitHub 提供免费的 CI功能,这意味着我们可以利用它,从而实现我们的目标。

Hexo 提供了一个 generate 的参数,运行 hexo g 可以在博客源代码的根目录里的 public 文件夹下找到我们构建得到的内容。此文件夹内容即需要被推送至被部署的仓库的所有文件。

通过使用 GitHub CI,我们可以做到在 CI 中克隆被部署仓库,并将生成的文件复制进克隆下来的仓库,再进入克隆的仓库目录进行提交,这样,我们就可以避免一些手动部署带来的弊端。

我们在这里不使用 hexo-deployer-git。以下是一些原因:

  • 无法保存被部署仓库的提交历史。hexo-deployer-git 会初始化一个新仓库并强制推送到我们的被部署仓库,这会导致我们的被部署仓库在每次部署时会丢失先前的推送记录。这会导致你每年的提交数量统计会少很多。

  • 每次都需要手动进行清理、构建、部署。我们每次都需要先 hexo cleanhexo generatehexo deploy 才能完成一次部署,真的很麻烦。

02 实现

以下是本博客使用的 workflow,可以作为借鉴。

name: Deploy blog to GitHub
on: # 在有推送时触发,同时保留手动触发的功能
push:
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout branch
uses: actions/checkout@v4
with:
ref: main

- name: Install Node
uses: actions/setup-node@v4
with:
node-version: "latest"

- name: Install Hexo
run: |
export TZ='Asia/Shanghai'
npm install hexo-cli -g

- name: Install deps
run: |
npm install --save

- name: Generate static files
run: |
hexo clean
hexo generate

- name: Deploy
run: |
git clone https://github.com/[你的 GitHub 用户名]/[你的被部署仓库] # 克隆被部署仓库
cd BLOG || exit 1
# 以下两行,是为了解决只复制文件,可能会导致我们想要删除一些内容的时候,被部署仓库里不会同步更新的问题
rm -rf *
cd ..

cp -rf ./public/* BLOG/
cd BLOG
# 配置 git
git config --global user.name '[你的 GitHub 用户名]'
git config --global user.email '[你的邮箱]'
git add --all
git commit -m "Auto deployment: ${{ github.event.head_commit.message }}

TIME: $(TZ='Asia/Shanghai' date +"UTC+8 %Y-%m-%d %A %H:%M:%S")"
git push --set-upstream "https://[你的 GitHub 用户名]:[你的GitHub Token]@github.com/[你的用户名]/[你的被部署仓库]" main --force

# 以下是一项额外功能: 在触发构建时,将提交信息同步推送至 Telegram。目标可以是群组、频道或者用户。
#
# - name: Send telegram message when build
# uses: appleboy/telegram-action@master
# with:
# to: ${{ secrets.TELEGRAM_TO }}
# # TELEGRAM_TO 填写被推送的地方的ID。频道和群组的ID需要在前面加上 -100
# token: ${{ secrets.TELEGRAM_TOKEN }}
# # TELEGRAM_TOKEN 填写你的 Bot 的 token。如何创建 Bot,请善用搜索引擎。
# format: markdown
# disable_web_page_preview: true
# message: |
# New push to Github!
# ```commit
# ${{ github.event.commits[0].message }}
# ```By `${{ github.actor }}` in repo `${{ github.repository }}`
#
# See changes: [here](https://github.com/${{ github.repository }}/commit/${{ github.sha }})

03 用法 & 效果

在你的博客源代码仓库的根目录,创建文件夹 .github/workflows,并在里面放入上文所述 workflow 文件,并把后缀改为yml,你就完成了 Hexo 自动部署的工作。

效果如下: