用GitHub Action自动构建Hexo

ScaredCube

前言

之前一直是在本地使用hexo,构建完成后再上传到GitHub。但是这样的缺陷就是只能在本地写文章,且没有源文件的备份,文章丢了找不回来。(参见这位

实现原理是创建一个新的仓库,用于储存hexo文件,通过Action自动构建后推送到原来的纯前端仓库。

至于cloudflare pages的自动构建,其实本质上应该能用(还更方便)。但我尝试多次都在npm install的时候报错,不知道是什么原因。构建参数放在下面,可以自行尝试。

配置git

  1. 创建一个仓库,可以私人也可以公开。不用添加README.md

  2. 按照正常流程配置GitHub密钥,可以百度找,很多教程

    大致就是:创建RSA - 在GitHub上绑定SSH key(注意先别push

  3. 配置忽略的文件。hexo目录下有一些文件不需要推送,可以配置忽略。

    1
    2
    //创建.gitignore文件
    touch .gitignore

    文件中写入:

    1
    2
    3
    4
    5
    node_modules/
    public/
    .deploy_git/
    /yarn.lock
    /package-lock.json

    注意:.gitignore只能忽略未被缓存过的文件。如果在忽略前推送过,请在缓存中删除:git rm -r --cached xxx

    yarn.lock 和 package-lock.json 可能会影响到Action自动构建时模块安装,留个 package.json 就行。

  4. _config.yml中修改deploy参数(repo一定要用git格式!不要https!

    1
    2
    3
    4
    5
    deploy:
    type: git
    repo: git@github.com:xxx/xxx.git #储存前端页面的仓库,不是新建的Hexo仓库!!
    branch: main #默认分支
    message: update #随便写啥都行

配置GitHub Action

在本地目录中创建.github/workflows目录,新建main.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
41
42
43
44
45
46
47
48
49
50
51
52
 # workflow name
name: Hexo Github Actions

# main branch on push, auto run
on:
push:
branches:
- main ## or master

jobs:
build:
runs-on: ubuntu-latest

steps:
# check it to your workflow can access it
# from: https://github.com/actions/checkout
- name: Checkout Repository main branch
uses: actions/checkout@master

# from: https://github.com/actions/setup-node
- name: Setup Node.js 16.x
uses: actions/setup-node@master
with:
node-version: "16.x"

- name: Setup Hexo Dependencies
run: |
npm install hexo-cli -g
npm install
- name: Setup Deploy Private Key
env:
HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts

- name: Setup Git Infomation
env:
USERNAME: ${{ secrets.GH_USERNAME }}
EMAIL: ${{ secrets.GH_EMAIL }}
run: |
git config --global user.name $USERNAME ## 你的 GitHub 用户名
git config --global user.email $EMAIL ## 你的 GitHub 绑定邮箱

- name: Deploy Hexo
run: |
hexo clean
hexo generate
hexo deploy

如果你的仓库(前端仓库)默认分支不是main,可以修改。

接着去GitHub页面配置Action的环境变量:Settings - Secrets and variables - Actions 添加三个环境变量:

NameSecret
GH_EMAIL你GitHub账号绑定的邮箱
GH_USERNAME你GitHub用户名
HEXO_DEPLOY_PRIVATE_KEYRSA私钥(见下

其中RSA密钥可以是你绑定远程仓库时在本地创建的私钥,一般储存在C:\Users\xxx\.ssh\id_rsa或者~/.ssh/id_rsa不是id_rsa.pub)。 使用文字编辑器打开后复制到环境变量Secret中即可。

或者可以创建一个新的RSA:

1
ssh-keygen -t rsa -b 4096 -C "email@example.com" //GitHub绑定的邮箱

注意不要保存在默认位置,另找一个地方放。Enter passphrase的时候直接回车。

生成了两个文件,[rsa][rsa].pub分别是私钥和公钥。私钥填进环境变量中,公钥设置为静态仓库的Deploy keys。

推送到GitHub仓库

1
2
3
4
5
6
7
8
9
10
11
//初始化本地仓库
git init

//添加目录中所有文件到缓存中
git add .

//本地仓库提交(commit可以随便写
git commit -m "update"

//推送到远程仓库
git push origin main

常见报错:

  1. error: src refspec main does not match any

    本地分支与远程分支不同。本地分支改个名就行:git branch -m main

  2. ![rejected] main -> main (fetch first) error: ...

    本地分支和远端分支冲突,加个--force强制覆盖就行了:git push origin main --force
    或者先git pull拉取远程文件也行

完成

不出意外的话Hexo文件已经上传到GitHub了。可以去Hexo仓库检查Action运行情况,若运行成功再去前端仓库中查看是否有提交记录。如果一切正常,那么恭喜,你成功了。

每次Hexo仓库中有新的提交时,Action会自动构建并推送到前端仓库。你也可以在手机GitHub App中编辑文章。

如果你觉得每次在本地编辑完之后手动提交GitHub很麻烦,可以创建一个push_hexo.bat

1
2
3
4
5
set http_proxy=http://127.0.0.1:10809
set https_proxy=http://127.0.0.1:10809
git add .
git commit -m "update hexo file"
git push origin main

设置代理是为了避免网络原因上传失败,你不需要的话可以删掉。

如果需要同步远程仓库中的文件,可以git pull(拉取远程文件后直接合并)或git fetch(检查后决定是否合并)

  • Title: 用GitHub Action自动构建Hexo
  • Author: ScaredCube
  • Created at : 2024-01-30 12:24:02
  • Updated at : 2024-12-01 15:29:49
  • Link: https://sccube.link/actionBuildHexo/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
用GitHub Action自动构建Hexo