[ユースケース] Obsidian Vault と Quartz を分離した状態で Cloudflare Pages にデプロイする
はじめに
Obsidian で書いた Markdown について Quartz(静的サイトジェネレータ)を利用して Cloudflare Pages へデプロイしています。
この記事では、1 つのユースケースとして上記の構成についてまとめます。
扱うことと扱わないこと
- 扱うこと
- 今回のユースケースにおける全体構成
- GitHub Actions の設定
- submodule の注意点
- 構成のメリデメ
- 扱わないこと
- Quartz の概要
- Obsidian の概要
この記事を書こうとおもった背景
Obsidian Vault を Quartz でデプロイするにあたって、先駆者の方々の構成を知るためにブログ記事をいろいろと調べました。
しかし、 Obsidian と Quartz を submodule をつかって分離しながらデプロイする
、という自分にとって丁度よい記事がみつかりませんでした。
そのため、 上記構成の一例としてこの記事を残しています。
全体構成
Obsidian Vault と Quartz を別リポジトリにする
異なる 2 つのリポジトリを利用しています。
- ganyariya-obsidian
- private repository
- Obsidian Vault であり Markdown ファイルを管理する
- ganyariya-obsidian-quartz
- public repository
- Quartz4 を
clone
orUse This Template
でもってきたもの -
/content
フォルダに対してganyariya-obsidian
を submodule で登録する
ganyariya-obsidian
ganyariya-obsidian-quartz
ganyariya-obsidian はただの Obsidian Vault であり、 Markdown を普段通り管理するリポジトリです。
Quartz4 のことはできるだけ意識していません。ただし、 YAML frontmatter については意識しており、 title
date
などを設定しています。
ganyariya-obsidian-quartz は Quartz4 を Use This Template
でもってきたものです。
Quartz4 では /content
フォルダに Markdown を入れることで静的サイトとして生成されます。
そのため、このフォルダに ganyariya-obsidian を submodule として登録しています。
GitHub Actions の設定
ganyariya-obsidian に新しいノートを push したときに、その変更を自動的に ganyariya-obsidian-quartz へ伝えたいです。
そのため、repository_dispatch
イベントで ganyariya-obsidian-quartz へ最新化してほしい旨を伝えています。
PAT の発行
private リポジトリかつ異なるリポジトリへイベントを飛ばすためには Personal Access Token (PAT) が必要です。
ganyariya の場合は ganyariya-obsidian-(quartz)?
のために共通のトークンを発行しています。
自分の場合は Fine Grained Access Token でトークンを発行しました。
発行したトークンは後続する GitHub Actions ジョブの secrets.OBSIDIAN_QUARTZ_TOKEN
として登録します。
- Only select repositories
- ganyariya-obsidian
- ganyariya-obsidian-quartz
- Contents: Read & Write
- Metadata: Read
- Actions: Read & Write (必要ないかもしれません)
ganyariya-obsidian 側の設定
workflow_dispatch
(手動トリガー) もしくは main ブランチが更新されたときに発火されます。
発火すると ganyariya-obsidian-quartz に obsidian-updated
というイベントを飛ばします。
name: dispatch-obsidian-updated
on:
workflow_dispatch:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Dispatch event to ganyariya-obsidian-quartz
uses: peter-evans/repository-dispatch@v3
with:
event-type: obsidian-updated
token: ${{ secrets.OBSIDIAN_QUARTZ_TOKEN }}
repository: ganyariya/ganyariya-obsidian-quartz
ganyariya-obsidian-quartz 側の設定
obsidian-updated
というイベントをどこかのリポジトリ、今回では ganyariya-obsidian
から受け取ったら発火します。
やっていることは、もし /content
remote submodule に変更があったら最新化して main ブランチにコミットするのみです。
name: update content submodule
on:
repository_dispatch:
types: [obsidian-updated]
jobs:
update-submodule:
runs-on: ubuntu-latest
steps:
- name: checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
token: ${{ secrets.OBSIDIAN_QUARTZ_TOKEN }}
- name: update submodule
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git submodule update --remote --recursive
git add .
if [ -z "$(git status --porcelain)" ]; then
echo "No changes detected in submodule."
exit 0
fi
git commit -m "🔄 Update obsidian content submodule"
git push
Cloudflare Pages における submodule の注意点
今回のケースにおいては ganyariya-obsidian-quartz が private リポジトリになっています。
ここで、Cloudflare Pages において、 private リポジトリを HTTPS 認証で submodule として登録すると clone 時に認証エラーが発生してしまいます。
そのため、ろぼいんさんの記事を参考に private リポジトリを SSH 認証で submodule 登録することにしました。
やったことは url 設定を git@
に書き換えるのみです。
[submodule "content"]Add commentMore actions
path = content
- url = https://github.com/ganyariya/ganyariya-obsidian
+ url = git@github.com:ganyariya/ganyariya-obsidian
また、 Cloudflare Pages の GitHub App が private リポジトリへのアクセスできる必要があります。
アクセス権限について確認するには、 GitHub Installations の Cloudflare Workers & Pages の設定を確認してください。
Cloudflare Workers & Pages GitHub App が該当の private リポジトリへの Read Access をもっていれば問題ありません。
この構成のメリットとデメリット
- メリット
-
記事
とQuartz 設定
を分離できる- コミット履歴がそれぞれきれいになる
- Obsidian Vault が Quartz をできるだけ意識しなくてよい
- Quartz のバージョンが将来あがったときに受け身がとりやすい
-
- デメリット
- リポジトリがわかれるため、切り替えが少し面倒
まとめ
今回のユースケースでは、 Obsidian と Quartz4 の内容をそれぞれ分離できます。
もしリポジトリを分けたいかたがいらっしゃればご参考ください。
不明点や誤字・不備がありましたらコメントいただければありがたいです。
Discussion