この記事の目次
タップすると同じページ内の見出しへ移動します
6 sections 01 起きたこと: デプロイは成功、でも画面は古いまま ↓ 02 対策の基本形 ↓ 03 バージョンIDの取得: テキスト解析に依存しすぎない ↓ 04 有効化の検証: 「確認できないなら失敗」 ↓ 05 CIでのシークレットマスクも忘れずに ↓ 06 まとめ ↓ 起きたこと: デプロイは成功、でも画面は古いまま
Cloudflare Workersへのデプロイで、こんな経験はないでしょうか。 wrangler deploy は成功したのに、サイトには古いバージョンが配信され続けている。
原因は Workers の Gradual Deployments。アップロードされたバージョンが、必ずしもその場で100%のトラフィックを受けるとは限らないのです。「アップロード」と「有効化(トラフィック割当)」は別の操作です。
対策の基本形
アップロード後に明示的にバージョンを100%で有効化します:
bash ⧉
wrangler deploy # アップロード wrangler versions deploy \ --version-id <ID> --percentage 100 --yes # 100%で有効化
問題は <ID> の取得と、「本当に100%になったか」の確認です。
バージョンIDの取得: テキスト解析に依存しすぎない
wrangler deploy の出力には Current Version ID: <uuid> が含まれますが、CLIの出力形式はいつ変わるか分かりません。正規表現で拾いつつ、失敗したらJSON出力にフォールバックします:
js ⧉
const UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; function extractCurrentVersionId(output) { return output.match(new RegExp(`Current Version ID:\\s*(${UUID})`, "i"))?.[1] ?? null; } // フォールバック: wrangler versions list --json から最新を取る function parseLatestVersionId(jsonText) { const versions = JSON.parse(jsonText); const sorted = [...versions].sort((a, b) => Date.parse(b?.metadata?.created_on ?? 0) - Date.parse(a?.metadata?.created_on ?? 0)); return sorted[0]?.id ?? null; }
人間向けテキストよりJSONの方が形式安定性が高いので、取れるところは --json で取るのが鉄則です。
有効化の検証: 「確認できないなら失敗」
一番大事なのがここ。 versions deploy の終了コードだけを信用せず、 deployments list --json で「最新デプロイメントに自分のバージョンが100%で含まれている」ことを確認します:
js ⧉
function isVersionActiveAtFullTraffic(jsonText, versionId) { const deployments = JSON.parse(jsonText); const latest = [...deployments].sort((a, b) => Date.parse(b?.created_on ?? 0) - Date.parse(a?.created_on ?? 0))[0]; const versions = Array.isArray(latest?.versions) ? latest.versions : []; return versions.some((v) => v?.version_id === versionId && Number(v?.percentage) === 100); } // デプロイスクリプト本体 if (!isVersionActiveAtFullTraffic(deploymentsOutput, versionId)) { throw new Error(`Version ${versionId} was uploaded but could not be confirmed active at 100%`); }
設計思想は fail-loud。「成功したように見えて実は古いバージョン」が最悪のパターンなので、 確認できないことは失敗として扱います 。
CIでのシークレットマスクも忘れずに
デプロイログには環境変数名やアカウント情報が出ます。ログ出力をそのまま流さず、メールアドレスやID類をマスクするフィルタを通しておくと、CIログが公開されても安全です:
js ⧉
function sanitizeLog(value) { return value .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, "[email]") .replace(/ca-pub-\d+/g, "[adsense-client]"); }
まとめ
• Workersの「アップロード」と「有効化」は別操作。versions deployで明示的に100%にする
• IDや状態の取得はテキストより --json を使う
• 最後に deployments list --json で100%有効化を検証し、確認できなければエラーで止める
• デプロイログはマスクしてから出力する
Turnstile site key が未設定のため、このフォームは送信できません。管理者は NEXT_PUBLIC_TURNSTILE_SITE_KEY を設定してください。