发布于 

腾讯云 Serverless + Github Action 自动部署 Hexo 博客

   看过很多使用 Github Action 自动部署 Hexo 博客的教程,但是部署到 腾讯云 Serverless framework 的几乎没有,而且对于 GitHub 身份验证也比较麻烦,综合各家之长有了本篇小文,力求详细。

1 Github Action

Github Action 是什么

2 自动部署

设置步骤:

  1. 博客文件管理
  2. 生成权限密码
  3. 配置 secret
  4. 配置 workflows

2.1 博客文件管理

博客文件的版本管理是通过使用 GitHub 仓库来实现,基本步骤如下:

在命令行中:

  1. 在需要的位置通过 hexo init blog 初始化博客环境。
  2. 使用 git init 命令初始化 Git 仓库,此时仓库内没有文件。
  3. 使用 git add . 命令添加所有文件到 Git 仓库中。可以在 .gitignore 文件中设置忽略的文件,此文件中标明的文件不会被加入仓库中。注意此时还没有把这个更改加入到版本库。
    我的 .gitignore 文件
    1
    2
    3
    4
    5
    6
    7
    8
    .DS_Store
    Thumbs.db
    db.json
    *.log
    node_modules/
    public/
    .deploy*/
    .idea
  4. 使用 git submodule add https://github.com/#yourname#/#theme.git themes/#themename 命令添加主题文件子模块。主题文件将会作为子模块存在,git push 父模块时只会上传引用的子模块版本。
    例如我使用的是 stellar 主题,相应的命令为 git submodule add https://github.com/hermitlsr/hexo-theme-stellar.git themes/stellar 。执行完成后会在根站点出现 .gitmodules ,它记录了子模块的原仓库地址和本地相对地址。

注意以上关于 git 的操作可能会因为网络的问题报错 一般是 10054 错误,很正常,网络 ok 了就行。
此时,父模块还没有被 push 到 GitHub 上,子模块是和原仓库地址对应的。

由于我不太熟悉 命令行 管理 git 仓库,所以后面的操作在 GitHub Desktop ( 点我下载 )中完成:
只需要登录自己的 GitHub 账号即可进行版本管理操作:

  1. 添加本地仓库到 GitHub Desktop:使用快捷键 ctrl O,或者在菜单中找到 add。然后选取你 git init 操作的那个文件夹即可。
  2. 将更改添加到版本中,在 Current repository 下找到你添加的仓库,文件名应该是你本地的文件名。
    详情图片
    Changes 的内容全选,在下方的 commit 的标题部分填入 first commit 点击 commit 按钮推送到版本库中。
    推送成功后可以在 History 中看到历史版本。但注意到此时更新的版本里有向上的箭头,表明该版本还没有提交到 GitHub 仓库中。
  3. 提交到 Github 仓库:点击上方的 Publish repository,勾选 Keep this code private,发布到私有仓库,毕竟源文件中可能会涉及到各种隐私文件。
    详情图片
    该过程可能会因为网络原因失败,但是重复推送即可。

此时博客文件管理已经完成,以后如有修改文件,只需在 GitHub Desktop 中添加对应版本并推送上去即可。有时使用客户端推送会失败,也可以在命令行中使用 git push 命令。

2.2 生成权限密码

在使用 Github Action 时需要配置权限密码,一是 Github 的访问令牌,二是 腾讯云的 API密钥管理,三是 qmsg 酱的访问密匙。

  1. Github 的访问令牌
    官方文档——创建个人访问令牌
  2. 腾讯云的 API密钥管理
    点这里创建
  3. qmsg 酱的访问密匙
    点这里获取

注意,这些的访问权限都比较高,建议定期设置失效更新。

2.3 配置 secret

生成权限密码 中取得的密码配置到 Github 仓库的 secret 中:
在仓库的 Setting.Secrets.Actions 中设置

详情图片

注意:这里的命名要和下面设置的 workflows 中的变量对应。

2.4 配置 workflows

在根目录的 .github 文件夹中新建 workflows 文件夹,这是存放 Github Action 配置的文件夹,在该文件夹中新建一个 .yml 文件,命名随意。

我的 workflow 源码:

workflow 源码
.github/workflows/deploy.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
53
54
55
56
57
58
59
60
61
62
name: www.hermitlsr.top

on:
push:
branches:
- master # 触发事件

jobs:
build:
runs-on: ubuntu-latest # 运行环境为最新版 Ubuntu
name: auto deploy
steps:
- name: Checkout
uses: actions/checkout@v2
with: # 条件
submodules: true # Checkout private submodules(themes or something else). 当有子模块时切换分支?

- name: Setup Node.js 16.x
uses: actions/setup-node@master
with:
node-version: "16.x" # node 版本设置

- name: Cache node modules
# 设置包缓存目录,避免每次下载
uses: actions/cache@v1
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

- name: Install dependencies
run: |
npm install -g serverless
npm install hexo-cli -g
npm install

- name: init public
run: |
hexo clean
hexo generate

- name: Deploy tecent
env:
SERVERLESS_PLATFORM_VENDOR: tencent # 外网环境下需要设置
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
run: |
sls deploy -debug

- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.ACCESS_TOKEN }}
external_repository: hermitlsr/hermitlsr.github.io
publish_branch: master
publish_dir: ./public
commit_message: ${{ github.event.head_commit.message }}
user_name: 'github-actions[bot]'
user_email: 'github-actions[bot]@users.noreply.github.com'

