一、Hexo 相关知识点

静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步:

  1. hexo clean
  2. hexo g -d // 相当于 hexo g + hexo d

如果考虑到同步源文件,还需要每次更改后,将源文件 push 到指定仓库:

  1. git push origin master

我们可以将 Hexo 文件分为两类,一类是源文件,即下面这些文件:

  1. .
  2. ├── _config.yml
  3. ├── package.json
  4. ├── scaffolds
  5. ├── source
  6. | ├── _drafts
  7. | └── _posts
  8. └── themes

一类是 public 文件,即网站文件:

  1. public
  2. ├── 2020
  3. ├── categories
  4. ├── tags
  5. ....

发布博文的这三个操作代表:

  • hexo clean:删除网站(public)文件
  • hexo g:生成网站(public)文件
  • hexo d:将本地网站(public)文件同步到指定仓库(如:yourname.github.io)中

我使用一个私有仓库存放 Hexo 源文件,在 deppwang/deppwang.github.io 中存放网站文件。所以每次发布或者更新博文时,需要使用 push 操作更新源文件,再执行 hexo cleanhexo g -d 更新博客,比较麻烦。

所以我们希望能在 push 源文件后,由 CI/CD(持续集成/持续部署)工具为我们执行 hexo cleanhexo g -d 这两个操作。

二、GitHub Actions

CI/CD 工具前有 Travis CI,现有 GitHub Actions,这里使用 GitHub Actions。

GitHub Actions 的工作原理:我们提前设置好需要自动化执行的任务,GitHub Actions 监控当前仓库的某一个操作(如:push),一旦有此操作,就自动化执行这些任务。

所以我们希望使用 GitHub Actions 后,只需要往源文件仓库 push 更新源文件,GitHub Actions 监控到 push 操作时,就自动化执行 hexo cleanhexo g -d 操作,完成博文发布。

Action 存放在项目根目录的 .github/workflows 下,后缀为 .yml。一个 Action 相当于一个工作流 workflow,一个工作流可以有多个任务 job,每个任务可以分为几步 step。任务、步骤依次执行。

每个 Action 是一个独立脚本,所以可以作为代码仓库。

  • actions/setup-node 就表示 github.com/actions/setup-node 这个 仓库,代表安装 node.js。Action 为 action.yml

可以通过下面这种格式来使用别人写好的 action,@借用了指针的概念:

  1. actions/setup-node@74bc508 # 指向一个 commit
  2. actions/setup-node@v1.0 # 指向一个标签
  3. actions/setup-node@master # 指向一个分支

关于 GitHub Actions 更多知识,请看 GitHub Actions 入门教程 - 阮一峰

现在需要实现一个 Action,使其能够执行 hexo cleanhexo g -d 操作。

三、Hexo Action

我是使用的 sma11black 已经开发好的 Hexo Action,这个 Action 针对的是存放 Hexo 源文件和网站文件分开存放的场景。请先看 教程,以下为教程的补充。

非第一次生成 SSH Key:

  1. ssh-keygen -t rsa -f ~/.ssh/id_rsa_x -C "yourmail@xxx.com"

将生成的 private key 作为 Hexo 源文件仓库 Settings > Secrets 的 一个名叫 DEPLOY_KEYSecret。注意:需要复制包括 -----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY----- 的整个内容。Secret 相当于一个变量,可以使私有变量不公开。

将生成的 public key 作为网站文件仓库 Settings > Deploy Keys 的 Deploy Key。Deploy Keys 中的公钥针对于当前仓库。

为什么要用 SSH Key?

  • SSH Key,是一对密匙:公钥+私钥,用于加密本地仓库和远程仓库的传输内容。是非对称加密,可公钥加密、私钥解密;或私钥加密、公钥解密。
  • 使用 GitHub Actions 是借助 GitHub 提供的环境,跟本地环境一样,也需要有私钥。当 GitHub Action 执行 hexo g -d 时,用私钥 DEPLOY_KEY 加密,GitHub 用网站文件仓库的 Deploy Key 进行验证。

下面是具体的 action.yml:

  1. name: Deploy # workflow name
  2. on:
  3. [push] # 触发事件
  4. jobs:
  5. build: # job1 id
  6. runs-on: ubuntu-latest # 运行环境为最新版 Ubuntu
  7. name: A job to deploy blog.
  8. steps:
  9. - name: Checkout # step1 获取源码
  10. uses: actions/checkout@v1 # 使用 actions/checkout@v1
  11. with: # 条件
  12. submodules: true # Checkout private submodules(themes or something else). 当有子模块时切换分支?
  13. # Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.) 缓存压缩 node_modules,不用每次下载,使用时解压,可以加快工作流的执行过程,超过 7 天没有使用将删除压缩包。
  14. - name: Cache node modules # step2
  15. uses: actions/cache@v1
  16. id: cache
  17. with:
  18. path: node_modules
  19. key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
  20. restore-keys: |
  21. ${{ runner.os }}-node-
  22. - name: Install Dependencies # step3 name
  23. if: steps.cache.outputs.cache-hit != 'true' # 如果变量 cache-hit 不等于 true
  24. run: npm install # 安装 node modules 相关依赖
  25. # Deploy hexo blog website.
  26. - name: Deploy # step4
  27. id: deploy
  28. uses: sma11black/hexo-action@v1.0.0
  29. with:
  30. deploy_key: ${{ secrets.DEPLOY_KEY }}
  31. user_name: your github username
  32. user_email: your github useremail

四、可能出现的问题:Deploy 失败

可能出现以下 3 三种情况:

1、

  1. Host key verification failed
  2. fatal: Could not read from remote repository.

