Skip to main content

Obsidian写博客文章二:自动构建问题

针对Obsidian写博客文章一:基础工具构建 - iIsland最后遗留的问题:多仓库同步并自动构建的问题的解决方案,记录于此文。

结构

博客实际经常变动的部分只有 content,又不想 blog 和普通笔记分开两个obsidian 库,所以最终形成了这样一个结构:

博客文章库->iisland-posts
博客基础库->iisland,posts 作为其子库
普通笔记库->notes,posts 作为其子库

那么平时写博客就需要在 notes 库中进行就可以了,而且这样的结构的一个好处是所有的笔记(包括博客文章)都统一管理,可以统一备份到一个地方。

问题

如果只有一个库,那就是配置好这个库的 ob插件和设置就可以通过 obsidian git 插件自动 push,然后cloudflare 自动构建发布就 OK 了。 现在这种结构下 submodule 的更新,母库不知道,所以就没法实现自动 push,自动构建发布文章了。

解决方案

实现方案主要基于 Github 的 workflow,通过监听子库的 push 动作,子库通过 Github 接口发送repository_dispatch事件。母库接收子库发出的事件,更新子库。

iisland-posts(子库) workflow

name: Blog Content Update Trigger
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger parent repository update 
        run: |
          curl -L \
            -X POST \
            -H "Accept: application/vnd.github+json" \
            -H "Authorization: Bearer ${{ secrets.ACCESS_TOKEN }}" \
            -H "X-GitHub-Api-Version: 2022-11-28" \
            # OWNER/REPO 替换成自己的仓库
            https://api.github.com/repos/OWNER/REPO/dispatches \  
            -d '{"event_type":"content_update_trigger","client_payload":{"message": "${{ github.event.head_commit.message }}" }}'          

iisland(母库) workflow

name: Blog Content Updater
on: 
    repository_dispatch:
        types: [content_update_trigger]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Event Information
        run: |
          echo "Event '${{ github.event.action }}' received from '${{ github.event.client_payload.message }}'"          
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          token: ${{ secrets.ACCESS_TOKEN }}
          submodules: true
      - name: Pull submodule
        run: |
          git pull --recurse-submodules
          git submodule update --init --recursive --remote          
      - name: Push changes
        run: |
          git config --global user.name 'name'
          git config --global user.email 'xxx@gmail.com'
          git add .
          git commit -m "${{ github.event.client_payload.message }}"
          git push          

注意点:

  • secrets.ACCESS_TOKEN 的设置 Github 的项目 settings 里面,找到 Secrets and variables里的 Actions,点击 New repository secret,Name 里面填入ACCESS_TOKEN,Secret 里面填入Personal Access Tokens

  • Obsidian Git 的间隔时间不宜太短,因为 Github 的 Actions 执行需要一定时间

如此,结合 Obsidian Git 插件就可以实现自动提交,自动构建,发布文章了。

调试

在 Github 项目的 Actions 里面就能看到所有 workflow,选择刚新建的 workflow,可以看到 workflow runs,选一个点进去,可以看到workflow 的具体执行信息,点击 build,可以看到具体的 build 步骤,里面有报错以及输出信息。 注意的点是 build 为绿色代表的只是workflow 没有语法错误,如果没有发现 workflow 执行没有达到预期效果,可以查看 workflow 中 build 的详细信息或日志。

参考

GitHub Actions 快速入门 - GitHub 文档
触发工作流的事件 - GitHub 文档 Repositories - GitHub Docs
trigger_submodule_pull.yml
trigger_parent_update.yml