- name: notification
run: | # 部署成功后通过 qmsg 推送到 qq 提示部署成功
curl https://qmsg.zendee.cn/send/${{secrets.QMSG_KEY}} -X POST -d 'msg=部署成功, 请访问 https://www.hermitlsr.top/ 进行确认 '

代码主要分两部分,一是触发条件,二是工作流。

2.4.1 触发条件

1
2
3
4
on:
push:
branches:
- master # 触发事件

该代码表面仓库的 master 有更新时触发 Github Action。

2.4.2 工作流

创建运行环境
1
2
3
4
5
jobs:
build:
runs-on: ubuntu-latest # 运行环境为最新版 Ubuntu
name: auto deploy
steps:

后面的具体工作按 steps 中的顺序执行。

检出仓库文件
1
2
3
4
- name: Checkout
uses: actions/checkout@v2
with: # 条件
submodules: true # Checkout private submodules(themes or something else). 当有子模块时切换分支?

这里除了检出本仓库中的文件,还会检出子仓库中的文件,当子仓库为私有仓库时会失败,需要额外配置权限。

安装 node 和 相关依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- name: Setup Node.js 16.x
uses: actions/setup-node@master
with:
node-version: "16.x" # node 版本设置

- name: Cache node modules
# 设置包缓存目录,避免每次下载
uses: actions/cache@v1
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

- name: Install dependencies
run: |
npm install -g serverless
npm install hexo-cli -g
npm install

我这里使用了最新的 “16.x” 版本,并设置了缓存目录,避免每次重复安装。

npm install -g serverless 是安装 serverless 用于使用 serverless framework 部署到腾讯云。

生成网页文件
1
2
3
4
- name: init public
run: |
hexo clean
hexo generate

生成 public 文件夹。后续也发布 Github 仓库 时不会使用 hexo deploy ,而是直接将该生成文件推送到目标仓库中,或者使用另一个第三方工具。

部署到腾讯云
1
2
3
4
5
6
7
- name: Deploy tecent
env:
SERVERLESS_PLATFORM_VENDOR: tencent # 外网环境下需要设置
TENCENT_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
TENCENT_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
run: |
sls deploy -debug

SERVERLESS_PLATFORM_VENDOR: tencent 一定要设置,不设置的话会显示登录失败,这个是来自于腾讯云的技术顾问。
TENCENT_SECRET_IDTENCENT_SECRET_KEY 都是前面设置的腾讯云的 API 访问令牌。注意变量名。本身在本地使用的时候会创建 .env 文件存放令牌,但这里为了防止令牌泄露,采用 secret 的形式,.env 文件无需上传。
sls deploy -debug 这个命令用于将生成好的文件推送到腾讯云上,不熟悉该命令的可以看 腾讯云serverless托管Hexo静态博客

部署到 Github page

这里有多种方法进行,我选取了两种使用令牌的方法放在这里:

第一种方法:

1
2
3
4
5
6
7
8
9
10
- name: Deploy github
env:
DEPLOY_REPO: github.com/hermitlsr/hermitlsr.github.io
run: |
cd ./public && git init && git add .
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
git add .
git commit -m "GitHub Actions Auto Builder at $(date +'%Y-%m-%d %H:%M:%S')"
git push --force --quiet "https://${{ secrets.ACCESS_TOKEN }}@$DEPLOY_REPO" master:master

该部署方式是直接将生成的 public 文件夹推送到目标仓库的方式。
DEPLOY_REPO 设置目标仓库。
首先进入到 public 文件夹中,并初始化 github 仓库,并设置所有者为自己,然后设置推送命令,最后通过访问令牌的验证方式强制推送。该种方式会强制覆盖仓库内的内容。

另一种推送到 Github 的方式是使用 peaceiris/actions-gh-pages@v3

1
2
3
4
5
6
7
8
9
10
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.ACCESS_TOKEN }}
external_repository: hermitlsr/hermitlsr.github.io
publish_branch: master
publish_dir: ./public
commit_message: ${{ github.event.head_commit.message }}
user_name: 'github-actions[bot]'
user_email: 'github-actions[bot]@users.noreply.github.com'

注意:

  • personal_token: ${{ secrets.ACCESS_TOKEN }} :这里如果是推送到相同的仓库,可以直接使用 github_token:${{ secrets.GITHUB_TOKEN }},该 token 无需额外生成;当如果是不同的仓库,需要使用 personal_tokenProtocolHTTPS 或者 deploy_keyProtocolSSH 进行部署。
  • external_repository: 推送的仓库,设置为你要使用 Github Pages 的仓库就可以了。
  • publish_branch:要推送到目标仓库的分支,非默认分支需提前创建。
  • publish_dir:推送内容所在的文件相对地址。
  • commit_message:推送信息。
  • 具体可 见文档
qmsg 酱推送成功信息
1
2
3
- name: notification
run: | # 部署成功后通过 qmsg 推送到 qq 提示部署成功
curl https://qmsg.zendee.cn/send/${{secrets.QMSG_KEY}} -X POST -d 'msg=部署成功, 请访问 https://www.hermitlsr.top/ 进行确认 '

该信息可以自定义,这里的 {{secrets.QMSG_KEY}} 为之前设置的 qmsg 的权限密码。这不是一个必要的流程,只是为了让之前注册的 qmsg 酱不要闲置。

至此配置完成,将所有修改推送到 Github 即可。

注意

不过需要注意的是,Github action 私有库每个月只有 2000 分钟的时间。部署一次博客大概 1-2 分钟左右,一个月 1000 次左右肯定够了。万一用完了可以直接本地发布。

3 最后一些常用的 action 获取

GitHub 官方的 action
GitHub 官方市场中的 action
第三方收集的有用的 action