Publish Site
目次
サイトに版を付けて GitHub / Cloudflare / Netlify の Pages へ公開します。
skill の情報
| 提供元 | 追加 skill — hermes skills install official/web-development/publish-site で入れます |
| パス | optional-skills/web-development/publish-site |
| バージョン | 1.0.0 |
| 作者 | Hermes Agent (Nous Research) |
| ライセンス | MIT |
| 対応プラットフォーム | linux, macos, windows |
| タグ | publish, deploy, hosting, github-pages, cloudflare-pages, netlify, static-site, versioning, rollback, web-development |
参考: SKILL.md 全文
Publish Site
ユーザーが作った(あるいはユーザーのために作った)サイト、ダッシュボード、ウェブアプリを、ユーザー自身のものとして使える置き場所に出します。既定は GitHub Pages で、もっと必要なときは Cloudflare Pages か Netlify を使います。守りかたはこうです。手元で表示して内容の了解をもらい、公開のたびに git のタグで版を付け、置き場所を上から順に試して公開し、公開先の URL を実際に HTTP でたたいて確かめ、いつでも一発で前の版に戻せるようにしておきます。
この skill が扱うのは、静的なサイトと SPA のビルド結果(素の HTML/CSS/JS か、Vite・Next の export・Astro などが吐く dist//build/ フォルダ)です。サーバー側で動くものは対象外です。アカウントの用意なしで使い捨てのサーバーレス公開をしたいときは、追加 skill の cloudflare-temporary-deploy を使ってください。
こんなときに使います
ユーザーから次のような依頼が来たら、この skill を読み込みます。
- サイトをネットに出したい — 「これを公開して」「どこかに置いて」「人に渡せるリンクがほしい」
- 作ったばかりのダッシュボード、レポート、ポートフォリオ、ドキュメントサイト、試作を公開したい
- すでに公開しているサイトを新しい内容に更新したい(出し直すたびに新しい版になります)
- 失敗した公開を前の版に戻したい
- 置き場所を選んでほしい — どこでもいいから URL がほしい
事前に必要なもの
認証を済ませた公開先の CLI が、少なくとも 1 つあること(次の順に確かめます)。
- GitHub Pages(既定):
gh auth statusが通ること。あわせてgitも要ります。 - Cloudflare Pages:
wrangler whoamiが通ること(またはCLOUDFLARE_API_TOKENが設定されていること)。入れかたはnpm i -g wrangler、もしくはnpx wrangler@latestを使います。 - Netlify(代わりの選択肢):
netlify statusが通ること。入れかたはnpm i -g netlify-cli。
あわせて次も要ります。
- 公開する静的な出力の入ったディレクトリ(サイトの直下か、
dist//build/フォルダ)。ビルドが要るプロジェクトなら、先にビルドしてから、その出力のディレクトリを公開します。元のソースを公開してはいけません。 - 手元の表示を人に見せたいとき用に
cloudflared(任意です。自分だけで見るならpython3 -m http.serverで足ります)。
実行のしかた
以下のコマンドはすべて、サイトのプロジェクトのディレクトリから terminal ツールで実行します。流れはいつも同じ 5 手です。
- ビルドする → 2. 表示して内容の了解をもらう → 3. コミットしてタグを打つ(公開の前に版を切る) → 4. 置き場所を上から順に試して公開する → 5. 公開先の URL を
curlで確かめて報告する。
早見表
| 手順 | コマンド |
|---|---|
| 手元で表示する | python3 -m http.server 8080 --directory dist |
| 人に見せる形で表示する | cloudflared tunnel --url http://localhost:8080 |
| 公開に版を付ける | git add -A && git commit -m "deploy: <what>" && git tag deploy-YYYYMMDD-HHMM |
| GitHub Pages(ブランチを使う形) | git subtree push --prefix dist origin gh-pages |
| リポジトリで Pages を有効にする | gh api repos/{owner}/{repo}/pages -X POST -f 'source[branch]=gh-pages' -f 'source[path]=/' |
| Cloudflare Pages | npx wrangler@latest pages deploy dist --project-name <name> |
| Netlify | netlify deploy --prod --dir dist |
| 前の版に戻す | git checkout <previous-tag> -- . && redeploy(または公開先の管理画面から) |
| 公開先を確かめる | curl -sS -o /dev/null -w '%{http_code}' <url> → 200 が返るはずです |
手順
1. ビルドして手元で表示する
必要ならビルドし(npm run build など)、出力のディレクトリを見つけます。そして配信します。
python3 -m http.server 8080 --directory dist人に見せられるリンクがほしいとき(ユーザーが別の端末にいる、公開の前に了解をもらいたい、といった場合)は、terminal の裏で動くセッションでトンネルをさっと開きます。
cloudflared tunnel --url http://localhost:8080https://*.trycloudflare.com の URL をユーザーに渡し、了解をもらってから公開します。終わったらトンネルは止めます。
2. 公開の前に版を切る — 例外なし
公開はすべて git のコミットから出します。そうすれば、どの公開も同じものを作り直せますし、前の版に戻すのも簡単です。
git init 2>/dev/null; git add -A
git commit -m "deploy: <short description>"
git tag "deploy-$(date +%Y%m%d-%H%M)"プロジェクトにリポジトリがすでにあるなら、コミットしてタグを打つだけです。コミットしていないファイルを公開してはいけません。
3. 公開する — 置き場所を上から順に試す
1 段目 — GitHub Pages(既定。無料で、gh の認証が済んでいれば追加のアカウントは要りません):
gh repo create <name> --public --source . --push # skip if repo exists
git subtree push --prefix dist origin gh-pages # publish build output
gh api "repos/{owner}/<name>/pages" -X POST \
-f 'source[branch]=gh-pages' -f 'source[path]=/' # first time onlyサイトは https://<owner>.github.io/<name>/ に出ます。サイトがリポジトリの直下にある(ビルド用のディレクトリがない)場合は、subtree を使わずに main を push し、Pages の元を main にします。ビルドが要って何度も出し直すプロジェクトなら、push するだけで自動的に公開される公式の actions/deploy-pages ワークフローのほうが向いています。
2 段目 — Cloudflare Pages(独自ドメイン、リダイレクトやヘッダーの設定、Functions が要るとき):
npx wrangler@latest pages deploy dist --project-name <name>初回の実行でプロジェクトが作られ、https://<name>.pages.dev の URL が表示されます。独自ドメインは Cloudflare の管理画面(Pages → プロジェクト → Custom domains)で結び付けます。
3 段目 — Netlify(ほかが使えないとき、またはユーザーがすでにここを使っているとき):
netlify deploy --prod --dir dist--prod を付けない netlify deploy --dir dist は下書きの URL を返します。2 段目の確認用として使えます。
4. 前の版に戻す
前の版に戻すとは、前のタグを公開し直すことです。公開されている出力を手で書き換えてはいけません。
git checkout deploy-<previous> -- . # or: git checkout deploy-<previous>; rebuild
# then rerun the same deploy command from step 3Cloudflare Pages と Netlify は、公開ごとの履歴も管理画面に残しています(「Rollback to this deploy」)。CLI がすぐ使えないときは、こちらのほうが早いです。
5. 秘密の値と環境変数
- 秘密の値、API キー、
.envファイルは絶対にコミットしないでください — Pages の置き場所では誰にでも見えてしまいます。最初のコミットの前にgit statusで確かめ、.env*は.gitignoreに入れておきます。 - 実行時の環境変数は、公開先の管理画面に置きます。Cloudflare Pages なら Settings → Environment variables、Netlify なら Site settings → Environment variables です。GitHub Pages は静的なファイルだけで、サーバー側の環境変数はありません。ビルド結果に埋め込まれたものは、その時点で公開されているのと同じです。ユーザーのビルドがキーを埋め込んでいるなら、そのことを伝えてください。
つまずきやすいところ
- GitHub Pages では SPA のルートが 404 になります。 Pages には書き換えの仕組みがありません。出力のディレクトリで
index.htmlを404.htmlにコピーしておくと(cp dist/index.html dist/404.html)、ブラウザ側のルーティングが立て直せます。Cloudflare Pages と Netlify なら_redirects(/* /index.html 200)で SPA に対応できます。 - GitHub Pages は反映が遅れます。 最初に有効にしたあとサイトが出るまで 1〜10 分、そのあとの push は 1 分ほどかかります。最初の 404 で失敗と決めつけず、
curlを数回たたいてから原因を探してください。 - パスの大文字小文字を区別します。 Pages の置き場所は大文字小文字を区別する Linux です。macOS や Windows では動いていたサイトでも、
Logo.PNGと書いた参照先がlogo.pngでコミットされていれば 404 になります。ファイルが 404 になったら、HTML の中で大文字小文字が食い違っていないか探してください。 - プロジェクトのページは URL の途中に名前が入ります。
https://<owner>.github.io/<name>/は/<name>/の下で配信されるので、/app.jsのような絶対パスの参照は壊れます。相対パスにするか、ビルドツールの基準パスを設定してください(vite build --base=/<name>/)。 wranglerの認証にはブラウザが要ります。wrangler loginは OAuth の画面を開きます。画面のないセッションではCLOUDFLARE_API_TOKENを使い(ユーザーが dash.cloudflare.com → API Tokens で作ります)、そのトークンをログに出さないでください。- 独自ドメインは DNS が広まるまで待ちます。 新しい CNAME は数分から数時間かかることがあります。まず公開先の既定の URL(
*.pages.dev、*.netlify.app、*.github.io)で確かめ、独自ドメインはそのあと別に確かめてください。2 つの失敗を一緒くたにしないことです。 - ビルド結果ではなくソースを公開してしまう。 実体が
dist/にあるのにリポジトリの直下を公開すると、ファイル一覧や生の JSX が出てきます。出力のディレクトリにindex.htmlがあることを必ず確かめてください。
動作確認
公開時のログだけを見て成功と報告してはいけません。ユーザーに何かを伝える前に、次を確かめます。
curl -sS -o /dev/null -w '%{http_code}' <live-url>が200を返すこと(GitHub Pages の初回の公開では 2 分ほど繰り返します)。curl -sS <live-url> | head -30に、想定どおりのindex.htmlの中身が出ること。公開先の URL に対してweb_extractを使い、HTML を確かめてもかまいません。- SPA なら、深いところのルート(たとえば
/about)も curl して、404ではなく200が返ることを確かめること。 git tag --list 'deploy-*'に、この公開のタグが出ること。
そのうえで、公開先の URL と、戻すときに使えるタグをユーザーに伝えます。