利用 Github Actions 自动部署 Hexo 博客
1、介绍
Github Actions 可以很方便实现 CI/CD 工作流,类似 Travis 的用法,来帮我们完成一些工作,比如实现自动化测试、打包、部署等操作。
当我们运行 Jobs 时,它会创建一个容器 (runner),容器支持:Ubuntu、Windows 和 MacOS 等系统,在容器中我们可以安装软件,利用安装的软件帮我们处理一些数据,然后把处理好的数据推送到某个地方。
本文介绍利用 Github Actions 实现自动部署 hexo 到 Github Pages,在之前我们需要写完文章执行 hexo generate --deploy 来部署,当你文章比较多的时候,可能还需要等待很久,而且还可能会遇到本地安装的 Node.js 版本与 Hexo 不兼容的问题,利用 Github Actions 你将会没有这些烦恼。
2、步骤
2.1、创建所需仓库
- 创建
blog仓库用来存放 Hexo 项目 - 创建
your.github.io仓库用来存放静态博客页面- 在
settings -> Pages的branch中增加master分支。
- 在
2.2、生成部署密钥
执行下列命令,然后一路按回车直到生成成功
1 | |
当前目录下会有 github-deploy-key 和 github-deploy-key.pub 两个文件。
2.3、配置部署密钥
复制
github-deploy-key文件内容,在blog仓库Settings -> Secrets and variable -> actions -> New repository secret页面上添加。- 在
Name输入框填写HEXO_DEPLOY_PRI。 - 在
Value输入框填写github-deploy-key文件内容。
- 在
复制
github-deploy-key.pub文件内容,在your.github.io仓库Settings -> Deploy keys -> Add deploy key页面上添加。- 在
Title输入框填写HEXO_DEPLOY_PUB。 - 在
Key输入框填写github-deploy-key.pub文件内容。 - 勾选
Allow write access选项。
- 在
3、编写 Github Actions
3.1、Workflow 模版
在 blog 仓库根目录下创建 .github/workflows/deploy.yml 文件,目录结构如下。
1 | |
在 deploy.yml 文件中粘贴以下内容。
1 | |
3.2、模版参数说明
name: 为此 Action 的名字on: 触发条件,当满足条件时会触发此任务,这里的on.push.branches.$.master是指当master分支收到push后执行任务。env: 为环境变量对象env.GIT_USER: 为 Hexo 编译后使用此 git 用户部署到仓库。env.GIT_EMAIL: 为 Hexo 编译后使用此 git 邮箱部署到仓库。env.THEME_REPO: 为您的 Hexo 所使用的主题的仓库,这里为sanonz/hexo-theme-concise。env.THEME_BRANCH_: 为您的 Hexo 所使用的主题仓库的版本,可以是:branch、tag 或者 SHA。env.DEPLOY_REPO: 为 Hexo 编译后要部署的仓库,例如:sanonz/sanonz.github.io。env.DEPLOY_BRANCH: 为 Hexo 编译后要部署到的分支,例如:master。
jobs: 为此 Action 下的任务列表jobs.{job}.name: 任务名称jobs.{job}.runs-on: 任务所需容器,可选值:ubuntu-latest、windows-latest、macos-latest。jobs.{job}.strategy: 策略下可以写array格式,此 job 会遍历此数组执行。jobs.{job}.steps: 一个步骤数组,可以把所要干的事分步骤放到这里。jobs.{job}.steps.$.name: 步骤名,编译时会会以 LOG 形式输出。jobs.{job}.steps.$.uses: 所要调用的 Action,可以到 https://github.com/actions 查看更多。jobs.{job}.steps.$.with: 一个对象,调用 Action 传的参数,具体可以查看所使用 Action 的说明。
3.3、第三方 Actions
使用第三方 Actions 语法 {owner}/{repo}@{ref} 或者 {owner}/{repo}/{path}@{ref} 例如:
调用
actions/checkout@v2Checkout 一个 git 仓库到容器。with.repo不填写默认为当前仓库。1
2
3
4
5
6
7
8jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
# with:
# repository: ${{ github.repository }}Checkout 第三方仓库
git@github.com:sanonz/hexo-theme-concise.git的master分支到容器themes/concise目录。1
2
3
4
5
6
7
8
9jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- with:
repository: sanonz/hexo-theme-concise
ref: master
path: themes/concise调用
actions/setup-node@v1可以配置容器 Node.js 环境。with.node-version可以指定 Node.js 版本。1
2
3
4
5
6
7jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v1
- with:
node-version: v12执行
npm run deploy进行部署。1
2
3
4
5
6
7jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Deploy hexo
run: |
npm run deploy
可以在这里查找更多 Actions 以及使用方式 官方 Actions 市场。
4、自己试试
写一篇文章,push 到 blog 仓库的 master 分支,在此仓库 Actions 页面查看当前 task。当任务完成后查看您的博客 https://your.github.io,如果不出意外的话已经可以看到新添加的文章了。
5、报错
Host key verification failed. fatal: Could not read from remote repository.
报错如下:
1 | |
解决:
- 出现此问题请检查
站点配置文件,看 deploy 是否存在出 GitHub 以外的仓库,如 gitee。- 解决方式:去除 GitHub 以外的仓库。