博客自动发布方案
2024-8-1
·
hexer

我想了一套obsidian与博客的同步方案,在obsidian里写文章,提交到github后blog自动更新

前情提要

我的博客一般是先在obsidian里写,位置放在public/blog/中,已经用obsidian的模板插入了frontmatter,然后直接复制到blog中,因为文章需要d2所以需要blog项目在本地生成svg后再上传

一般来说比较繁琐,但是文章其实我之前写的并不多,而较为繁琐的过程反而加深了”仪式感”,对此我并没有异见,反而滋滋有味

但是在写gitlab ci脚本的时候突然想到github action似乎是可以跨仓库访问推送的,那么完全可以用github action自动完成上面的事情

流程

由于我的blog是发布到serverless平台的,d2部分就不放在github action中了

Diagram

blog 仓库配置

我的两个仓库都是私有的

为了让ob仓库访问到blog仓库,需要提前创建用于访问的token

  1. SettingsDeveloper Settings中创建对blog仓库的访问token,并设置对仓库的读写权限
  2. 在ob仓库中,在Settings中,secrets and variables下,设置action的单独的 secrets 变量(就是步骤1中获得的token),命名为BLOG_ACCESS_TOKEN

这样就行了,BLOG_ACCESS_TOKEN在下一步要用到,而token最长时间也就1年,到时候需要更新

github action 配置

在ob仓库中创建.github/workflows/sync-blog.yml,并写入

name: 博客文章同步

on:
  push:
    branches:
      - master # 当本仓库的master分支push的时候触发

jobs:
  build:
    runs-on: ubuntu-latest # 使用ubuntu容器
    
    steps:
      - name: 拉取docs代码
        uses: actions/checkout@v4 # 拉取ob仓库的master分支代码,置于./下
        with:
          ref: master

      - name: 拉取blog代码
        uses: actions/checkout@v4
        with:
          repository: <<you/blog-repo>> # 拉取blog仓库的master分支代码,置于./blog-dir下
          token: ${{ secrets.BLOG_ACCESS_TOKEN }}
          path: blog-dir
          ref: master

      - name: 同步文章
        run: cp -r ./public/blog/* ./blog-dir/src/content/posts/

      - name: 更新到blog仓库 # 如果发现了有更新再提交,没有更新就不提交
        run: |
            cd blog-dir
            if [ -n "$(git status --porcelain)" ]; then
                git config --global user.name "github-actions[bot]"
                git config --global user.email "github-actions[bot]@users.noreply.github.com"
                git add .
                git commit -m "docs: 从docs同步文章"
                git push
            else
                echo "No changes to commit"
            fi
        env:
            GITHUB_TOKEN: ${{ secrets.BLOG_ACCESS_TOKEN }}

需要设置自己的you/blog-repo

这个yml就不再赘述了,不熟悉的可以查阅文档

关于d2

我是将服务部署到了云平台,如果是部署到自己的web服务器那就直接在服务器上安装d2就行了,剩下的就可以用github action自动同步编译后的文件

部署到了云平台的话,由于d2的安装命令只需一行,无需编译安装,故只需要在npm run build之前执行curl -fsSL https://d2lang.com/install.sh | sh -s --就行了。也就是说,构建命令由npm run build变成curl -fsSL https://d2lang.com/install.sh | sh -s -- && npm run build

总结

我其实还想了别的同步方案:

  • 子模块,将博客文章专门放到一个子模块(缺点是麻烦
  • 通过headless cms,blog站点远程获取(对现在的文章结构改变太大,还要改blog代码
  • 写一个插件,当带有”blog”标签的文章都自动发布到网站

在我看来还是直接用github action省心的多