我想了一套obsidian与博客的同步方案,在obsidian里写文章,提交到github后blog自动更新
前情提要
我的博客一般是先在obsidian里写,位置放在public/blog/
中,已经用obsidian的模板插入了frontmatter,然后直接复制到blog中,因为文章需要d2〰所以需要blog项目在本地生成svg后再上传
一般来说比较繁琐,但是文章其实我之前写的并不多,而较为繁琐的过程反而加深了”仪式感”,对此我并没有异见,反而滋滋有味
但是在写gitlab ci脚本的时候突然想到github action似乎是可以跨仓库访问推送的,那么完全可以用github action自动完成上面的事情
流程
由于我的blog是发布到serverless平台的,d2部分就不放在github action中了
blog 仓库配置
我的两个仓库都是私有的
为了让ob仓库访问到blog仓库,需要提前创建用于访问的token
- 在
Settings
的Developer Settings
中创建对blog仓库的访问token,并设置对仓库的读写权限 - 在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省心的多