前言

最近由于工作需要所以研究了一下GitLab的CI/CD的功能,事后想起荒废了很久的博客,所以萌生了使用GitHub的Actions重新部署一下的想法,这里记录一下安装的过程。

环境说明

  1. 博客框架: Hexo
  2. 博客主题: Butterfly
  3. 托管环境: GitHub Pages
  4. 源程序仓库: 可以设置成私有仓库,用来保存原始文件
  5. 页面文件仓库: 用来存放编译后的页面文件
  6. 更新流程: 编写文章PUSH到源程序仓库,源程序仓库Actions触发预先定义的任务,编译后PUSH到页面文件仓库,页面文件仓库Actions触发默认的github-pages任务部署网页服务。

安装hexo并初始化项目

Hexo依赖于Node.js环境,所以需要先安装Node.js,对于Mac来说,可以去Node.js官网下载安装包也可以通过brew命令安装。还需要安装GIT环境,Mac OS默认已安装。

  1. 全局安装hexo-cli npm install -g hexo-cli
  2. 初始化一个名为blog的hexo工程 hexo init blog
  3. 安装依赖 cd blog && npm install
  4. 启动hexo服务 hexo server

安装主题

推荐通过git clone主题仓库到hexo的themes文件夹下,这样比较容易管理
执行命令git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly将主题butterfly安装到hexo的themes文件夹下。

建立源程序仓库

在GitHub建立源程序仓库,名称随意,可以设置成私有仓库,我这里取名为blog。

建立页面文件仓库

在GitHub建立页面文件仓库,如果想通过githubname.github.io访问,需要将仓库命名为githubname.github.io,如果没有这个需求,可以任意取名。

设置秘钥

需要在GitHub设置三个秘钥文件

SSH keys

添加Authentication Keys到GitHub的SSH keys,成功设置后可以免密执行git命令。

  1. ssh-keygen -t rsa -C "your.email@example.com" -b 4096,按提示生成秘钥,也可以一路无脑回车
  2. pbcopy < ~/.ssh/id_rsa.pub,拷贝公钥到SSH keys
  3. ssh -T git@github.com,测试是否可以通过认证。

源程序仓库的Actions secrets

添加私钥blog-deploy-key到源程序仓库的Actions secrets

  1. ssh-keygen -f blog-deploy-key,生成公私钥对
  2. pbcopy < ~/.ssh/blog-deploy-key,拷贝私钥到Actions secrets,命名为BLOG_DEPLOY_PRI

页面文件仓库的Deploy keys

添加公钥blog-deploy-key.pub到页面文件仓库的Deploy keys,切记勾选Allow write access ,设置成功后源程序仓库的Actions任务可以PUSH代码到页面文件仓库

  1. pbcopy < ~/.ssh/blog-deploy-key.pub,拷贝公钥粘贴到Deploy keys,命名为BLOG_DEPLOY_PUB

编写blog仓库的Actions文件

新建文件.github/workflows/deploy.yml,编写Actions任务。

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: CI

on:
push:
branches:
- main

env:
GIT_USER: xxx
GIT_EMAIL: xxx@xx.com
THEME_REPO: jerryc127/hexo-theme-butterfly
THEME_BRANCH: master
THEME: butterfly

jobs:
build:
name: Build on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest]
node_version: [18.x]

steps:
- name: Checkout
uses: actions/checkout@v2

- name: Checkout theme repo
uses: actions/checkout@v2
with:
repository: ${{ env.THEME_REPO }}
ref: ${{ env.THEME_BRANCH }}
path: themes/${{ env.THEME }}

- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node_version }}

- name: Configuration environment
env:
BLOG_DEPLOY_PRI: ${{secrets.BLOG_DEPLOY_PRI}}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$BLOG_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL

- name: Install dependencies
run: |
npm install

- name: Deploy hexo
run: |
npm run deploy

自定义主题配置

可以遵照官方建议操作

在 hexo 的根目錄創建一個文件 _config.butterfly.yml,並把主題目錄的 _config.yml 內容複製到 _config.butterfly.yml 去。( 注意: 複製的是主題的 _config.yml ,而不是 hexo 的 _config.yml)

如果某些主题不支持读取根目录下的配置文件,可以考虑使用根目录下的配置文件覆盖主题目录下的配置文件,只需要在Configuration environment任务最后添加cp _config.${{ env.THEME }}.yml themes/${{ env.THEME }}/_config.yml

当然主题可能出现破坏性升级,可以考虑不追踪最新的主题,自己手动更新主题文件,去掉上面的Checkout theme repo任务,并且将themes文件夹添加到git版本追踪中

设置hexo部署路径

在hexo的配置文件_config.yml中,补全设置deploy子参数

1
2
3
4
deploy:
type: git
repo: git@github.com:githubname/githubname.github.io.git
branch: main

以上涉及到的所有branch参数都需要一一对应,源程序仓库和页面文件仓库我都是使用的main分支,主题使用的master分支,按需修改即可,页面文件仓库的Pages也需要设置成对应的分支

参考链接

使用GitHub Actions部署Hexo博客
利用 Github Actions 自动部署 Hexo 博客