腾讯云 Serverless + Github Action 自动部署 Hexo 博客
看过很多使用 Github Action 自动部署 Hexo 博客的教程,但是部署到 腾讯云 Serverless framework 的几乎没有,而且对于 GitHub 身份验证也比较麻烦,综合各家之长有了本篇小文,力求详细。
1 Github Action
2 自动部署
设置步骤:
- 博客文件管理
- 生成权限密码
- 配置 secret
- 配置 workflows
2.1 博客文件管理
博客文件的版本管理是通过使用 GitHub 仓库来实现,基本步骤如下:
在命令行中:
- 在需要的位置通过
hexo init blog
初始化博客环境。 - 使用
git init
命令初始化 Git 仓库,此时仓库内没有文件。 - 使用
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 - 使用
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 账号即可进行版本管理操作:
- 添加本地仓库到 GitHub Desktop:使用快捷键
ctrl O
,或者在菜单中找到 add。然后选取你git init
操作的那个文件夹即可。 - 将更改添加到版本中,在 Current repository 下找到你添加的仓库,文件名应该是你本地的文件名。把 Changes 的内容全选,在下方的
详情图片
commit
的标题部分填入first commit
点击 commit 按钮推送到版本库中。
推送成功后可以在 History 中看到历史版本。但注意到此时更新的版本里有向上的箭头,表明该版本还没有提交到 GitHub 仓库中。 - 提交到 Github 仓库:点击上方的 Publish repository,勾选 Keep this code private,发布到私有仓库,毕竟源文件中可能会涉及到各种隐私文件。该过程可能会因为网络原因失败,但是重复推送即可。
详情图片
此时博客文件管理已经完成,以后如有修改文件,只需在 GitHub Desktop 中添加对应版本并推送上去即可。有时使用客户端推送会失败,也可以在命令行中使用 git push
命令。
2.2 生成权限密码
在使用 Github Action 时需要配置权限密码,一是 Github 的访问令牌,二是 腾讯云的 API密钥管理,三是 qmsg 酱的访问密匙。
- Github 的访问令牌
官方文档——创建个人访问令牌 - 腾讯云的 API密钥管理
点这里创建 - qmsg 酱的访问密匙
点这里获取
注意,这些的访问权限都比较高,建议定期设置失效更新。
2.3 配置 secret
将 生成权限密码 中取得的密码配置到 Github 仓库的 secret 中:
在仓库的 Setting.Secrets.Actions 中设置
详情图片
注意:这里的命名要和下面设置的 workflows 中的变量对应。
2.4 配置 workflows
在根目录的 .github
文件夹中新建 workflows
文件夹,这是存放 Github Action 配置的文件夹,在该文件夹中新建一个 .yml
文件,命名随意。
我的 workflow 源码:
workflow 源码
1 | name: www.hermitlsr.top |
代码主要分两部分,一是触发条件,二是工作流。
2.4.1 触发条件
1 | on: |
该代码表面仓库的 master 有更新时触发 Github Action。
2.4.2 工作流
创建运行环境
1 | jobs: |
后面的具体工作按 steps
中的顺序执行。
检出仓库文件
1 | - name: Checkout |
这里除了检出本仓库中的文件,还会检出子仓库中的文件,当子仓库为私有仓库时会失败,需要额外配置权限。
安装 node 和 相关依赖
1 | - name: Setup Node.js 16.x |
我这里使用了最新的 “16.x” 版本,并设置了缓存目录,避免每次重复安装。
npm install -g serverless
是安装 serverless
用于使用 serverless framework
部署到腾讯云。
生成网页文件
1 | - name: init public |
生成 public 文件夹。后续也发布 Github 仓库 时不会使用 hexo deploy
,而是直接将该生成文件推送到目标仓库中,或者使用另一个第三方工具。
部署到腾讯云
1 | - name: Deploy tecent |
SERVERLESS_PLATFORM_VENDOR: tencent
一定要设置,不设置的话会显示登录失败,这个是来自于腾讯云的技术顾问。
TENCENT_SECRET_ID
和 TENCENT_SECRET_KEY
都是前面设置的腾讯云的 API 访问令牌。注意变量名。本身在本地使用的时候会创建 .env
文件存放令牌,但这里为了防止令牌泄露,采用 secret
的形式,.env
文件无需上传。
sls deploy -debug
这个命令用于将生成好的文件推送到腾讯云上,不熟悉该命令的可以看 腾讯云serverless托管Hexo静态博客 。
部署到 Github page
这里有多种方法进行,我选取了两种使用令牌的方法放在这里:
第一种方法:
1 | - name: Deploy github |
该部署方式是直接将生成的 public 文件夹推送到目标仓库的方式。
DEPLOY_REPO
设置目标仓库。
首先进入到 public
文件夹中,并初始化 github 仓库,并设置所有者为自己,然后设置推送命令,最后通过访问令牌的验证方式强制推送。该种方式会强制覆盖仓库内的内容。
另一种推送到 Github 的方式是使用 peaceiris/actions-gh-pages@v3
1 | - name: Deploy to GitHub Pages |
注意:
personal_token: ${{ secrets.ACCESS_TOKEN }}
:这里如果是推送到相同的仓库,可以直接使用github_token:${{ secrets.GITHUB_TOKEN }}
,该 token 无需额外生成;当如果是不同的仓库,需要使用personal_token
,Protocol
为HTTPS
或者deploy_key
,Protocol
为SSH
进行部署。external_repository
: 推送的仓库,设置为你要使用 Github Pages 的仓库就可以了。publish_branch
:要推送到目标仓库的分支,非默认分支需提前创建。publish_dir
:推送内容所在的文件相对地址。commit_message
:推送信息。- 具体可 见文档 。
qmsg 酱推送成功信息
1 | - name: notification |
该信息可以自定义,这里的 {{secrets.QMSG_KEY}}
为之前设置的 qmsg 的权限密码。这不是一个必要的流程,只是为了让之前注册的 qmsg 酱不要闲置。
至此配置完成,将所有修改推送到 Github 即可。
不过需要注意的是,Github action 私有库每个月只有 2000 分钟的时间。部署一次博客大概 1-2 分钟左右,一个月 1000 次左右肯定够了。万一用完了可以直接本地发布。