ロールバック

直すより、戻すほうが速い

出したばかりの版で不具合が見つかったとします。原因を調べて直して出し直すには、早くても数十分かかります。その間、訪問者には壊れたページが見え続けます。

やるべきことは逆です。まず前の版に戻して、原因はそれから調べる。前のレッスンまでで、戻すのに必要なものはもう揃っています。古い版は消さずに残っていて、公開先はリンク1本です。

ln -sfn /var/www/mysite-deploy/releases/20260401-101500 /var/www/mysite-deploy/current systemctl reload nginx

これだけです。ファイルを運び直す必要がないので、数秒で終わります。

「1つ前」を自分で探させる

手で打つなら、戻り先の名前を調べる必要があります。慌てているときに ls を見て名前を写すのは、打ち間違いの元です。

版の名前は日時なので、並べ替えれば時系列になります。

ls -1 /var/www/mysite-deploy/releases | sort

ls -1 は1行に1つずつ出す指定です。sort で並べれば、下にあるものほど新しい版です。

1つ前を取り出すには、末尾から2つを取って先頭を見ます。

PREV=$(ls -1 /var/www/mysite-deploy/releases | sort | tail -2 | head -1)

tail -2 で最後の2つ、head -1 でそのうちの先頭。つまり最新の1つ前です。日時の名前にしておいた効き目が、ここで出ます。

戻れないときは止める

版が1つしか無いときに戻ろうとすると、PREV には最新の版そのものが入ります。戻ったつもりで何も変わらない、という最悪の結果になります。

COUNT=$(ls -1 /var/www/mysite-deploy/releases | wc -l) if [ "${COUNT}" -lt 2 ]; then echo "戻れる版がありません" exit 1 fi

exit 1 は、失敗として終わるという指定です。前のレッスンで見た終了コードと同じ話で、0 以外が失敗を表します。戻れないことを黙って隠さないのが大事です。

[ "${COUNT}" -lt 2 ]-lt は「より小さい」という比較です。数を比べるときは < ではなくこの書き方を使います。

戻したことを記録する

戻す操作は、あとで必ず振り返ることになります。いつ、どの版から、どの版へ戻したか。記録が無いと、翌日に自分でも思い出せません。

echo "$(date '+%Y-%m-%d %H:%M:%S') rollback ${CURRENT} -> ${PREV}" >> /var/log/deploy.log

6章のヘルスチェックと同じ形です。自動で動くものほど、何をしたかを残す。この習慣が、運用の質をそのまま決めます。

手を動かす

最新の1つ前の版を自分で探して戻すスクリプトを書き、実際に戻ることを確かめます。

ヒント

  • 1. /root/bin/rollback.sh を書く。1行目は #!/bin/bash、その下に set -eu を置く
  • 2. 版の数を数え、2 未満なら echo で伝えて exit 1 で終わる
  • 3. ls -1 ... | sort | tail -2 | head -1 で1つ前の版を取り出す
  • 4. ln -sfn で current をそこへ張り替え、systemctl reload nginx で反映する
  • 5. 戻した記録を date とあわせて /var/log/deploy.log へ >> で追記する
  • 6. chmod +x を付けて実行し、公開される中身が前の版に戻ることを確かめる

12 項目で採点します