之前的个人博客是在本机上使用 hexo 搭建的.每次编辑文章,都要打开电脑先写 markdown, 然后执行 hexo 命令发布到 github page.
这样的操作很难发挥个人积极性,毕竟要写笔记、还要写博客.最近正在看 obsidian dateview, 然后就想如果笔记 obsidian 和 hexo 结合起来,那不就完美了.
所以本文就是在 obsidian 中写 markdown 文章,然后交由 github action 执行 hexo 发布到 github page.
1、hexo 生成站点
这一步省略,之前我的站点已经生成好了,使用的 anzhiyu 主题,看着还不错.
2、github action 配置
以下是之前配置的 github action
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
| name: Hexo CI CD on: workflow_dispatch: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ uses: actions/checkout@v2 with: persist-credentials: false submodules: recursive - name: "Using Special Node Version" uses: actions/setup-node@v2 with: node-version: "12"
- name: Generate Hexo site ⚗️ run: | echo "Github Action Env Checking..." echo "Node Version: `node -v`" echo "Coping theme config file" CONFIG_FILE="_config.yml" NEXT_THEME_FILE="next.theme.yml" THEME_DIR="themes/next" TARGET_FILE="${THEME_DIR}/${CONFIG_FILE}" echo "Copying theme config file" cp "${NEXT_THEME_FILE}" "${TARGET_FILE}" head -n 1 "${TARGET_FILE}" # Install dependencies && update env echo "Install npm dependencies" npm i echo "Load hexo binary..." export PATH="$PATH:./node_modules/.bin" echo "Hexo version: $(hexo -v)" echo "Gulp version: $(gulp -v)" echo "Gulp Tasks" && gulp --tasks # Generate site && minify site files, such as: html, js, css hexo g --debug && gulp
- name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.6.2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BRANCH: gh-pages FOLDER: public/ CLEAN: true PRESERVE: true
|
这次将 github action 也一并更新了下
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
| name: Hexo CI CD on: workflow_dispatch: push: branches: - main permissions: contents: write jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive - name: "Using Special Node Version" uses: actions/setup-node@v4 with: node-version: "22.6.0" - name: Generate Hexo site ⚗️ run: | echo "Github Action Env Checking..." echo "Node Version: `node -v`" echo "Coping theme config file" # Install dependencies && update env echo "Install npm dependencies" npm i # Generate site npm run build
- name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@v4.6.1 with: token: ${{ secrets.HEXO_TOKEN }} branch: gh-pages folder: public/ ssh-key: ${{ secrets.DEPLOY_KEY }}
|
这里配置好一般在 hexo 站点根目录执行 npx hexo build --debug
就行
3、obsidian 配置
因为我的站点已经发布到 github 仓库, 所以只需要将其 clone 到本地 vault 就行.
1 2 3 4
| 50 🛰️ Resource 60 🌲 🍍 ShuttleSpace.github.io ...
|
这里obsidian 只显示 git 仓库的 _resource, scaffolds, source
目录
然后下载 obsidian-git 插件,配置 git 的根目录为 60 🌲 🍍/ShuttleSpace.github.io
因为 hexo 创建文章是有模版的, 一般是在 scaffolds/post.md
. 所以这里配置 Templater
插件将 60 🌲 🍍/ShuttleSpace.github.io/source/_posts
目录下创建 md 的模版设置为 60 🌲 🍍/ShuttleSpace.github.io/scaffolds/post.md
由于 hexo 的模版格式和 obsidian templater 不一样,所以这里的模版需要修改下
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
| --- title: <% tp.file.title %> date: <% tp.file.creation_date() %> updated: <% tp.file.last_modified_date() %> permalink: top: 0 comments: copyright: true tags: categories: keywords: description: --- <%* let newTitle = tp.file.title; if (newTitle.startsWith("Untitled") || newTitle.startsWith("未命名")) { newTitle = await tp.system.prompt("Title"); if (!newTitle) { new Notice("Title is required!"); return; } } await tp.file.rename(newTitle); tp.hooks.on_all_templates_executed(async () => { await app.fileManager.processFrontMatter( tp.file.find_tfile(tp.file.path(true)), (frontmatter) => { frontmatter["title"] = newTitle; } ); }); app.workspace.on('editor-change', async (info) => { tp.hooks.on_all_templates_executed(async () => { await app.fileManager.processFrontMatter( tp.file.find_tfile(tp.file.path(true)), (frontmatter) => { frontmatter["updated"] = tp.file.last_modified_date(""); } ); }); }) tp.hooks.on_all_templates_executed(() => { app.commands.executeCommandById("obsidian-linter:lint-file"); }); -%>
|
这里主要使用 templater 修改了文件名,并且修改 frontmatter 的 title 属性.否则 hexo 渲染出来的网页标题就是 [object Object]
同时注意: 修改 frontmatter 需要在 tp.hooks.on_all_templates_executed
回调中执行,否则修改是没有效果的.
4、编辑发布
然后在 60 🌲 🍍/ShuttleSpace.github.io/source/_posts/
目录新建文章,command + p
调用 git: commit and sync
提交即可
好处
可以随时编辑文档,然后同步 obsidian 文档(这里使用 Remote Savely + COS). 等到了电脑上调用 Obsidian: git commit and sync
即可触发 github action 构建发布.
问题
1、github action deploy 报错 invalid username or passwd
需要在站点仓库的 Actions/Settings
页配置
General
页 Workflow permissions
选择 Read and write permissions
ssh-keygen -t rsa -m pem -b 4096 -C "mail"
生成 ssh 密钥
- 在
Deploy keys
中添加公钥
- 在
Secrets and variables
中的 Repository secrets
中添加 DEPLOY_KEY
, 内容为密钥的文本