使用 Github Actions 实现 Hexo 自动部署

缘起

看到这个标题,你可能会说:我本地生成静态文件了之后再手动上传不是很方便嘛,何必要折腾这么复杂的方法呢?

但是对我来说,用这套方案还是有很多好处的。

  • 源文件云端备份到 Github,丢失概率低
  • 自动进行双端部署(Pages + 服务器),特别是部署到服务器会方便很多
  • 随时随地,没有电脑也能修改博客内容

所以就来试试看吧,反正 Actions 不要钱(?

思路

首先我们需要了解 Github Actions 的工作原理。

Github Actions 本质上就是给你提供了一台虚拟服务器,你可以编写一种特殊的脚本来指定这台服务器干些什么。

我们需要让这台服务器先克隆博客源码的仓库,随后配置 Hexo 运行环境,之后生成静态博客文件,最后发布到 Pages 或推送到我们自己的服务器。

实现

1. 新建仓库并上传源码

没什么好说的,把你的博客源文件传上去就好了。

2. 配置 Workflow

新建一个 Workflow,并粘贴下面的代码:

name: Hexo Deployment

on:
  push:
    branches: [main]

jobs:
  hexo-deployment:
    runs-on: ubuntu-latest
    env:
      TZ: Asia/Shanghai

    steps:
    - name: Checkout source
      uses: actions/checkout@v2
      with:
        submodules: true

    - name: Setup Node.js
      uses: actions/setup-node@v1
      with:
        node-version: '16.15.1'

    - name: Install dependencies & Generate static files
      run: |
        npm i --location=global hexo-cli
        npm i
        hexo clean
        hexo g
        
    - name: Deploy to Github Pages
      env:
        GIT_NAME: (用户名)
        GIT_EMAIL: (邮箱)
        REPO: (仓库地址,如 github.com/akyuu-cn/evershifting-fountain)
        GH_TOKEN: ${{ secrets.GH_TOKEN }}
      run: |
        cd ./public && git init && git add .
        git config --global user.name $GIT_NAME
        git config --global user.email $GIT_EMAIL
        git commit -m "Site deployed by GitHub Actions"
        git push --force --quiet "https://$GH_TOKEN@$REPO" master:pages

注意:Deploy to Github Pages 步骤中有需要自行修改的内容。

3. 配置 Secrets

打开 Github 用户设置 Developer settings - Personal access tokens,点击 Generate new tokenExpiration 选择 no expiration(永不过期),下方勾选 repo 所有权限,然后点击 Generate token

把 token 复制下来。

打开仓库 Settings - Secrets - Actions,点击 New repository secretNameGH_TOKEN,然后把刚才复制下来的 token 粘贴到 Value 中。

4. 尝试 Commit

任意修改一个文件并提交,理论上博客就会自动被构建并发布到 pages 分支了。

5. 配置 Github Pages

点击仓库 Settings - PagesSourceBranch 选择 pages,并填写自定义域名,启用 https。(此处省略 Pages 配置过程)

这时候打开 Pages 发布的网站,可以顺利访问了。

EX. 发布到个人服务器

这里采用了 Rsync,保证在博客规模较大的时候也能在短时间内完成部署。在 Actions 脚本的最后加入:

- name: Deploy to server
  uses: easingthemes/ssh-deploy@v2.2.11
  env:
    SSH_PRIVATE_KEY: '${{ secrets.SSH_PRIVATE_KEY }}'
    ARGS: "-avz --delete"
    SOURCE: "public/"
    REMOTE_HOST: '${{ secrets.SERVER_IP }}'
    REMOTE_USER: 'root'
    TARGET: '(你的网站根目录,如 /www/wwwroot/akyuu-cn)'

注意:TARGET 中的内容需要修改为你自己的。

新建以下 Secrets:

  • SSH_PRIVATE_KEY - 用于连接服务器的 SSH KEY
  • SERVER_IP - 你的服务器 IP

然后进行一次 Commit,生成好的文件就会自动被上传到服务器网站根目录了。

如果遇到错误…

自己去 Actions 里看日志啦(被打