リポジトリ分離
C: リポジトリを分ける場合の詳細
基本的な流れは コンテンツとサイトを分ける にあります。ここでは、その手順で触れていない点を補います。
Vault をプライベートリポジトリに置く
git initの後、最初の push より前に GitHub にプライベートリポジトリを作ります。.obsidian/は Obsidian が Vault を開いたときに生成されます。push してしまっても、content.excludeに.obsidian/**を入れればサイトのビルドには含まれません。Git で追跡したくない場合は、.obsidian/workspace*.jsonだけを gitignore する折衷案もあります。- 非公開ノートの基本は
publish: trueを付けないことです。さらに、content.excludeで非公開フォルダ(例:private/**)を除外し、読み込み自体を防ぐ二重の対策を取ります。 publishStrategyは既定のexplicitのままにします。selectiveは「ほぼすべてを公開し、例外だけ隠す」モデルで、非公開の Vault ではリスクが高くなります。
コンテンツの取得とデプロイの起動は別に考える
--github-actions で生成される既定のデプロイワークフローは、サイトリポジトリだけをチェックアウトします。
方法1: 追加チェックアウトと repository dispatch を組み合わせる(自動デプロイならこちらを推奨)
- name: Check out the site
uses: actions/checkout@v4
- name: Check out the notes
uses: actions/checkout@v4
with:
repository: <you>/notes
token: ${{ secrets.RIEBECKITE_CONTENT_READ_TOKEN || github.token }}
path: content
path: contentにしたら、content.directoryは"content"にします。- このチェックアウトでは、サイトのワークフローが始まった後にしかファイルを利用できません。サイトのワークフローに
repository_dispatch: types: [content-updated]を追加し、コンテンツリポジトリ側には、mainへの push でサイトのワークフローを起動する通知ワークフローを置きます。 - 記事の更新で既定ブランチの最新コンテンツをデプロイしたい場合は、
refを指定しないでください。チェックアウトはその時点の先頭を読みます。既定のfetch-depth: 1で十分です。
コンテンツのチェックアウトとデプロイの起動は、別の話です。
コンテンツリポジトリをチェックアウトする
≠
コンテンツが更新されたらビルドを開始する
チェックアウトは、ワークフローが始まった後にコンテンツを読めるようにするだけです。コンテンツリポジトリへの push でサイトも自動デプロイしたいなら、サイトのワークフローを起動する仕組みが別に必要です。
Diagram source
flowchart LR
Push["コンテンツリポジトリ<br/>push"]
Notify["notify-site"]
Dispatch["repository_dispatch<br/>content-updated"]
Workflow["サイトのワークフロー"]
Checkout["コンテンツのチェックアウト"]
Build["ビルド"]
Deploy["デプロイ"]
Push --> Notify
Notify --> Dispatch
Dispatch --> Workflow
Workflow --> Checkout
Checkout --> Build
Build --> Deploy
追加チェックアウトで ref を固定しなければ、コンテンツリポジトリの既定ブランチの最新状態を取得します。記事の更新をそのままサイトに反映したい場合に便利です。
コンテンツの main
↓
push
↓
サイトのワークフロー
↓
その時点の最新コンテンツ
既定の fetch-depth: 1 で足ります。サイトが使うコンテンツのコミットを厳密に固定したい場合は、Git サブモジュールを使ってください。
方法2: Git サブモジュールを使う
cd my-site
git submodule add git@github.com:<you>/notes.git content
contentは記事リポジトリへのリンクになります。riebeckite.config.tsのdirectoryはcontentに合わせます。- ワークフローの
actions/checkout@v4にsubmodules: recursiveを追加し、CI が依存先を取得するようにします。 - サブモジュールが参照するコミットはサイトリポジトリに記録されます。記事を更新するには、サイト側で参照を更新し、コミットして push するという2段階の操作が必要です。
cd content && git pull
cd ..
git add content
git commit -m "update articles"
git submodule update --remote を使えばリモートの最新に追従できますが、サイト側のコミットはやはり必要です。
2つの方法を比べる
| 観点 | 方法1(追加チェックアウト) | 方法2(サブモジュール) |
|---|---|---|
| 記事の push で自動デプロイ | repository dispatch を設定すれば可能 | 不可(参照を更新する必要がある) |
| 取得先 | path: content、directory: "content" |
directory: "content" に固定 |
| 履歴の固定 | ブランチの先頭に追従する | 特定のコミットを固定できる |
| ローカルでの操作 | 通常の clone で済むことが多い | submodule update が必要 |
| 向いているケース | 記事の更新が中心のワークフロー | 記事のリビジョンをサイト側で固定したい場合 |
記事の更新が多いなら方法1が扱いやすく、サイト側で履歴を固定したいなら方法2が向いています。
CI からプライベートリポジトリを読むための認証
github.tokenの権限は現在のリポジトリに限定されます。別の公開 GitHub リポジトリは読めますが、別のプライベートまたは内部リポジトリは読めません。- Vault がプライベートまたは内部にある場合は、サイトリポジトリに
RIEBECKITE_CONTENT_READ_TOKENを登録します。Vault だけに権限を絞った fine-grained PAT に Contents: read を付けるか、同等の読み取り専用 GitHub App インストールトークンを使います。 - コンテンツ側の通知には、コンテンツリポジトリだけに保存する
SITE_DISPATCH_TOKENが別に必要です。fine-grained PAT はサイトリポジトリだけに絞って Contents: read and write を付けてください。クラシック PAT ではrepoスコープ、GitHub App トークンでは Contents: write が必要です。 - サブモジュールを SSH URL(
git@github.com:...)で追加した場合、CI には SSH キーが必要です。HTTPS URL に切り替えてtoken:を渡すほうが設定は簡単です。
読み取りトークンと dispatch トークンは、使う向きが逆です。
Diagram source
flowchart LR
Site["サイトリポジトリ"]
ReadToken["RIEBECKITE_CONTENT_READ_TOKEN<br/>Contents: read"]
Content["プライベートコンテンツリポジトリ"]
Site --> ReadToken
ReadToken --> Content
Diagram source
flowchart LR
Content["コンテンツリポジトリ"]
Token["SITE_DISPATCH_TOKEN"]
Site["サイトリポジトリ"]
Content --> Token
Token -->|"repository_dispatch"| Site
RIEBECKITE_CONTENT_READ_TOKEN
→ サイトからプライベートコンテンツを読む
SITE_DISPATCH_TOKEN
→ コンテンツリポジトリからサイトのワークフローを起動する
PAT は GitHub の Settings → Developer settings → Personal access tokens で作成し、各リポジトリの Settings → Secrets and variables → Actions に値を登録します。
- name: Check out the notes
uses: actions/checkout@v4
with:
repository: <you>/notes
token: ${{ secrets.RIEBECKITE_CONTENT_READ_TOKEN || github.token }}
path: notes
ローカルと CI でディレクトリ構成を揃える
相対 directory は appRoot 基準なので、ローカルと CI で構成が違えば解決先も変わります。
| 環境 | 配置 | directory |
|---|---|---|
| ローカル(並列) | workspace/notes と workspace/my-site |
"../notes" |
| CI(追加チェックアウト) | my-site/notes |
"notes" |
| サブモジュール | my-site/content |
"content" |
ローカルでは ../notes、CI では notes と値を変えれば、どちらも同じ Vault を指します。1つの値に統一したい場合は、ローカルでも Vault を my-site の下に置くか、CI 側で ../notes になるように配置してください。