Github Action 自动化部署Hexo

什么是Github Action

Github ActionsGithub推出的一个新的功能,可以为我们的项目自动化地构建工作流,例如代码检查,自动化打包,测试,发布版本等等。入口在项目pull request的旁边。

一次无意中查看到阮一峰大神博客中提到的Github Action,平常一般玩过的是Jenkins。看到可以将React项目自动部署到Github Page时,灵感就想到了自己的基于Hexo搭建的博客来实现一下自动部署。查了一下资料,的确可以实现的。

该文章不涉及Github Action以及Hexo的教学。请自行查阅

部署前准备

先准备两个仓库,一个是部署博客所产出静态页面(github page)的仓库,一个是博客所有源文件的仓库

在本地生成一个 key:

1
$ ssh-keygen -t rsa -b 4096 -C "your email" -f ~/.ssh/github-actions-deploy

(也可以生成其他种类的 key,如果用上面的命令,需要修改一下用户名) 回车完成即可

查看私钥和公钥

1
2
3
$ cd ~/.ssh
$ cat github-actions-deploy
$ cat github-actions-deploy.pub

在博客所有源文件的仓库Settings -> Secrets 里添加刚刚生成的私钥,名称为 ACTION_DEPLOY_KEY

然后在 Github Pages 的仓库,Settings -> Deploy keys 添加刚刚生成的公钥,名称随意,但要勾选 Allow write access

添加Github Action

可以在网页上 Actions 里编辑配置文件,也可以直接在源文件的仓库的本地目录添加直接 commit。

本文直接在源文件的仓库的本地目录提交配置文件,将配置文件存至原文件仓库目录下的 .github/workflows/*随便起名*.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
name: Deploy

on:
push:
branches:
- master

jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: prepare build env
env:
ACTION_DEPLOY_KEY: ${{ secrets.ACTION_DEPLOY_KEY }}
run: |
# set up private key for deploy
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
# set git infomation
git config --global user.name 'hackycy'
git config --global user.email 'qa894178522@qq.com'
- name: clone
run: git clone https://github.com/hackycy/hackycy.github.io.git .deploy_git
- name: NPM
run: npm install
- name: Clean
run: ./node_modules/.bin/hexo clean
- name: Generate
run: ./node_modules/.bin/hexo generate
- name: Deploy
run: ./node_modules/.bin/hexo deploy

对这个配置文件做几点说明:

  1. Actions 在早期测试时用的是 HCL 格式,而现在使用 YAML 配置,HCL 格式配置文件已被废弃。YAML 格式需要严格按照缩进。
  2. on 标注什么事件会触发这个 workflow,可以指定 branches,详情参考文档
  3. runs-on 设置运行平台,目前有 Windows、Ubuntu、macOS,见文档
  4. uses 是使用打包好的 action,可以通过 with 传参数。官方提供了一些 Git 基本操作和环境安装的包,也可以使用 Docker。
  5. env 可以设置这一步的环境变量,这一步设置的变量不会继承到下一步。刚才设置的私钥可以通过 $ 获取到,具体见文档。另外直接将密钥 echo 出来会被打码 :)
  6. 在网页上保存私钥很可能会把 key 存成 CR-LF 换行模式的,而私钥文件要求 LF 模式,要用 tr -d '\r' 去掉回车符。
  7. Git 配置请更改为自己的。
  8. 由于我的博客源仓库配置了Submodule,如果没有配置的请直接删除step name为clone的步骤

自动构建

每当你写完博客是直接提交到源仓库即可自动触发构建。会配合Action自动发布到Github Page仓库。

注意事项

如果博客中配置了主题,请注释掉主题下的.gitignore的一些配置,例如本人使用的Next主题

以及配合主题安装的第三方插件,有一些插件通过Git clone安装时不会上传到源文件仓库,需要手动删除掉插件目录下的.git文件夹。

参考资料

http://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html

https://xiaopc.org/2019/08/29/github-actions-%E6%B5%8B%E8%AF%95-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2-hexo/

https://hateonion.me/posts/20feb22/

坚持技术分享,您的支持将鼓励我继续创作!