更新记录

更新记录

2021-06-11

hexo-CI自动部署:基于Github Pages+Github Actions

hexo-CI自动部署

构建说明

​ hexo博客项目已经构建有好一段时间了,一般都是直接通过指令进行发布,为了适配在不同地方编辑笔记快速直接发布可采用CI的方式进行自动部署,此处介绍的是通过GitHab Actions+Github Pages的方式进行发布(分仓库存储:用于区分版本源文件管理&网站发布版本管理),随后则可直接通过typora编辑md文件并上传到指定仓库路径,自动部署网站内容

Github Page:是github网站提供的静态网站服务

travis: 是在线托管的CI服务,用Travis来进行持续集成,参考文章

github Actions:借助Github原生CI/CD构建自动部署

  • 原有hexo部署三连:

​ 原有构建思路:A仓库管理源码提交信息、B仓库管理构建后的代码版本信息

1
hexo clean & hexo g & hexo deploy
  • 分支推送+CI自动部署

​ 基于上述思路是将source和发布仓库进行分离,可考虑在源码仓库下借助github pages+CI自动集成部署环境,构建工作流部署信息(可同源仓库发布或者跨仓库发布)

    CI\CD概念:「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」、「持续部署(Continuous Deployment)」
1
2
3
# 本地编辑文件推送到指定的分支

# 构建CI环境自动部署

1.github Actions 跨仓库发布

​ 在源码仓库构建配置文件:.github/.workflows/autoDeploy.yml

  • action设计思路:
1
2
3
a.拉取指定分支代码(gh-pages)
b.设定node.js环境、构建项目模块依赖缓存
c.服务器验证并执行指令部署
  • action配置参考

​ 可先从Github Actions仓库、Github Marketplace中搜索可用的Actions,在此基础上造轮子

构建配置参考

  • 采用SSH方式推送指定仓库,通过指令生成新的SSH秘钥
1
2
# 在当前目录生成hexo-deploy-key私钥文件和hexo-deploy-key.pub公钥文件
ssh-keygen -f hexo-deploy-key -C "username.github.io"

​ A仓库存储源文件内容,B仓库存储发布内容,则在B仓库中配置公钥文件,A仓库中配置私钥文件

​ B仓库配置:Settings -> Deploy keys -> 添加Deploy key -> 填充 hexo-deploy-key.pub文件内容,勾选Allow write access配置

​ A仓库配置:Settings -> Secrets -> Actions -> 添加属性配置HEXO_DEPLOY_KEY_PRI,填充hexo-deploy-key私钥文件内容

  • autoDeploy.yml文件编辑

​ 其构建原理为监听指定分支变化,通过checkout分支、访问目录、部署环境并执行hexo三连。除却github仓库访问权限,其他相关的配置均引用代码中的内容(和本地发布操作一样,只不过是让机器替代执行)

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
59
60
61
62
63
64
# 文件路径 .github/workflows/autoDeploy.yml
name: CI自动部署

on:
push:
branches: [dev] # 当push指定分支操作触发时执行自动部署

jobs:
hexo-deployment:
runs-on: ubuntu-latest
env:
TZ: Asia/Shanghai

steps:
- name: 1.checkout分支
uses: actions/checkout@v2
with:
ref: dev

# 如果主题不是通过git submodule方式引入则不需要配置
- name: extend:Checkout主题仓库
uses: actions/checkout@v2
with:
repository: holic-x/hexo-theme-butterfly # 主题仓库位置(可以指向自己fork的项目)
ref: dev-custom # 拉取分支
path: themes/butterfly # 拉取内容到指定位置

- name: 2.node环境安装
uses: actions/setup-node@v1
with:
node-version: '12.x'

- name: 3.缓存 Hexo 模块,提高构建速度
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}

- name: 4.安装依赖
if: steps.cache.outputs.cache-hit != 'true'
run: |
npm install --save

- name: 5.服务器验证
env:
ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY_PRI }}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts # 填写服务器IP(如果是自建Git仓库则填写相应的服务器IP)

- name: 6.三连操作部署
env:
BAIDU_TOKEN: ${{ secrets.BAIDU_TOKEN }} # 设置环境变量BAIDU_TOKEN
BING_TOKEN: ${{ secrets.BING_TOKEN }} # 设置环境变量BING_TOKEN
GIT_NAME: ${{ secrets.GIT_NAME }}
GIT_EMAIL: ${{ secrets.GIT_EMAIL }}
run: |
git config --global user.name ${GIT_NAME} # GitHub用户名
git config --global user.email ${GIT_EMAIL} # GitHub用户名邮箱
npx hexo clean && npx hexo g && npx hexo deploy

或者可以直接引用现成的轮子:

​ a.部署到Github Pages:theme-keep/hexo-deploy-github-pages-action

​ b.部署到阿里云、腾讯云服务器:easingthemes/ssh-deploy

  • 检查_config.yml文件

​ 部署内容格式参考如下所示

1
2
3
4
5
6
deploy:
type: git
repository: git@github.com:username/username.github.io.git
branch: master
name: username
email: username@gmail.com

2.CI引入自动提交URL至搜索引擎

​ 结合hexo-submit-urls-to-search-engine插件,参考SEO优化说明

​ 在Settings->Secrets->Actions中配置属性,随后添加一个步骤用于发布

参数 说明
BAIDU_TOKEN 根据文档指示生成
BING_TOKEN 根据文档指示生成
  • 部署操作部分配置环境变量
1
2
3
4
5
6
7
8
9
10
- name: 6.三连操作部署
env:
BAIDU_TOKEN: ${{ secrets.BAIDU_TOKEN }} # 设置环境变量BAIDU_TOKEN
BING_TOKEN: ${{ secrets.BING_TOKEN }} # 设置环境变量BING_TOKEN
GIT_NAME: ${{ secrets.GIT_NAME }}
GIT_EMAIL: ${{ secrets.GIT_EMAIL }}
run: |
git config --global user.name ${GIT_NAME} # GitHub用户名
git config --global user.email ${GIT_EMAIL} # GitHub用户名邮箱
npx hexo clean && npx hexo g && npx hexo deploy