Hexo-blog 折腾 & 试水-(2)

时隔快一年了终于想起来把blog整理一下了……
于是做了个迁移,并记录一些过程中出现的问题和思路。

[补档]关于图片插入

主要是需要解决两个问题:1.图片的管理;2.图片引用方式
主要参考了hexo文档的资源文件夹 ^1 相关内容,在config.yml中开启资源文件夹:

1
post_asset_folder: true

当资源文件管理功能打开后,Hexo将会在你每一次通过 hexo new [layout] <title> 命令创建新文章时自动创建一个文件夹。这个资源文件夹将会有与这个文章文件一样的名字。将所有与你的文章有关的资源放在这个关联文件夹中之后,你可以通过相对路径来引用它们,这样你就得到了一个更简单而且方便得多的工作流。

然后使用标签插入图片

1
{% asset_img example.jpg This is an example image %}

通过这种方式,图片将会同时出现在文章和主页以及归档页中。在上述的情况下,图片资源引用的相对路径的根目录就是对应文章配套的assets文件夹。

这种方法的缺点是标准markdown 编辑器就无法识别图片了。

[补档]关于主题的使用

使用的主题是melody
注意现在很多的主题都支持 npm 安装,然后添加主题配置文件(如_config.melody.yml)实现配置。

blog迁移:GitHub-Actions的使用

之前是为了保证github.io的其他功能(图片站和小工具网页)导致整个repo的结构异常混乱:

于是采用了诡异的操作:在项目文件下建立.blog-src/文件夹储存hexo工程,重定向工程输出到blog/;写自动跳转index.html从 https://dwcarrot.github.io/ 自动跳转至https://dwcarrot.github.io/blog

思来想去还是把blog源文件放在单独的repo下,并使用自动化构建器进行自动发布。
于是需要解决的问题是:如何使得自动git发布能够只修改外部repo的一个子文件夹,并且外部repo自身其他的更新不会导致push失败?

用三个repo的方案 ^2 最后还是被放弃了 刷Commit是坏文明;用三个repo的主要原因是 hexo-deployer-git好像不支持发布到子文件夹。那么有没有能够支持更新到子文件夹的插件呢?
不知道

不过其实hexo官方英文版给的方案就不是用hexo-deployer-git的^3而是基于peaceiris/actions-gh-pages。后者的确是支持发布到子文件夹的! 问题解决。

其实问题在于hexo官方中文版页面和英文版给的方案居然不一样

最后方案是这样的:

  1. Github新建一个blog repo 用于存储blog源文件;这里将该repo改为private。

  2. 生成一对新密钥对用于自动化发布:

    在当前目录生成一个 ssh 密钥对。请勿在 repo 文件夹生成并上传到 GitHub

    1
    ssh-keygen -f ./hexo-deploy

    blog repo settings 添加 Depoly keys,Title 为 HEXO_DEPLOY_PUB,Key 为 hexo-deploy.pub 文件内的内容,勾选 Allow write access。

    blog-source repo settings 添加 Secrets。

    Name Value
    GIT_EMAIL 填写 Git 邮箱(执行 git config user.email 查看)
    GIT_USER 填写 Git 用户名(执行 git config user.name 查看)
    BLOG_DEPLOY_KEY 填写 hexo-deploy 文件内的内容
  3. blog内容的迁移和自动化脚本编写。

    这里先放出Github Actions脚本。在blog源码repo下新建.github/workflows/deploy-blog.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
    # This is a basic workflow to help you get started with Actions

    name: Deploy Blog Into Github Pages

    # 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 "deploy"
    deploy:
    # 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@v2

    - name: Install Node
    uses: actions/setup-node@v2
    with:
    node-version: '14.x'

    - name: Cache node modules
    uses: actions/cache@v2
    env:
    cache-name: cache-node-modules
    with:
    # npm cache files are stored in `~/.npm` on Linux/macOS
    path: ~/.npm
    key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
    ${{ runner.os }}-build-${{ env.cache-name }}-
    ${{ runner.os }}-build-
    ${{ runner.os }}-

    - name: Install Dependencies
    run: npm install

    - name: Build
    run: npm run build

    - name: Deploy
    uses: peaceiris/actions-gh-pages@v3
    with:
    deploy_key: ${{ secrets.BLOG_DEPLOY_KEY }}
    publish_dir: ./public
    external_repository: DWCarrot/DWCarrot.github.io
    publish_branch: master
    destination_dir: blog

    注意几个要点:

    1. 可以注意到步骤中没有显式安装hexo的步骤。这是因为自动构建时是局部安装hexo的,受到blog source下的package.json控制。
      本次做的是迁移,就是之前已有的blog源文件是包含这个package.json的,迁移时把有效文件粘过来就行。如果是要重开一个全新的blog,现在能想到的方法是:全局hexo init <blog-name>先初始化一个模板然后整体复制过去。
      在迁移完成后的blog源文件中,可以执行 npm install -> npm run build | ./node_modules/bin/hexo generate 来进行构建,不用全局的hexo,这样可以测试在Github Actions上能不能正常工作。
    2. 步骤Deploy中参数说明:
      • deploy_key:后面的变量就是blog源文件repo的secrets 设置的变量,即那个密钥私钥;
      • publish_dir:与_config.ymlpublic_dir对应;
      • external_repositorypublish_branch:部署目标repo及branch;
      • destination_dir:部署目标repo的目标子文件夹。注意因为用到子文件夹所以_config.ymlroot还是要保持一致的;

TODO

  • Github Actions 里面 actions/cache的正确使用方式
  • 把小工具也迁移出去
Author: DWCarrot
Link: https://dwcarrot.github.io/blog/2021/11/25/Hexo-blog-trial-2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.