zudo-cloudflare-wisdom
GitHub リポジトリ

検索したい単語を入力

いつでも検索バーを開ける

Pages デプロイ

wrangler pages deploy による静的サイトのデプロイ

Pages プロジェクトの作成

初回デプロイの前に、プロジェクトを作成する:

npx wrangler@4 pages project create zudo-cloudflare --production-branch=main

--production-branch は明示的に渡す。省略すると project create は本番ブランチを必要とし、本来はインタラクティブに尋ねてくる。しかし CI には尋ねる相手の TTY がないため、そこで止まるのではなく Must specify a production branch. で即座に失敗する。

Warning

CI では pages deploy がプロジェクトを自動作成してくれると期待しないこと。Cloudflare 公式ドキュメントには pages deploy の自動作成パスが記載されているが、これはプロジェクト名と本番ブランチを尋ねるインタラクティブなプロンプト経由でしか発火しない。GitHub Actions のランナーには TTY がないため、そのプロンプトは表示されない。さらに悪いことに、--project-name を渡すと(下記のデプロイコマンドのように、CI では監査可能なログのために必要)、wrangler はプロジェクトが既存であることを前提とし、作成する代わりに Project not found. The specified project name does not match any of your existing projects. [code: 8000007] で失敗する。CI の初回デプロイ前には必ず pages project create を実行すること。これは現行の wrangler@4 に該当する挙動で、自動作成プロンプトはインタラクティブ専用であり、非対話環境向けのフォールバックはドキュメント上存在しない。

CI パイプラインでは、プロジェクトが既に存在していても再実行が失敗しないよう、作成ステップを冪等にする:

set +e
create_output=$(npx wrangler@4 pages project create zudo-cloudflare \
  --production-branch=main 2>&1)
create_exit=$?
set -e

if [ "$create_exit" -ne 0 ]; then
  if echo "$create_output" | grep -qiE "already exists|8000077|duplicate"; then
    echo "Project already exists, continuing."
  else
    echo "$create_output" >&2
    exit "$create_exit"
  fi
fi

許容するのは「既に存在する」系のシグネチャ(already exists、API エラーコード 8000077duplicate)のみ。認証エラー、レート制限、アカウント ID のタイプミスなど、それ以外の失敗はパイプラインを失敗させたままにする。

デプロイコマンド

基本的なデプロイコマンドは以下の通りです:

npx wrangler@4 pages deploy <directory> \
  --project-name=<project-name> \
  --branch=<branch> \
  --commit-hash="${GITHUB_SHA}" \
  --commit-message="Production deploy: ${GITHUB_SHA}"

パラメータ

パラメータ説明
<directory>ビルド済み静的ファイルが格納されたディレクトリ
--project-namePages プロジェクト名(作成時の名前と一致させる必要がある)
--branchブランチ名。main の場合は本番デプロイ、それ以外はプレビュー
--commit-hash追跡用の Git SHA(任意だが推奨)
--commit-messageデプロイの説明文(任意)

環境変数

デプロイコマンドには以下の環境変数が必要です:

CLOUDFLARE_API_TOKEN=<your-token>
CLOUDFLARE_ACCOUNT_ID=<your-account-id>

本番デプロイとプレビュー

  • 本番: --branch=main でデプロイします。プライマリ URL が更新されます。

  • プレビュー: その他のブランチ名(例:--branch=pr-42)でデプロイします。プレビュー URL が作成されます。

Warning

--branch フラグがデプロイの種類(本番/プレビュー)を決定します。本番デプロイには実際のブランチ名ではなく、必ず main を使用してください。

デプロイディレクトリの構造

デプロイディレクトリには、配信される最終的なファイルがそのまま含まれている必要があります。サイトがベースパス(例:/pj/my-site/)を使用する場合、ファイルを適切にネストする必要があります:

mkdir -p deploy/pj/my-site
cp -r dist/* deploy/pj/my-site/
echo '/ /pj/my-site/ 302' > deploy/_redirects
npx wrangler@4 pages deploy deploy --project-name=my-site --branch=main

詳細は ベースパスパターン を参照してください。

Pages CI のトラブルシューティング

CI で pages project create / pages deploy を実行したときによく出る失敗のシグネチャと、その実際の原因:

シグネチャ原因対処
[code: 10000] / Authentication errorCLOUDFLARE_API_TOKEN が無効・期限切れ、または Pages 権限が不足しているPages の "Edit" アカウント権限を付与したトークンを再発行し、CI のシークレットを更新する
More than one account available but unable to select one in non-interactive modeCLOUDFLARE_ACCOUNT_ID が未設定で、トークンが複数アカウントにアクセスできるため wrangler がどれか選べないCLOUDFLARE_ACCOUNT_ID を明示的に設定する(上記の環境変数参照)
冪等化した作成ステップが、プロジェクトが既に存在するのに失敗し続ける出力が already exists / 8000077 / duplicate のいずれにも一致しなかったcreate_output を出力して確認する -- このパターンは意図的にこのシグネチャ群だけを許容している。それ以外(認証エラー、レート制限、クォータなど)は本物の失敗
wrangler が動く前にインストールステップが失敗する(例:ERR_PNPM_OUTDATED_LOCKFILEpackage.json がコミット済みのロックファイルから乖離しており、CI のインストールがロックファイル固定で実行されているローカルで --frozen-lockfile を外してインストールし、更新されたロックファイルをコミットする
リトライを重ねてもデプロイが 5xx / ゲートウェイエラーで失敗し続ける設定の問題ではなく Cloudflare API 側の不安定さ再実行する前に Cloudflare のステータスページ を確認する

Revision History

作成更新