背景
由于历史原因,我的文章,文档,几乎所有的文本内容都存放在以下工具中:
- Obsidian:目前的主力写作工具,几乎提供了所有我需要的功能,拥有良好的写作体验,数据存放在私有的GitLab仓库中
- Outlne:Obsidian之前的工具,内容过多,没有全部迁移到Obsidian,数据存在PostgreSQL数据库中
- Hugo:用于发布公开的文章到博客,数据存在私有的GitLab仓库
我想将所有的文本内容存放在一个地方,现在的做法是,Hugo仓库作为Obsidian仓库的一个submodule;这样做缺点很明显,Hugo中有许多资源文件,不应该出现在Obsidian中,对于搜索来说很不方便,而且每次都要提交两个仓库。
于是,我设计了一个新的方案,如图所示:
flowchart LR
A(Obsidian) --1. commit--> B(GitLab Obsidian Repo) --2. GitLab CI/CD--> C(GitLab Hugo Repo) --3. mirror--> D(GitHub Private Repo) --4. build--> E(CloudFlare Pages)
- Obsidian写作完成,提交到GitLab
- Obsidian仓库通过CI/CD功能,将公开发表的文章,整合到Hugo仓库
- Hugo镜像到GitHub私有仓库
- CloudFlare从GitHub仓库构建Hugo博客,并发布到CloudFlare Pages
在该方案中,Hugo Repo只负责维护配置和页面,而文章内容来自于Obsidian。不要问我为什么搞这么复杂,详情可以查看关于写作和博客。
难点
这个方案的难点主要是数据转换,体现在如下两点:
- Obsidian中的文档和附件结构,需要转换到适合Hugo的结构
- Obsidian文档中的图片和参考链接修改
迁移过程
- 将Hugo模版迁移到Obsidian,主要是修改和新增一些数据字段
- 迁移Hugo文章到Obsidian,并修改Front Matter中的字段,最后删除Hugo的
content/posts
下的子文件夹 - 为Obsidian仓库添加GitLab CI/CD,编写脚本自动修改Obsidian中的文章,并提交到Hugo仓库
最后
更新了该文章,提交一次Obsidian仓库,我的博客就自动更新了,体验非常丝滑。