使用 GitHub Actions 实现 Hexo 博客自动部署

摘要:
一、Hexo 相关知识点 静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步: hexo clean hexo g -d // 相当于 hexo g + hexo d 如果考虑到同步源文件,还需要每次更改后,将源文件 push 到指定仓库: git push origin master

Image result for image Hexo

一、Hexo 相关知识点

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

hexo clean
hexo g -d // 相当于 hexo g + hexo d

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

git push origin master

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

.
├── _config.yml
├── package.json
├── scaffolds
├── source
|   ├── _drafts
|   └── _posts
└── themes

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

public
├── 2020
├── categories
├── tags
....

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

  • 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 这两个操作。

Image result for github action

二、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,@借用了指针的概念:

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

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

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

Image result for hexo action

三、Hexo Action

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

非第一次生成 SSH Key:

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:

name: Deploy # workflow name

on:
  [push] # 触发事件

jobs:
  build: # job1 id
    runs-on: ubuntu-latest # 运行环境为最新版 Ubuntu
    name: A job to deploy blog.
    steps:
    - name: Checkout # step1 获取源码
      uses: actions/checkout@v1 # 使用 actions/checkout@v1
      with: # 条件
        submodules: true # Checkout private submodules(themes or something else). 当有子模块时切换分支?

    # Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.) 缓存压缩 node_modules,不用每次下载,使用时解压,可以加快工作流的执行过程,超过 7 天没有使用将删除压缩包。
    - name: Cache node modules # step2
      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 # step3 name
      if: steps.cache.outputs.cache-hit != 'true' # 如果变量 cache-hit 不等于 true
      run: npm install # 安装 node modules 相关依赖

    # Deploy hexo blog website.
    - name: Deploy # step4
      id: deploy
      uses: sma11black/hexo-action@v1.0.0
      with:
        deploy_key: ${{ secrets.DEPLOY_KEY }}
        user_name: your github username
        user_email: your github useremail

Image result for error

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

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

1、

image-20200215220503185

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

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

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

2、

image-20200215220635619

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

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

3、

image-20200216183926423

ERROR Local hexo not found in /github/workspace
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 博客自动部署》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇自然语言处理(nlp)比计算机视觉(cv)发展缓慢,而且更难!hibernate数据库配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

node和npm的安装和镜像源的修改

在node官网下载https://nodejs.org/en/ 直接下载msi的文件,需要配置环境变量 我的电脑-->属性-->高级系统配置-->环境变量-->用户变量,在用户变量中配置 配置如下: -->新建 NODE_HOME X:Program Files odejs (注:node的目录) -->新建 NODE_...

Mac下卸载删除nvm和node

nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,nvm 是一个独立于 node/npm的外部 shell 脚本。 卸载nvm 1.移除nvm内容 cd ~ rm -rf .nvm 2.移除掉~/.profile, ~/.bash_profile, ~/.zshrc, ~/.bashrc文件中关于nvm的配置 vim .b...

Maven 学习笔记——Maven环境配置(1)

      在学习Selenium的过程中,接触到了Maven(项目管理工具),不至于学一路忘一路,左耳朵进右耳多出,还是决定边学边记录,毕竟听的不如 看的,看的不如写的吗。首先学一样东西,肯定得明确学的是什么,学了以后在工作中起到什么作用,实际点是,学完这东西能给自己带来多少的Money的增 值。好了,话不多说了,进入主题。        Maven是一...

阿里 otter搭建部署

IP:10.10.6.172 部署:mysql目标库,mysql源数据库 IP:10.10.6.173 部署:zookeeper,manager,node,canal (也都部署到源库服务器上) 由于otter进行数据库同步,目前仅支持row,所以需要把源库的binlog_format改为ROW log-bin=mysql-bin expire_logs_...

NodeJs实现下载Excel文件

nodejs作为一门新的语言,报表功能也不是十分完善。 (1).js-xlsx: 目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析采用纯js实现,写入需要依赖nodejs或者FileSaver.js实现生成写入Excel,可以生成子表Excel,功能强...

Linux 安装elasticsearch、node.js、elasticsearch-head

前提:下载es的安装包 官网可以下载 es官网 安装elasticsearch 1 新建两个文件夹 一个存放安装文件,一个存放解压后的文件 mkdir -p /export/software //存放安装文件 mkdir -p /export/servers //存放解压后的文件 2 创建es用户 #使用root用户的操作 useradd es...