前提

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 を以下のように発行します。

Imgur

  • Contents
    • Read & Write
  • Metadata
    • Read
  • Actions (いらないかも)
    • Read & Write

このトークンを 両方のリポジトリに OBSIDIAN_QUARTZ_TOKEN として登録します。

Imgur

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