◉ANTIGRAVITY LABEN
記事一覧/アプリ開発
▣ アプリ開発/2026-07-14上級

デプロイは成功なのに、ユーザーには古いビルドが出ていたとき — 出荷したコミットがエッジに届いたかを検証するゲートの運用メモ

CI は緑、デプロイも成功表示、それでも本番には古いビルドが残っていた——その経験から、出荷したコミットがエッジに届いたかを検証するゲートを作りました。ビルドへの印の焼き込み、エッジからの実物取得、キャッシュの罠と実測効果をまとめた運用メモです。

Antigravity382デプロイ5CI/CD17オブザーバビリティ運用12

✦ プレミアム記事

修正済みのはずのバグについて、ユーザーから問い合わせが続いていました。CI は緑。デプロイ画面も「成功」。コミットも main に乗っています。それでも本番を開くと、直したはずの挙動が古いまま残っている。

原因は拍子抜けするほど単純でした。ビルドは走ったけれど、エッジのキャッシュが前のバンドルを配り続けていたのです。「デプロイ成功」という緑のチェックが意味していたのは「パイプラインが最後まで走った」ことだけで、「ユーザーが新しいコードを見ている」ことではありませんでした。

この二つは、似ているようでまるで別の事実です。ここでは個人開発で運用しているアプリを題材に、出荷したコミットが本当にエッジまで届いたかを、ビルドに焼き込んだ印で検証する後段ゲートの作り方を、運用ログの実測とあわせて残しておきます。私自身、この取り違えで二度ほど静かな事故を出してから、ようやくこの形に落ち着きました。

なぜ「デプロイ成功」を信じてはいけないのか

デプロイの緑は、いくつもの独立した工程のうち「CI が例外なく終わった」ことしか保証しません。そこから先、ユーザーの画面に新しいコードが届くまでには、まだ落とし穴がいくつも残っています。

エッジや CDN のキャッシュが古いバンドルを配り続けている。アトミックな差し替えに遅れがあって、一部のリージョンだけ旧版のまま。あるいは、そもそも意図した本番プロジェクトではなく、プレビュー環境や別ブランチに出してしまっていた。どれも CI から見れば「成功」で、けれどユーザーから見れば「何も変わっていない」状態です。

本番運用で怖いのは、この手の食い違いがエラーとして現れないことです。500 も出ず、ログにも残らず、ただ古い挙動が静かに配られ続ける。だからこそ、成功したと信じ込む代わりに、届いたかどうかを自分で取りに行って確かめる工程が要ります。

ビルドに検証できる印を焼き込む

まず、いま動いているのがどのコミットのビルドなのかを、本番から機械的に読み取れるようにします。ビルド時にコミット SHA を成果物へ埋め込み、/version.json のような固定の場所から返すのが素直です。

// 何をするコードか:
// ビルド時にコミット SHA とビルド時刻を version.json として書き出し、
// 本番の静的アセットとして配信できるようにする
// scripts/stamp-version.mjs
import { execSync } from "node:child_process";
import { writeFileSync, mkdirSync } from "node:fs";
 
const sha = execSync("git rev-parse --short HEAD").toString().trim();
const builtAt = new Date().toISOString();
 
mkdirSync("public", { recursive: true });
writeFileSync(
  "public/version.json",
  JSON.stringify({ sha, builtAt }, null, 2)
);
 
console.log(`stamped version.json: ${sha} @ ${builtAt}`);

ビルドスクリプトの手前でこれを走らせ、"build": "node scripts/stamp-version.mjs && next build" のように繋ぎます。こうすると、本番の https://your-app.example/version.json を叩けば「いまエッジが配っているのはどのコミットか」が一目で分かるようになります。印は SHA でなくても、単調増加するビルド番号でも構いません。大切なのは、出荷側が期待する値と、本番が返す値を突き合わせられることです。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦「デプロイ成功」が本番反映を意味しない理由と、コミット印をエッジで検証する後段ゲートの設計
✦ビルド時にコミット印を焼き込み、キャッシュを避けて実物を取りに行く検証コード
✦検証ゲート導入前後で、古いビルドがユーザーに届いた事故がどう減ったかの実測値
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

▣ アプリ開発2026-10-15
immutable を付けた資産を同じ URL で差し替えたら、利用者のブラウザだけが古いままでした
長期キャッシュを付けた JS を同じ URL で差し替えても、CDN をパージしてもブラウザは取り直しません。同じ URL・no-cache・クエリ付き・内容ハッシュ名の 4 方式を Chromium で並べて比べ、ビルドの最後にハッシュを付ける完全なスクリプトまでをまとめました。
▣ アプリ開発2026-09-29
Cloudflare をパージしても古い壁紙が届き続けた原因は、オリジン側で JPEG を握っていた XPageSpeed
同じ URL に上書きした壁紙画像が、Cloudflare をパージしても古いまま届き続けた運用の記録です。ローカル・オリジン・エッジの三者を突き合わせて層を名指しする検査、プレフィックスパージの使いどころ、Xserver の XPageSpeed を .htaccess で安全に切る書き方まで扱います。
▣ アプリ開発2026-09-19
見積書 PDF の自動化を一度にまとめて頼み、4 つに割り直すまで
受託の見積書を毎回コピーして作っていた手作業を、Antigravity に頼んで小さな PDF 出力ツールへ移した記録です。最初に全部をまとめて頼んで作り直すことになった理由と、データ・計算・見た目・保存の 4 つに割って渡し直した順番を、動くコードと一緒に書き残します。