用 Github Action 编译和推送 hexo 博客 (同时提交 Sitemap / 支持私有仓库)

写在开端

一晃五年过去了,在大厂打工的日子可不好受。现在的人都太卷了。

那么这次就发一个更的部署博客的方式吧。

为什么要这样做? GIthubPages 不好用吗?

首先此方法仅适用于有自己 VPS 的朋友。如果没有 VPS,也可以使用 AWS 的 s3 存储。

来个表对比一下

比较项GH PagesGH Action
域名域名很容易无法访问没有域名,自己解析
仓库访问性公开可公开可私有
Github对象存储,或者自己的服务器
Build 方式本地 / GH ActionGH Action
自由度普通
难度有手就行要熟悉基本的 linux 操作

流程

  • 本地 push 博文到仓库
  • Github Action 编译后存入 action 存档
  • Github Action 通知 VPS 获取 / 推送到对象存储 (比如 S3)

步骤

在服务器上安装 Webhook

以 Ubuntu 发行版为例

  • 下载 Webhook
  • sudo apt-get install jq -y
  • sudo vim /etc/webhook.conf
  • 拷贝如下代码
1
2
3
4
5
6
7
[
{
"id": "hexo-generate",
"execute-command": "/home/ubuntu/hexo/deploy.sh",
"command-working-directory": "/home/ubuntu/hexo"
}
]
  • sudo service webhook restart

以上操作的目的在于

当有人访问 <你的 ip>:9000/hexo-generate 的时候,会自动执行 /home/ubuntu/hexo/deploy.sh

添加 Github Action 脚本

如果你是私有仓库:

  1. 先去 https://github.com/settings/tokens 创建一个 ghp 开头的 personal access token。

这里假定是 ghp_AAAAAAAAAA

  • cd ~ && mkdir hexo && cd hexo && touch ./deploy.sh && chmod +x ./deploy.sh
  • 写入以下脚本,记得替换 ghp、github username 以及仓库名
1
2
3
4
5
6
7
8
9
10
#!/bin/sh
sleep 30
curl -u <你的Github名字>:ghp_AAAAAAAAAA https://api.github.com/repos/<你的Github名字>/<Repo名>/actions/artifacts | jq '.artifacts |= sort_by(.created_at) | .artifacts | reverse | .[0].archive_download_url' | sed 's/\"//g' | xargs wget --header "Authorization: token ghp_AAAAAAAAAA" --output-document=download.zip
rm -rf public
unzip -O utf-8 download.zip -d public
rm -rf download.zip

SITEMAP_URL="https://<你的域名>/sitemap.xml"
curl https://www.google.com/ping?sitemap=${SITEMAP_URL}
curl http://www.bing.com/ping?sitemap=${SITEMAP_URL}

如果你的仓库是可公开访问的:

那么可省略步骤 1,直接创建脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
sleep 30
curl https://api.github.com/repos/<你的Github名字>/<Repo名>/actions/artifacts | jq '.artifacts |= sort_by(.created_at) | .artifacts | reverse | .[0].archive_download_url' | sed 's/\"//g' | xargs wget --output-document=download.zip
rm -rf public
unzip -O utf-8 download.zip -d public
rm -rf download.zip

SITEMAP_URL="https://<你的域名>/sitemap.xml"
curl https://www.google.com/ping?sitemap=${SITEMAP_URL}
curl http://www.bing.com/ping?sitemap=${SITEMAP_URL}

脚本的目的在于通过 github api 获取最近的一次 action 编译结果,并解压到当前目录下的 public 文件夹。

Sleep 30 秒的原因在于,build 过程中是没法获取存档的(算是某种意义上的 Github Action 的问题)。

所以等收到通知之后,先休息 30 秒。 :D

配置 Github Action

新增 .github/workflows/main.yml 文件在项目根目录,替换掉 <你的域名或者IP>

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
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [master]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v3
with:
submodules: true

# Runs a set of commands using the runners shell
- name: Cache node modules
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: npm install
- name: Build hexo
run: npx hexo g

- uses: actions/upload-artifact@v3
with:
name: static
path: public/

- name: Notice
run: curl -L http://<你的域名或者IP>:9000/hooks/xxx

- name: Delete workflow runs
uses: GitRML/delete-workflow-runs@main
with:
retain_days: 1
keep_minimum_runs: 3

配置 Nginx

这里就不展开细说了,将 nginx 的解析设置为 ~/hexo/public 即可。

测试

如果一切顺利,当 push 之后就可以看到仓库的 action 中有构建的行为了。

稍等一会就会看到 ~/hexo/public 已经存在了,这样就部署成功了!

用 Github Action 编译和推送 hexo 博客 (同时提交 Sitemap / 支持私有仓库)

https://robinxb.com/posts/2022/post-blog-using-github-action/

作者

薯条

发布于

2022-04-26

更新于

2024-01-15

许可协议

评论