Hexo 相关知识点

静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步:

1
2
hexo clean
hexo g -d // 相当于 hexo g + hexo d

如果考虑到同步源文件,还需要每次更改后,将源文件 push 到指定仓库:

1
git push origin main

我们可以将 Hexo 文件分为两类,一类是源文件,即下面这些文件:

1
2
3
4
5
6
7
8
.
├── _config.yml
├── package.json
├── scaffolds
├── source
| ├── _drafts
| └── _posts
└── themes

一类是 public 文件,即网站文件:

1
2
3
4
5
public
├── 2020
├── categories
├── tags
....

发布博文的这三个操作代表:

  • hexo clean:删除网站(public)文件
  • hexo g:生成网站(public)文件
  • hexo d:将本地网站(public)文件同步到指定仓库(如:yourname.github.io)中

我使用一个私有仓库存放 Hexo 源文件,在 deppwang/deppwang.github.io 中存放网站文件。所以每次发布或者更新博文时,需要使用 push 操作更新源文件,再执行 hexo cleanhexo g -d 更新博客,比较麻烦,而且github在国内经常登录不上。

所以我们希望能在 push 源文件后,由 CI/CD(持续集成/持续部署)工具为我们执行 hexo cleanhexo g -d 这两个操作。

Image result for github action

GitHub Actions

CI/CD 工具前有 Travis CI,现有 GitHub Actions,这里使用 GitHub Actions。

GitHub Actions 的工作原理:我们提前设置好需要自动化执行的任务,GitHub Actions 监控当前仓库的某一个操作(如:push),一旦有此操作,就自动化执行这些任务。

所以我们希望使用 GitHub Actions 后,只需要往源文件仓库 push 更新源文件,GitHub Actions 监控到 push 操作时,就自动化执行 hexo cleanhexo g -d 操作,完成博文发布。

Action 存放在项目根目录的 .github/workflows 下,后缀为 .yml。一个 Action 相当于一个工作流 workflow,一个工作流可以有多个任务 job,每个任务可以分为几步 step。任务、步骤依次执行。

每个 Action 是一个独立脚本,所以可以作为代码仓库。

  • actions/setup-node 就表示 github.com/actions/setup-node 这个 仓库,代表安装 node.js。Action 为 action.yml

可以通过下面这种格式来使用别人写好的 action,@借用了指针的概念:

1
2
3
actions/setup-node@74bc508 # 指向一个 commit
actions/setup-node@v1.0 # 指向一个标签
actions/setup-node@master # 指向一个分支

关于 GitHub Actions 更多知识,请看 GitHub Actions 入门教程 - 阮一峰

现在需要实现一个 Action,使其能够执行 hexo cleanhexo g -d 操作。

Image result for hexo action

Hexo Action

非第一次生成 SSH Key:

1
ssh-keygen -t 

将生成的 public key 作为网站文件仓库 Settings > Deploy Keys 的 Deploy Key。Deploy Keys 中的公钥针对于当前仓库。

image-20211219145647038

将生成的 private key 作为 Hexo 源文件仓库 Settings > Secrets 的 一个名叫 DEPLOY_KEYSecret。注意:需要复制包括 -----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY----- 的整个内容。Secret 相当于一个变量,可以使私有变量不公开。

image-20211219145921537

为什么要用 SSH Key?

  • SSH Key,是一对密匙:公钥+私钥,用于加密本地仓库和远程仓库的传输内容。是非对称加密,可公钥加密、私钥解密;或私钥加密、公钥解密。
  • 使用 GitHub Actions 是借助 GitHub 提供的环境,跟本地环境一样,也需要有私钥。当 GitHub Action 执行 hexo g -d 时,用私钥 DEPLOY_KEY 加密,GitHub 用网站文件仓库的 Deploy Key 进行验证。

创建 workflow

在私人代码仓库里点 Actions
然后创建一个新文件 .github/workflows/deploy.yml
deploy 名字可以自取但是一定要放在.github/workflows目录中

image-20211219150406411

  • 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:
- main

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 "改成你的邮箱"
git config --global user.name "改成你的用户名"
npm install hexo-cli -g
npm install

- name: Deploy
run: |
hexo clean
hexo deploy

发布成功

之后只要修改文章后将源码推送到github仓库,就可以在Action中看到自动编译发布的过程。

image-20211219150757637

可能出现的问题:Deploy 失败

可能出现以下 3 三种情况:

1、

image-20200215220503185

1
2
Host key verification failed
fatal: Could not read from remote repository.

出现此问题请检查 站点配置文件,看 deploy 是否存在出 GitHub 以外的仓库,如 Coding 。

解决方式:去除 GitHub 以外的仓库。

2、

image-20200215220635619

1
2
3
Load key "/root/ssh/id_rsa": invalid format
gitagithub.com: Permission denied (publickey)
fatal: Could not read from remote repository.

出现此问题请检查 SSH Key,看 Private Key 是否正确且完整的复制

3、

image-20200216183926423

1
2
ERROR Local hexo not found in /github/workspace
ERROR Try running: 'npm install hexo --save'

解决方式:将 uses: sma11black/hexo-action@v1.0.0 改为 uses: deppwang/hexo-aciton@v1.0.1@v1.0.1entrypoint.shhexo g -d 前添加了命令 npm install hexo --save