「pushは重い」の、半分は知らないせい
git pushとVercelのデプロイが連動する話で、pushの重みが変わると書きました。押した瞬間に世の中に公開されるので、たしかに重い。
ただ、その重さの半分は戻し方を知らないことから来ています。戻せると分かっていれば、残るのは「公開されてしまった数分間」だけです。
戻すのは、作り直すことではない
VercelにはInstant Rollbackという仕組みがあります。公式ドキュメントのPerforming an Instant Rollback on a Deploymentにはこうあります。
Vercel provides Instant Rollback as a way to quickly revert to a previous production deployment.
(VercelはInstant Rollbackを、ひとつ前の本番デプロイへ素早く戻す方法として提供しています)
ここで大事なのは、戻すときに組み立て直しが走らないことです。同じページに、こう書かれています。
The rollback happens instantaneously. Vercel points your domains back to the selected deployment
(ロールバックは即座に完了します。Vercelはドメインの向き先を、選んだデプロイへ戻します)
本番のドメインが向いたことのあるデプロイは、新しいものに置き換わったあとも残っていて、それぞれ自分のURLを持っています。だからドメインの向き先を差し替えるだけで済みます。ビルドを待つ必要がありません。
無料プランでも戻せる。ただし1つ前まで
同じページの「Who can roll back deployments?」に、プランごとの差が書かれています。
Hobby plan: On the hobby plan you can roll back to the previous deployment
(Hobbyプランでは、ひとつ前のデプロイへ戻せます)
Proと Enterpriseなら、条件を満たすデプロイのどれにでも戻せます。無料プランで2つ以上前に戻そうとすると、CLIははっきりしたエラー文を返します——To roll back further than the previous production deployment, upgrade to pro。
なお、戻し先になれるのは本番のドメインが向いたことのあるデプロイです。本番に向いたことのないもの——公式は「most preview deployments(プレビューデプロイの多く)」を例に挙げています——は対象外になります。
Deployments previously aliased to a production domain are eligible for Instant Rollback.
(本番ドメインが以前に向いていたデプロイが、Instant Rollbackの対象になります)
やり方は2つ
ダッシュボードからは、プロジェクトの概要ページにある本番デプロイの枠に「Instant Rollback」のボタンがあります。戻し先を選び、内容を確かめて「Confirm Rollback」を押すだけです。
ターミナルからはvercel rollbackです。
vercel rollback # 1つ前へ戻す
vercel rollback https://〜.vercel.app # デプロイのURLを指定して戻す
vercel rollback status # 進行中の戻しの状況を見る
エージェントに「Vercelでひとつ前に戻して」と頼んだときに使われるのは、たいていこちらです。
いちばんの落とし穴——戻したあと、pushしても反映されなくなる
ここが本題かもしれません。公式ドキュメントに、こう書かれています。
After a rollback, Vercel turns off auto-assignment of production domains. This means new pushes to your production branch won’t replace the rolled-back deployment.
(ロールバックのあと、Vercelは本番ドメインの自動割り当てをオフにします。つまり、本番ブランチへの新しいpushは、戻したデプロイを置き換えません)
これを知らないと、二重に詰まります。まずいものを公開した → 戻した → 慌てて直してpushした → 本番が変わらない。 直したはずなのに反映されないので、今度は「直し方が間違っている」と思い込むことになります。
自動割り当ては、自分で戻します。ダッシュボードなら本番デプロイの枠に「Undo Rollback」のボタンが表示されているはずです。ターミナルならvercel promoteです。
vercel promote https://〜.vercel.app
つまり、戻す・直す・進めるの3手が一組になります。戻して終わりではありません。
環境変数は、一緒には戻らない
もうひとつ、公式が先回りして書いている注意があります。
Vercel won’t update environment variables if you change them in the project settings and will roll back to a previous build
(プロジェクト設定で環境変数を変えていても、Vercelはそれを反映せず、前のビルドへ戻します)
戻したデプロイは、そのとき組み立てた中身のままです。あとから設定画面で変えた値は反映されていません。環境変数まわりの話は手元では動くのに、本番で落ちるに書きました。
Git側は、まだ直っていない
ロールバックが動かしたのはドメインの向き先だけです。GitHubのmainには、まずいコードが残ったままです。
なので順番はこうなります。
- 戻す(止血)——公開されている中身を、とりあえず前の状態にする
- 直す——手元で原因を潰して、
git commitしてgit pushする - 進める——
vercel promoteか「Undo Rollback」で、自動割り当てを元に戻す
コミットそのものを取り消したいときはgit revertという手もあります。こちらは履歴を消さずに「打ち消すコミット」を1つ足す方式なので、すでにpushしたものにも使えます。
覚えておきたいこと
- 戻すのは一瞬。組み立て直しは走らない
- 無料プランで戻れるのは1つ前まで
- 戻したあと、pushの自動反映が止まる。「直したのに変わらない」の正体はこれ
- 戻ったのは公開されている中身だけ。 リポジトリのほうは自分で直す
公開してしまってからでも取り返しがつく、と分かっていると、pushの前に固まる時間が短くなります。