使用 Github Actions 实现 Hexo 自动部署
缘起
看到这个标题,你可能会说:我本地生成静态文件了之后再手动上传不是很方便嘛,何必要折腾这么复杂的方法呢?
但是对我来说,用这套方案还是有很多好处的。
- 源文件云端备份到 Github,丢失概率低
- 自动进行双端部署(Pages + 服务器),特别是部署到服务器会方便很多
- 随时随地,没有电脑也能修改博客内容
- …
所以就来试试看吧,反正 Actions 不要钱(?
思路
首先我们需要了解 Github Actions 的工作原理。
Github Actions 本质上就是给你提供了一台虚拟服务器,你可以编写一种特殊的脚本来指定这台服务器干些什么。
我们需要让这台服务器先克隆博客源码的仓库,随后配置 Hexo 运行环境,之后生成静态博客文件,最后发布到 Pages 或推送到我们自己的服务器。
实现
1. 新建仓库并上传源码
没什么好说的,把你的博客源文件传上去就好了。
2. 配置 Workflow
新建一个 Workflow,并粘贴下面的代码:
name: Hexo Deployment
on:
push:
branches: [main]
jobs:
hexo-deployment:
runs-on: ubuntu-latest
env:
TZ: Asia/Shanghai
steps:
- name: Checkout source
uses: actions/checkout@v2
with:
submodules: true
- name: Setup Node.js
uses: actions/setup-node@v1
with:
node-version: '16.15.1'
- name: Install dependencies & Generate static files
run: |
npm i --location=global hexo-cli
npm i
hexo clean
hexo g
- name: Deploy to Github Pages
env:
GIT_NAME: (用户名)
GIT_EMAIL: (邮箱)
REPO: (仓库地址,如 github.com/akyuu-cn/evershifting-fountain)
GH_TOKEN: ${{ secrets.GH_TOKEN }}
run: |
cd ./public && git init && git add .
git config --global user.name $GIT_NAME
git config --global user.email $GIT_EMAIL
git commit -m "Site deployed by GitHub Actions"
git push --force --quiet "https://$GH_TOKEN@$REPO" master:pages
注意:Deploy to Github Pages 步骤中有需要自行修改的内容。
3. 配置 Secrets
打开 Github 用户设置 Developer settings
- Personal access tokens
,点击 Generate new token
,Expiration
选择 no expiration
(永不过期),下方勾选 repo 所有权限,然后点击 Generate token
。
把 token 复制下来。
打开仓库 Settings
- Secrets
- Actions
,点击 New repository secret
, Name
填 GH_TOKEN
,然后把刚才复制下来的 token 粘贴到 Value
中。
4. 尝试 Commit
任意修改一个文件并提交,理论上博客就会自动被构建并发布到 pages 分支了。
5. 配置 Github Pages
点击仓库 Settings
- Pages
,Source
中 Branch
选择 pages,并填写自定义域名,启用 https。(此处省略 Pages 配置过程)
这时候打开 Pages 发布的网站,可以顺利访问了。
EX. 发布到个人服务器
这里采用了 Rsync,保证在博客规模较大的时候也能在短时间内完成部署。在 Actions 脚本的最后加入:
- name: Deploy to server
uses: easingthemes/ssh-deploy@v2.2.11
env:
SSH_PRIVATE_KEY: '${{ secrets.SSH_PRIVATE_KEY }}'
ARGS: "-avz --delete"
SOURCE: "public/"
REMOTE_HOST: '${{ secrets.SERVER_IP }}'
REMOTE_USER: 'root'
TARGET: '(你的网站根目录,如 /www/wwwroot/akyuu-cn)'
注意:TARGET 中的内容需要修改为你自己的。
新建以下 Secrets:
SSH_PRIVATE_KEY
- 用于连接服务器的 SSH KEYSERVER_IP
- 你的服务器 IP
然后进行一次 Commit,生成好的文件就会自动被上传到服务器网站根目录了。
如果遇到错误…
自己去 Actions 里看日志啦(被打