How to auto deploy Hexo site to GitHub pages via Github Actions

缘起

业界良心的谷歌云(gcp)让我给玩儿坏了呀,原本这一期还没结束(应该到年底),可我的 300 刀的免费额度一个月前就已经花光了,于是乎,我的服务被停掉了。数据都没能机会拉取下来。

这样的话,给我自己折腾了进二十年的博客一个新的归宿又马上变成了火烧眉毛的事情了,早先其实一直在关注 GitHub Actions,而且也早就有申请,所以就乘着这个机会,把博客源文件、网站(静态内容)全都放在 GitHub(GitHtb Pages 服务) 上吧,同时还顺带用一下 GitHub Actions 来做自动构建、部署。

具体步骤

本地部署到 GitHub Pages

这一步要达到的目标就是:

  • 本地能写文章
  • 并能 deploy 到 GitHub 上去(需要关注 hexo deploy github 这个的配置方法)
  • [username].github.io 下能访问到

GitHub Pages

  • 登录 GitHub
  • 新建一个 “Repository name” 叫 [username].github.io 的 repository
    • “[username]” 为你 GitHub 的帐号,我的例子中,叫:haw-haw.github.io
    • 权限设置为:Public

本地 hexo

  • 本地需要安装配置好 nodejs、hexo、相关 theme,还有一些插件,等等,都要弄好
  • 还要配置好能用 git push 东西到 GitHub 上自己的 repository 里,这步如果不会,请自行去查文档

总之,要做到

1
hexo -d 

能把

1
hexo -g 

生成的静态内容部署到 GitHub Pages 上去

准备部署密钥对

本地上执行:

1
2
3
4
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/github-actions-deploy;
# 这里的 "haw-haw" 替换成你自己在 GitHub 上的帐号名
# 执行这个命令以后,本地 ~/.ssh/ 目录下会有两个文件:github-actions-deploy 和 github-actions-deploy.pub
# 分别是用来 deploy 时用的公私钥密钥对。这个在后面会用到

源代码私仓 hexo

在 GitHub 上建一个新的 repository

  • Repository name 任取(这里假设是 hexo)
  • 权限为 Private 的 repository
  • 不要选中 “Initialize this repository with a README”
  • 不要 Add .gitignore
  • 不要 Add a license

本地源代码提交到 hexo

  • 克隆空私仓:hexo 到本地
  • 将源文件目录下的内容有选择的添加到私仓 hexo 的本地目录下
    • public 目录不要(因为构建时会生成 public 目录下的东西)
    • node_modules 目录不要(因为在准备构建环境时会自动安装这些需要的模块的)
  • 将准备好的源代码目录内容推送到 hexo 私仓

配置好部署密钥对

私钥到 hexo

叫 “hexo” 的私仓建好以后,点进去,点击 Settings–>Secrets–>”Add a new secret”

  • 在 Name 框里填入:GH_ACTION_DEPLOY_KEY
  • 在 Value 框里填入本地文件 ~/.ssh/github-actions-deploy 的内容(注意:是文件内容!)

公钥到 haw-haw.github.io

进入名为 “haw-haw.github.io”(用你的用户名来取代 “haw-haw”) 的 Repository

  • 点击 Settings–>”Deploy keys”–>”Add deploy key”
  • Title 随意填
  • Key 框里填本地文件 ~/.ssh/github-actions-deploy.pub(注意:带 “.pub”) 的内容

GitHub Actions

在 hexo 私仓下新建文件:.github/workflows/hexo.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
name: Main workflow

on:
push:
branches:
- master

jobs:
build:

runs-on: ubuntu-18.04

steps:
- uses: actions/checkout@v1
- name: Use Node.js 10.x
uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: prepare build env
env:
GH_ACTION_DEPLOY_KEY: ${{secrets.GH_ACTION_DEPLOY_KEY}}
NEXT_VERSION: v7.3.0
run: |
mkdir -p ~/.ssh/
echo "$GH_ACTION_DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name 'haw-haw'
git config --global user.email '[email protected]'
npm i -g hexo-cli
npm i
- name: deploy to github
run: |
hexo generate && hexo deploy

以上就是我正在用的配置,其实基本上都是来自于 GitHub 官方的 node 的 workflow 的配置,所以具体也没什么细讲的,这里只提一个点:

1
tr -d '\r' > ~/.ssh/id_rsa;

上面这一句,如果是你在部署是碰到 id_rsa 的文件格式错误的问题,那么这一句就是解决这个问题的。

常规使用方法

本地使用

  • clone 私仓 hexo 到本地
  • 本地在目录 source/_posts/ 下编辑新的文件
  • 提交到本地
  • push 到远端(GitHub 私仓 hexo 的 master 分支),触发构建、部署

在线使用

在 web 端进入私仓 hexo 的 master 分支的 source/_posts/ 目录下新建文件并编辑,完成后 commit,触发构建部署(这种方式不推荐,因为也许会太频繁的触发构建)

进阶

推荐使用方法

新开一个分支:draft,然后再在这个分支上做操作(修改也好、新建也好),无论是本地,还是在线,都不会触发构建(因为 GitHub Action 只在 master 下才有效),修改新建文章完毕,再 merge 到 master 分支,进而会触发 GitHub Action 自动构建、部署。

定制域名

如果你在 GitHub Pages 上是使用的自定义域名,而不是像我这样 haw-haw.github.io 的域名(实际上我也是自定义的域名:),那么你需要在 hexo 的 master 分支的 source/ 放一个叫 CNAME 的文件,里面写上你的自定义域名,比如我的:ming.theyan.gs。否则,每次部署,你的自定义域名配置都会被清掉!

限制

  • GitHub Actions 目前还是 beta 状态,使用也还需要申请
  • 对于私仓,GitHub Actions 超过每月 2000 分钟的时间是要收费的。
    我现在不到 40 篇文章,每次构建一分钟出头,如果按两分钟算,一个月可以构建 1000 次,每天可以构建 33 次,感觉怎么都够了。