本文参考

Hexo 部署

在Hexo中,以往的部署通常都需要通过命令

1
2
3
hexo clean # 清空静态页面(public文件夹)
hexo g # 创建静态页面
hexo d # 发布页面:清空.deploy_git/里文件,从public/复制新生成的文件

在实现自动部署之前,hexo博客必须能够成功运行以上代码并成功部署

实现自动部署

生成ssh密钥文件

在任何位置的git bash窗口中运行

1
ssh-keygen -t rsa -b 4096 -C "Hexo Deploy Key" -f github-deploy-key -N ""

会在当前目录生成两个文件

  • github-deploy-key —— 私钥
  • github-deploy-key.pub —— 公钥

创建私人仓库(用于部署)

在GitHub中创建repositories,名字随意取,选private,其他勾不勾无所谓
然后在你的博客文件夹根目录(不是themes目录)运行

1
git init

将整个博客文件夹变成一个git管理的仓库
依次运行

1
2
3
4
5
git add . # 将所有文件夹加入到暂存区(这里需要删除themes中的.git文件夹,否则themes文件夹不会被加入暂存区)
git commit -m 'the initial edition' # 提交暂存区
git remote add origin https://github.com/usrname/usrname.git # 与仓库关联
git pull #拉取仓库比较内容,放心不会覆盖本地文件
git push -u origin master

现在看你的私人仓库,文件内容应该和你的工作区(本地博客文件夹)是一致的(本地的.deploy_git可以直接删除)

配置密钥

配置私钥

  • 在上面的创建的私人仓库中访问Settings -> Secrets,New secret
  • 在name中填写HEXO_DEPLOY_KEY,将私钥文件github-deploy-key中的内容全部复制进来

配置公钥

  • 在你的博客仓库(存放html静态页面的仓库),一般为name.github.io中访问Settings -> Deploy keys,Add deploy key
  • 在name中填写HEXO_DEPLOY_PUB,将公钥文件github-deploy-key.pub中的内容全部复制进来
  • 勾选Allow write access

创建触发自动部署的脚本

两种方法

  • 直接在私人仓库中添加文件(路径为.github/workflows/deploy.yml),然后再pull到本地;
  • 直接在本地工作区添加文件(路径为.github/workflows/deploy.yml),然后再push到仓库;

我这里选用了方法一

  • 在私人仓库添加文件(路径为.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
    37
    38
    39
    40
    41
    name: Hexo Deploy

    on:
    push:
    branches:
    - master

    jobs:
    build:
    runs-on: ubuntu-18.04
    if: github.event.repository.owner.id == github.event.sender.id

    steps:
    - name: Checkout source
    uses: actions/checkout@v2
    with:
    ref: master

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

    - name: Setup Hexo
    env:
    ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }}
    run: |
    mkdir -p ~/.ssh/
    echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_rsa
    ssh-keyscan github.com >> ~/.ssh/known_hosts
    git config --global user.email "email@xx.com"
    git config --global user.name "usrname"
    npm install hexo-cli -g
    npm install

    - name: Deploy
    run: |
    hexo clean
    hexo deploy

    将上面的email和usrname改为你自己的邮件路径和名字
    上面的推送脚本就是说只要本地的工作区有内容push到私人仓库中,就会执行hexo clean和hexo deploy

  • 然后将这个文件夹pull到本地

    1
    git pull origin master

    如果没有成功把workflow文件夹pull到本地,可以尝试

    1
    git pull -f origin master # 强制拉取

    如果不进行拉取同步,那么在后续push的时候也会报错,因为你私人仓库和本地仓库内容不同步。

测试

知道了原理,你可以在本地中修改任意文件,然后执行

1
git push origin master

成功push之后,就是自动触发GitHub Actions中的脚本,执行编译和部署(如果失败的话),GitHub就会给你发邮件。