前提
Quartz4 の content に private submodule を配置した状態で Cloudflare Pages にデプロイする
上記のように
- ganyariya-obsidian
- private repository
- ノートを管理する vault
- ganyariya-obsidian-quartz
- quartz を fork / use this template したブログ専用リポジトリ
- content フォルダに
ganyariya-obsidian
を submodule として登録する
を行っています。
行いたいこと
ganyariya-obsidian でノートを書いたときは main ブランチに push します。 ここで main ブランチが更新されたら ganyariya-obsidian-quartz の content submodule を最新にしたいです。
GitHub Actions の workflow_dispatch を利用する
repository-dispatch を利用して ganyariya-obisidian から ganyariya-obsidian-quartz へイベントをディスパッチします。
ちらっと main.ts をみたのですが、中身は非常にシンプルで 隙間産業
はよい個人開発の選択肢だなと思いました。
url: https://github.com/peter-evans/repository-dispatch?tab=readme-ov-file#token
title: "GitHub - peter-evans/repository-dispatch: A GitHub action to create a repository dispatch event"
description: "A GitHub action to create a repository dispatch event - peter-evans/repository-dispatch"
host: github.com
favicon: https://github.githubassets.com/favicons/favicon.svg
image: https://opengraph.githubassets.com/6996c4e97af20816fe179ea0da13f24ea1a4ae49aa68e5fef699273663b9085a/peter-evans/repository-dispatch
token を発行する
異なるリポジトリ間をまたぐ & private リポジトリの場合は PAT の発行が必要です。 Fine Grained Access Token を以下のように発行します。
- Contents
- Read & Write
- Metadata
- Read
- Actions (いらないかも)
- Read & Write
このトークンを 両方のリポジトリに OBSIDIAN_QUARTZ_TOKEN
として登録します。
GitHub Actions を設定する
ganyariya-obsidian
obsidian-updated
イベントを ganyariya-obsidian-quartz に対して発行します。
workflow_dispatch
も設定することで手動でイベントを飛ばせるようにもします。
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 イベント受け取ったときに content サブモジュールを最新化します。 変更があったら commit して push します。
ganyariya-obsidian-quartz/v4 (default branch) に変更があると Cloudflare Worker & Pages アプリが変更を検知して Cloudflare 側でビルドを実行してくれます。 これによって、 ganyariya-obsidian の変更を検知してメモブログサイトを更新できます。
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