出现此问题请检查 站点配置文件,看 deploy 是否存在出 GitHub 以外的仓库,如 Coding 。

解决方式:去除 GitHub 以外的仓库。

2、

  1. Load key "/root/ssh/id_rsa": invalid format
  2. gitagithub.com: Permission denied (publickey)
  3. fatal: Could not read from remote repository.

出现此问题请检查 SSH Key,看 Private Key 是否正确且完整的复制

3、

  1. ERROR Local hexo not found in /github/workspace
  2. ERROR Try running: 'npm install hexo --save'

解决方式:将 uses: sma11black/hexo-action@v1.0.0 改为 uses: deppwang/hexo-aciton@v1.0.1@v1.0.1entrypoint.shhexo g -d 前添加了命令 npm install hexo --save

五、总结

关于 Action 具体如何执行,可结合运行日志理解。

六、参考

使用 GitHub Actions 实现 Hexo 博客自动部署的更多相关文章

  1. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  2. 利用Travis IC实现Hexo博客自动化部署

    1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...

  3. 使用github action发布hexo博客到云服务器

    目录 搭建Hexo博客 安装主题hexo-theme-bamboo 修改博客名称等信息 添加github action发布 1. 在github中创建自己的博客仓库 2. 设置Secrets 3. 在 ...

  4. 史上最详细“截图”搭建Hexo博客并部署到Github

    http://jingyan.baidu.com/article/d8072ac47aca0fec95cefd2d.html 大家也搭建过博客,很多时候,按着教程来做就可以了,但是我当时为了搭建Hex ...

  5. Termux搭建hexo博客并部署到GitHub

    Termux搭建hexo博客并部署到GitHub 安装 termux-change-repo apt update apt install git && nodejs &&am ...

  6. 搭建hexo博客并部署到github上

    hexo是由Node.js驱动的一款快速.简单且功能强大的博客框架,支持多线程,数百篇文章只需几秒即可生成.支持markdown编写文章,可以方便的生成静态网页托管在github上. 感觉不错. 前端 ...

  7. 在Github上面搭建Hexo博客(一):部署到Github

    什么是Hexo Hexo是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在Github和Heroku上.并且有很多人为其制作了很多优秀的主题(theme),你可以根据自己的喜好进行设 ...

  8. 在github上搭建hexo博客

    准备工作 安装git 系统是win10家庭版,采用git v1.9.5版本,比较简单,一路next直到finsh完成安装. 安装node.js hexo是基于node.js驱动的一款快速.简单且功能强 ...

  9. github page 配置hexo 博客 的常见错误

    缘起 最近看到好多的公众号作者推荐大家搭建自己的博客,自己手痒也搭建了一个个人博客lumang,具体过程就是一开始上网搜索一番教程,按照教程开始搭建,由于是windows的环境,同时教程也有很多的老旧 ...

随机推荐

  1. 使用WebUploader上传HTML文件并读取文件

    需求: 前端需要上传HTML文件并识别里面有多少个特殊标签并录入到数据库. 思路: 使用WebUploader上传文件,然后使用FileReader接口和DOMParser识别HTML中的特殊标签 资 ...

  2. 数据量不足,MedicalNet 如何助力医疗影像 AI 突破瓶颈?

    ​导读 |近日,云+社区技术沙龙“腾讯开源技术”圆满落幕.本次沙龙邀请了多位腾讯技术专家,深度揭秘了腾讯开源项目TencentOS tiny.TubeMQ.Kona JDK.TARS以及Medical ...

  3. 与drawable的较量(一)

    前言 在android ui中drawable 是一个非常关键的要点,因为我们现在使用的花里胡哨的APP,都在胡里花哨的drawable 构建的. drawable,英文翻译为可拖拽的.说白了就是自己 ...

  4. 深入理解协程(四):async/await异步爬虫实战

    本文目录: 同步方式爬取博客标题 async/await异步爬取博客标题 本片为深入理解协程系列文章的补充. 你将会在从本文中了解到:async/await如何运用的实际的爬虫中. 案例 从CSDN上 ...

  5. oracle的一些简单语法

    1.创建主键自增: --创建序列 create sequence seq_tb_user minvalue nomaxvalue start with increment by nocycle --一 ...

  6. CocoaPods中的头文件import导入时不能自动补齐的解决方法

    1.选择target(就是左边你的工程target)-->BuildSettings-->search Paths下的User Header Search Paths 2.添加“$(POD ...

  7. python3迭代器

    一.前提 1.dir()函数 dir()函数带参数时,返回参数的属性和方法列表:不带参数时,返回当前范围内变量.方法和定义的类型列表 # dir(参数):带参数,返回参数的属性和方法 s = '' p ...

  8. V模型

    V模型是Kevin Forsberg & Harold Mooz在1978年提出的,V模型强调测试在系统工程各个阶段中的作用,并将系统分解和系统集成的过程通过测试彼此关联.V模型从整体上看起来 ...

  9. 【Java并发基础】死锁

    前言 我们使用加锁机制来保证线程安全,但是如果过度地使用加锁,则可能会导致死锁.下面将介绍关于死锁的相关知识以及我们在编写程序时如何预防死锁. 什么是死锁 学习操作系统时,给出死锁的定义为两个或两个以 ...

  10. CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)

    ·栈.单调栈 1.栈的特点与基本操作 2.单调栈 单调栈是一种特殊的栈,其栈内的元素都保持一个单调性(单调递增或者递减). ·单调递增栈,从栈底到栈顶依次递增(单调非递减栈:允许有相等) ·单调递减栈 ...