ワークフロー
ワークフローの処理順
生成されるデプロイワークフローは、おおむね次の順に処理を進めます。
Diagram source
flowchart TD
Start["ワークフロー開始"]
CheckoutSite["1. サイトをチェックアウト"]
CheckoutContent["2. 外部コンテンツをチェックアウト<br/>必要な場合のみ"]
Node["3. Node.js 22"]
Install["4. npm ci"]
Cache["5. Riebeckite のキャッシュを復元"]
Check["6. riebeckite check"]
Build["7. riebeckite build"]
Deploy["8. Cloudflare へデプロイ"]
Start --> CheckoutSite
CheckoutSite --> CheckoutContent
CheckoutContent --> Node
Node --> Install
Install --> Cache
Cache --> Check
Check --> Build
Build --> Deploy
1. サイトリポジトリをチェックアウトする
最初にサイトリポジトリを取得します。
GitHub ランナー
↓
サイトリポジトリ
ここには次のものが含まれます。
2. 外部コンテンツをチェックアウトする
コンテンツが同じリポジトリにある場合、この追加手順は不要です。
別リポジトリを使っている場合は、コンテンツリポジトリを content/ へチェックアウトします。
ランナー
サイトリポジトリ
├─ app/
├─ riebeckite.config.ts
├─ package.json
└─ content/ ← 外部のコンテンツリポジトリ
その場合、Riebeckite 側では次のように読み込めます。
content: {
directory: "content",
},
3. Node.js をセットアップする
生成されるワークフローでは Node.js 22 をセットアップします。
GitHub ランナー
↓
Node.js 22
以降の npm ci と Riebeckite CLI は、この環境で実行されます。
4. パッケージをインストールする
次のコマンドを実行します。
npm ci
npm ci は package-lock.json に従って依存パッケージをインストールします。そのため、生成されたワークフローを使う場合は package-lock.json をコミットしておく必要があります。
5. Riebeckite のビルド状態を復元する
生成されるワークフローは、増分 SSG に必要な状態を1つの actions/cache 手順で復元します。
.riebeckite/cache:Markdown とプラグインの処理キャッシュ.riebeckite/build/content-state.json:増分ビルドの状態.riebeckite/ssg-output-cache.jsonと.riebeckite/ssg-output-cache.entries:SSG 出力キャッシュ。描画済みのルートとファイル、およびそのエントリの blob を保持します.riebeckite/ssg-output-cache.fast-path.json:変更なしのファストパスを検証するためのサイドカー
キャッシュキーは、ランナーの OS、Node.js のバージョン、package-lock.json のハッシュ、riebeckite.config.ts のハッシュで範囲を絞り、実行ごとの世代として保存されます。
riebeckite-build-v2-<os>-node<node>-<lockfile hash>-<config hash>-<run id>-<run attempt>
restore-keys は、互換性のある直近の世代へ2段階でフォールバックします。まず lockfile と config のハッシュが一致する世代、次に lockfile のハッシュだけが一致する世代です。lockfile のハッシュはインストールされる Riebeckite のバージョンを、config のハッシュはプリセットとプラグインの設定を反映します。どちらかが変わると新しいキャッシュ系列が始まりますが、実際に再利用するかどうかは Riebeckite 自身のフィンガープリント検証(スキーマバージョン、アプリ/パイプライン/コンテンツのフィンガープリント、プラグインの cacheVersion)が決めます。
エントリがその場で上書きされることはありません。各実行が新しい世代を保存し、古い世代は GitHub が自動的に削除します。キャッシュは OS や Node.js のバージョンをまたいで共有されないため、環境が変われば互換性のないエントリを再利用せず、コールドビルドになります。dist/ はキャッシュしません。
Riebeckite が復元した出力キャッシュを拒否した場合(キャッシュがない、キャッシュが壊れている、アプリケーションのフィンガープリントが変わった、unknown の出力依存関係がある、全体を再生成する必要がある、キャッシュされたエントリのない出力がある)は、すべての出力を描画し直して dist/ を最初から書き直します。そのため、古いキャッシュや不完全なキャッシュがデプロイに混入することはありません。キャッシュミスは安全で、コールドビルドになるだけです。
ビルド後は、新しいキャッシュ世代が自動的に保存されます。ビルドログの Persistent content cache 行にある hits、misses、bypasses はコンテンツ処理を再利用したかどうかを、SSG outputs 行の rendered、reused、removed は描画済み出力を再利用したかどうかを示します。
.riebeckite/ を削除するか、ワークフローのキャッシュ手順を外すと、次回はコールドビルドになりますが、出力の正しさには影響しません。コンテンツキャッシュは残したまま、出力キャッシュの転送だけを省きたい場合は、キャッシュ手順から .riebeckite/ssg-output-cache* の3つのパスを外してください。次回はすべての出力が再描画されます。
ワークフローは復元・保存したキャッシュのサイズも出力するので、転送コストを確認できます。キャッシュの保存に失敗した場合や省略された場合でも、デプロイは実行されます。
6. サイトを検証する
次のコマンドを実行します。
npm exec riebeckite check
設定やプラグインの解決に問題があれば、デプロイ前にここで失敗します。
チェックアウト
↓
インストール
↓
check
↓
問題があれば停止
壊れた設定のままデプロイしないための確認です。
7. サイトをビルドする
check が成功したら、次のコマンドを実行します。
npm exec riebeckite build
Riebeckite が公開用の dist/ を生成します。
コンテンツ
設定
プラグイン
テーマ
↓
riebeckite build
↓
dist/
8. Cloudflare Workers へデプロイする
最後に、cloudflare/wrangler-action@v3 を使って Cloudflare Workers へデプロイします。
cloudflare/wrangler-action@v3
Diagram source
flowchart LR
Dist["dist/"]
Wrangler["wrangler-action"]
Workers["Cloudflare Workers"]
Site["公開サイト"]
Dist --> Wrangler
Wrangler --> Workers
Workers --> Site
ここでは次のシークレットが使われます。
CLOUDFLARE_API_TOKEN
CLOUDFLARE_ACCOUNT_ID
公開状態
ワークフローは、最後に成功した公開スナップショットを main ではなく専用の publication-state ブランチに保存します。ビルド前にそのブランチの state.json を runner の一時ディレクトリへコピーし、RIEBECKITE_PUBLICATION_STATE をそこへ向けます。デプロイ成功後にだけ1つのコミットをブランチへ push し、失敗時は何も書きません。ワークフローがソースブランチを進めることはないため、次の git push に pull や rebase は不要です。publication-state を開発ブランチへマージしないでください。publication/state.json をコミットしていた旧ワークフローからの移行は 公開ワークフロー を参照してください。
プライベートなコンテンツリポジトリを使う
コンテンツリポジトリがパブリックかプライベートかで、チェックアウト時の認証方法が異なります。
プライベートなコンテンツリポジトリを読むには、サイトリポジトリに RIEBECKITE_CONTENT_READ_TOKEN を設定します。
RIEBECKITE_CONTENT_READ_TOKEN
Diagram source
flowchart LR
Site["サイトリポジトリ"]
Token["RIEBECKITE_CONTENT_READ_TOKEN"]
Content["プライベートなコンテンツリポジトリ"]
Site --> Token
Token -->|"read"| Content
このトークンは、サイトのワークフローからプライベートなコンテンツリポジトリを読み込むためのものです。
2つのトークンを使い分ける
リポジトリを分離すると、名前の似た2つのトークンが登場します。用途が異なるので、混同しないよう注意してください。
| シークレット | 保存する場所 | 役割 |
|---|---|---|
RIEBECKITE_CONTENT_READ_TOKEN |
サイトリポジトリ | プライベートなコンテンツリポジトリを読む |
SITE_DISPATCH_TOKEN |
コンテンツリポジトリ | サイトリポジトリに更新を通知する |
方向で整理すると区別しやすくなります。
RIEBECKITE_CONTENT_READ_TOKEN
サイト ─────read─────> コンテンツ
SITE_DISPATCH_TOKEN
コンテンツ ───notify───> サイト
つまり、次の関係です。
Diagram source
flowchart LR
Content["コンテンツリポジトリ"]
Site["サイトリポジトリ"]
Content -->|"SITE_DISPATCH_TOKEN<br/>更新を通知"| Site
Site -->|"RIEBECKITE_CONTENT_READ_TOKEN<br/>コンテンツを取得"| Content
サイト更新時とコンテンツ更新時のデプロイ経路
リポジトリを分けると、デプロイ経路は2つになります。
サイトを変更した場合
サイトリポジトリ
↓
main へプッシュ
↓
publish.yml
↓
コンテンツをチェックアウト
↓
ビルド
↓
デプロイ
サイトの push が直接ワークフローを起動します。
コンテンツを変更した場合
コンテンツリポジトリ
↓
main へプッシュ
↓
notify-site.yml
↓
repository_dispatch
↓
サイトの publish.yml
↓
コンテンツをチェックアウト
↓
ビルド
↓
デプロイ
こちらは、コンテンツリポジトリからサイトリポジトリへの通知が1段階増えます。
どちらの場合も、最終的にサイトリポジトリ側でビルドする点は同じです。
デプロイワークフローを手動で実行する
生成されるワークフローは workflow_dispatch にも対応しているため、GitHub の画面から手動で実行できます。
workflow_dispatch
実行手順は次のとおりです。
GitHub
↓
Actions
↓
デプロイワークフロー
↓
Run workflow
コンテンツやサイトに新しいコミットを作らず、現在の状態でもう一度デプロイしたいときに便利です。