书接上回,阅读本文的前提是你已经能够通过hexo n/g/s/d几个命令实现hexo博客的部署,并且建立了相应的github主页和仓库。

现在我们想要实现的是:

  1. hexo源码托管
  2. 不通过本地generate和deploy,而是通过提交代码到源码仓库的方式,通过源码仓库的github action来实现自动的部署。

hexo源码托管

GitHub仓库设置

创建两个仓库:

  • username.github.io(存放生成的静态文件,命名不能有问题,且是免费用户的话必须设置公开)
  • blog-source(存放Hexo源码,可以随意命名,可以设置私有,毕竟有的博客可以加密,如果源码都公开了,加密又有什么意义)

本地Hexo项目配置

初始化源码Git仓库

cd my-blog
git init
git remote add origin https://github.com/username/blog-source.git

配置Hexo

修改_config.yml中的部署设置:

# Deployment
deploy:
  type: git
  repo: https://github.com/username/username.github.io.git
  branch: master

创建.gitignore文件

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/

GitHub Actions工作流配置

创建工作流文件

在Hexo源码仓库中创建:.github/workflows/deploy.yml

比如我的如下,要修改的只有external_repository:

name: Deploy Hexo

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    name: Hexo Build and Deploy
    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Setup Node
      uses: actions/setup-node@v4
      with:
        node-version: '20'

    - name: Install Hexo
      run: |
        npm install hexo-cli -g
        npm install

    - name: Generate Static Files
      run: hexo generate

    - name: Deploy to GitHub Pages
      uses: peaceiris/actions-gh-pages@v3
      with:
        personal_token: ${{ secrets.PAT_FOR_DEPLOY }}
        publish_dir: ./public
        publish_branch: master
        external_repository: leehm00/leehm00.github.io
        user_name: 'github-actions[bot]'
        user_email: 'github-actions[bot]@users.noreply.github.com'

有两个需要注意的点

  • 第一是on: [push],这个配置可以改成推送到某一个分支的时候触发,如果使用了多个版本分支管理自己的hexo源码的时候可以考虑
  • 第二是要使用peaceiris/actions-gh-pages@v3personal_token: ${{ secrets.PAT_FOR_DEPLOY }},一定不要用``GITHUB_TOKEN,有的教程会说使用这个,但是因为 GITHUB_TOKEN`只能访问当前运行工作流的仓库,无法推送到外部仓库,已经不能适配我们的场景了。关于token配置见后面。
    • 如果硬是要用就需要将源码设置为username.github.io仓库的一个分支,由于穷哥们没有付费必须设置公开,源码还是直接暴露了。。。

使用 Personal Access Token (PAT)

  1. 生成 Personal Access Token
    • 访问 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)
    • 生成新 token,选择 repo权限 (可以考虑同时选上workflow)
    • 复制生成的 token(只显示一次)
  2. 在源码仓库添加 Secret
    • 进入源码仓库的 Settings → Secrets and variables → Actions
    • 添加新 secret:PAT_FOR_DEPLOY,值为刚才复制的 token(名字要和前面文件中保持一致)

username.github.io仓库的更改

不需要更改

有的教程会让你进入username.github.io仓库,然后Settings → Pages → Source选择”GitHub Actions”,但是我们在源码仓库的Actions (peaceiris/actions-gh-pages) 已经完成了所有工作:构建 Hexo → 将最终的静态文件推送到目标仓库的 master 分支

  • 目标仓库 (leehm00/leehm00.github.io) 接收到的已经是现成的、可供托管的 HTML/CSS/JS 文件。

因此,只需要告诉 Pages:“请直接托管 master 分支中的内容。”

而如果Source选择”GitHub Actions”,这种方式是 GitHub Pages 的“现代”模式。它允许在目标仓库中运行另一个 Actions 工作流来执行构建和部署步骤。

  • 当选择此选项时,通常需要使用一个单独的 Actions 工作流(例如 pages-build-deployment)来处理构建和部署。
  • 对于静态网站生成器(如 Hexo),这意味着需要在目标仓库中再次进行 npm installhexo generate 等操作。

但是我们的 Hexo 构建和文件生成步骤已经在源码仓库中完成了。

目标仓库 (username.github.io) 的 master 分支中只有静态文件,没有 Hexo 源代码、package.json_config.yml 等文件,甚至它无法运行完整的 Hexo 构建。

本地工作流程

设置好一切之后,部署工作异常简单。

创建新文章

hexo new "我的新文章"
# 编辑 source/_posts/我的新文章.md

本地测试

如果只是写一些新文章,不进行测试的话就没必要跑这一步。

# 生成静态文件
hexo generate

# 本地预览
hexo server
# 访问 http://localhost:4000

提交和推送

# 添加更改
git add .

# 提交更改
git commit -m "发布新文章:我的新文章"

# 推送到GitHub,自动部署
git push origin master

自动化部署流程

触发流程

  1. 推送代码到blog-source仓库的master分支
  2. GitHub Actions自动触发构建流程
  3. 生成静态文件并部署到username.github.io

监控部署状态

  • 在GitHub源码仓库的”Actions”标签页查看部署状态,网页仓库也会因为更新进行相应的action
  • 部署完成后访问:https://username.github.io