目前部署 Hexo 的操作比较麻烦,先在本地执行 hexo clean && hexo d 生成博客静态文件并发布到 GitHub 上,然后通过 XShell 登录到服务器,切换到博客站点目录下 git pull 拉取最新的代码,最近网络也不太不稳定,拉取代码也经常超时,更新的时候还得看运气。
有两种方案可以自动更新:GitHub WebHook 和 GitHub Actions。
WebHook 是一种比较简单且常见的方式,在仓库配置一个回调地址并指定需要回调的事件类型即可。
比如指定了 push 事件,往该仓库 push 代码时,GitHub 就会请求配置的回调地址并携带一些信息,通过这些信息就可以检查请求是否合法、是哪个仓库的谁提交了代码,从而决定是否需要更新服务器端的代码。
详情可以看官方的文档:https://docs.github.com/cn/developers/webhooks-and-events/about-webhooks
Actions 是 GitHub 新推出来(快两年,也不算新了)的一种持续集成的方案,将上面这些操作变成一个个的任务(Job)组成工作流,当发生指定事件后触发该工作流,也可以用别人写好的工作流。
更详细的内容可以看 官方文档 和阮老师的 GitHub Actions 入门教程。
话不多说,直接贴 GitHub Actions 的配置。
# 工作流的名称
name: Hexo Blog CI
# 指定触发的条件,这里是打标签才触发该工作流,你也可以改成 on: push,只要提交代码就触发
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
# 检查工作流是否可以访问 actions
- name: Checkout Repository master branch
uses: actions/checkout@master
# 安装 NodeJs
- name: Setup Node.js 12.x
uses: actions/setup-node@master
with:
node-version: "12.x"
# 安装 Hexo 的依赖库
- name: Setup Hexo Dependencies
run: |
npm install hexo-cli -g
npm install
# 设置 Hexo 部署的私钥
- name: Setup Deploy Private Key
env:
HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
# 设置 Git 信息
- name: Setup Git Infomation
run: |
git config --global user.name "Git 用户名"
git config --global user.email "Git 邮箱"
# 部署 Hexo 静态文件到博客所在的分支
- name: Deploy Hexo
run: |
hexo clean
hexo generate
hexo deploy
# 部署到服务器
- name: Deploy Server
uses: appleboy/ssh-action@master
env:
SITE_DIR: 站点目录(如:/var/www/blog)
with:
host: ${{ secrets.SERVER_IP }}
port: ${{ secrets.SERVER_PORT }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SERVER_PRIVATE_KEY }}
envs: SITE_DIR
script: |
cd $SITE_DIR
sudo git config --global pull.rebase true
sudo git pull origin master --allow-unrelated-histories
其中 Git 用户名、Git 邮箱、站点目录 都要替换成你自己的。
首先打开 https://github.com/用户名/仓库名/settings/secrets/actions 新增几个 Action secret,在上面的执行工作流的时候会用到。
需要新增以下几项:
Name | Value |
---|---|
SERVER_IP | 服务器 IP |
SERVER_PORT | 服务器端口号 |
SERVER_USERNAME | 用户名 |
SERVER_PRIVATE_KEY | 服务器私钥(服务器的 ~/.ssh/id_rsa) |
HEXO_DEPLOY_PRIVATE_KEY | 部署私钥(本地的 ~/.ssh/id_rsa) |
前三项就不多说,主要讲下后面两项怎么设置。
HEXO_DEPLOY_PRIVATE_KEY 是为了在工作流中能够提交代码到 GitHub,SERVER_PRIVATE_KEY 是为了能在工作流中登录到服务器上执行命令。
工作流被触发后,先生成博客的静态文件,并通过 hexo deploy 提交到博客所在的分支(由 Hexo 配置文件中的 deploy.branch 指定),这里涉及到提交代码,所以要配置 SSH Key。
查看电脑上是否已经生成了密钥对。
$ ll ~/.ssh
# 输出: id_rsa id_rsa.pub known_hosts
如果为空则执行以下命令,一路回车就可以了:
$ ssh-keygen -t rsa -C "你的邮箱"
这时候电脑上就会有两个文件:~/.ssh/id_rsa、~/.ssh/id_rsa.pub,分别是是私钥和公钥。
id_rsa 文件的内容就是 HEXO_DEPLOY_PRIVATE_KEY 的 Value。
然后打开 https://github.com/settings/ssh/new,将 id_rsa.pub 的内容填到 Key 里面,Title 可以随便去,然后保存。
接下来就是 SERVER_PRIVATE_KEY,登录到服务器拿到密钥对,步骤跟上面差不多,没有的话就生成。
服务器中 ~/.ssh/id_rsa 文件的内容就是 SERVER_PRIVATE_KEY 的 Value,然后将 ~/.ssh/id_rsa.pub 的内容追加到 ~/.ssh/authorized_keys 文件中。
需要注意:
- 服务器中必须已经存在 SITE_DIR 目录,且已经将仓库 clone 下来了。
- 在服务器上可以免密执行 git pull。
更新博客时只需要打标签,然后将标签推送到云端就会触发工作流。
$ git tag v1.0.0
$ git push origin v1.0.0