Hexo 的自动部署

作为一种静态博客,Hexo 的每一次更新都要在本地执行 hexo cleanhexo d -g 等命令。那么,有什么办法可以简化这些过程呢?
把命令合成一个脚本或许是一个选择,但更好的方案是使用服务于 DevOps 的公共 CI/CD 服务。

使用这些服务并不复杂,总的来说可以概括为以下几步:

  1. 登陆平台
  2. 根据需要填写机密信息(即 Secrets),如 GitHub TokenSSH Keygen
  3. 编写配置文件并放在指定位置

对于不同的需求,配置文件也不完全相同。我的需求是通过 Hexo 本身的 deploy 部署到 GitHub 仓库,在通过手动追加 tag 实现 jsDelivr 的全站加速。
我使用的是 NexT 主题,配置文件中关于静态资源的设定如下,会在生成过程中通过 sed 替换为具体的版本(XX_TAG 变量)。

1
2
3
4
# Assets
css: //cdn.jsdelivr.net/gh/ljcbaby/ljcbaby.github.io@master/css
js: //cdn.jsdelivr.net/gh/ljcbaby/ljcbaby.github.io@master/js
images: //cdn.jsdelivr.net/gh/ljcbaby/ljcbaby.github.io@master/images

GitHub Actions

由 GitHub 提供的服务,仅支持 GitHub 内的仓库,将 YAML 格式的配置文件放在 git_root/.github/workflows/ 下,当仓库被 push 的时候便会自动匹配执行。

参考配置文件

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
name: deploy # Actions 名字

on: # 触发条件
push:
branches: [ master ] # 仅向 master 分支 push 时触发,该分支存放博客源文件

jobs:
build: # job id
name: Build and publish # job 名,不写默认使用 job id
runs-on: ubuntu-latest # 运行环境,可选 ubuntu-latest, ubuntu-18.04, ubuntu-16.04, windows-latest, windows-2019, windows-2016, macOS-latest, macOS-10.14

steps:
- uses: actions/checkout@v1 # 拉取博客最新源文件
with:
submodules: true

- name: Install Node.js # 指定 Node.js 版本
uses: actions/setup-node@v2
with:
node-version: '14'

- name: Setup Hexo env # 初始化 Hexo 环境
run: |
npm install hexo-cli -g
npm install

- name: Pre-Generate # 初始化 其他 环境
env:
GH_TOKEN: $
run: |
export TZ='Asia/Shanghai'
export ACTION_TAG=v2.1.$.$(git log --format=%h -1)
git config --global push.default matching
git config --global user.name "github-actions[bot]"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
sed -i "s~git@github.com:ljcbaby/ljcbaby.github.io.git~https://${GH_TOKEN}@github.com/ljcbaby/ljcbaby.github.io.git~" _config.yml
sed -i "s/ljcbaby.github.io@master/ljcbaby.github.io@${ACTION_TAG}/g" _config.next.yml

- name: Generate public files # 生成博客预发布文件
run: |
hexo clean
hexo g

- name: Deploy # 发布 这段我按照自己的多点发布做了调整
env:
GH_REF: github.com/ljcbaby/ljcbaby.github.io.git # GitHub 仓库 SSH 地址
run: |
export TZ='Asia/Shanghai'
export ACTION_TAG=v2.1.$.$(git log --format=%h -1)
git clone --depth 1 https://${GH_REF} .deploy_git
hexo d
cd .deploy_git
git tag $ACTION_TAG
git push --tags
cd ..
rm -f _config.yml
mv _config2.yml _config.yml
hexo d

Travis CI

这家比较特别,有 Travis CI.orgTravis CI.com 之分。前者免费但不支持 GitHub 的私有库,后者收费(GitHub 的学生包可以白嫖)。配置文件为 git_root 下的.travis.yml

目前官方发布了公告,将 travis-ci.org 合并到了 travis-ci.com ,以后就只有一个 travis-ci 了。

参考配置文件

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
42
43
os: linux

dist: bionic

language: node_js

node_js:
- 'lts/*'
# - 'stable'

script: "true"

branches:
only:
- master

addons: # Travis CI建议加的,自动更新api
apt:
update: true

cache:
directories:
- node_modules

before_install:
- export TZ='Asia/Shanghai'
- export TRAVIS_TAG=v1.0.$TRAVIS_BUILD_NUMBER.$(git log --format=%h -1)
- git config --global push.default matching
- git config --global user.name "Travis CI"
- git config --global user.email "bot@travis-ci.org"
- sed -i'' "s~git@github.com:ljcbaby/ljcbaby.github.io.git~https://${Travis_Token}:x-oauth-basic@github.com/ljcbaby/ljcbaby.github.io.git~" _config.yml
- sed -i "s/ljcbaby.github.io@master/ljcbaby.github.io@${TRAVIS_TAG}/g" _config.next.yml

install:
- npm install hexo-cli --save
- npm install

deploy:
skip_cleanup: true
provider: script
script: sh deploy.sh
on:
branch: master

其中 deploy.sh 如下

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
#!/bin/bash

if [ -d "./.deploy_git" ]; then
echo "Removing .deploy_git folder..."
rm -rf ./.deploy_git
echo "Folder removed."
fi

# Initialize target with currently deployed files
git clone --branch=master https://github.com/ljcbaby/ljcbaby.github.io.git .deploy_git

cd .deploy_git

# Remove all files before they get copied from ../public/
# so git can track files that were removed in the last commit
find . -path ./.git -prune -o -exec rm -rf {} \; 2> /dev/null

cd ../

if [ ! -d "./public" ]; then
hexo generate
fi

# Run deployment
hexo deploy

cd .deploy_git
git tag $TRAVIS_TAG
git push --tags

这份配置的生成参考了以下内容
使用 jsDelivr 为 Hexo 博客提供高效免费的 CDN 加速 - 一个人的孤落时辰
A1exInamin.github.io/deploy.sh at hexo · A1exInamin/A1exInamin.github.io

Gitee Pages 服务

唯一的缺点是每次更新博客要手动部署一次,只有付费的 Gitee Pages Pro 才能自动更新 Pages 。

然而付费的 Gitee Pages Pro 似乎已经买不到了。

Jenkins

Gitee 和 GitLab 可以使用这家 CI ,和 Travis CI 类似。

低代码托管平台

低代码平台,顾名思义,不需要大段代码
相比之前要写生成文件的基本是要简单多了。
当然,想要用得好,可以自己写 Shell