ブランチ: コミットとロールバック
コードのようにリポジトリをバージョン管理します。コミットはフォークを不変イメージに固めます。ブランチは名前をつけます。チェックアウトは任意のコミットを新しい書き込み可能なフォークに戻します。このチュートリアルでは既知の良い状態をコミットし、実際に PostgreSQL のテーブルを削除して、数秒で全行を復元します。
チュートリアル動画
モデル
コミットは決して変わりません。マウントすら拒否します。フォークは待ちません。チェックアウトはほぼ瞬時のリフリンクによるクローンです。完全なメンタルモデルはブランチングガイドにあります。
チェックポイントを作る
バージョンを目に見える形にするマーカーファイルと、ロールバックを意味のあるものにする実際のデータベースを用意します。customers テーブルには3行が入っています。
rdc term connect --machine <machine-name> --repository app:work --command 'echo v1 > version.txt && cat version.txt' 作業中のforkに状態のバージョン1を書き込みます。
rdc term connect --machine <machine-name> --repository app:work --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"' このforkでは本物のPostgreSQLデータベースも動いています。customersテーブルには3行のデータがあります。
rdc repo commit --name app:work --message 'v1 baseline' --machine <machine-name> 作業中のforkをcommitします。データベースを含むrepositoryの完全な状態が、不変の名前付きスナップショットとして保存されます。
rdc repo branch --branch stable --name app:work commitを指すブランチを作成します。フリーズされた状態に付ける、わかりやすい名前です。
コミットはファイルと PostgreSQL のデータディレクトリの両方をキャプチャします。stable ブランチがその固定された状態を指します。
作業を続ける
rdc term connect --machine <machine-name> --repository app:work --command 'echo v2 > version.txt && cat version.txt' 作業を続けます。forkは変化しても、commitされた履歴はフリーズされたままです。
災害
危険な変更でテーブルが削除されます。クエリで被害が現実であることが確認されます。
rdc term connect --machine <machine-name> --repository app:work --command 'docker exec db psql -U app -d app -c "DROP TABLE customers"' 危険な変更が作業中のforkのcustomersテーブルを削除します。
rdc term connect --machine <machine-name> --repository app:work --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"' テーブルへのクエリが失敗します。リレーション「customers」は存在しません。データは作業中のforkから本当に消えています。
ERROR: relation "customers" does not exist。3行が消えました。実際の現場ではお腹が沈む瞬間ですが、ここではその後の見せ場への前置きです。
rdc repo commit --name app:work --message 'v2 risky change' --machine <machine-name> 削除されたテーブルを含む新しい状態もcommitします。履歴はgit logのように積み重なります。
rdc repo log --name app:work --machine <machine-name> repo logでcommitの履歴をたどります。メッセージ、作成者、親情報が確認できます。
履歴には実際に起きたことが記録されます。壊れた状態も含めて:一番上に v2 risky change、その下に v1 baseline。
数秒でロールバックする
rdc repo checkout --ref stable --from app:work --tag rollback --machine <machine-name> stableブランチを新しい書き込み可能なforkにcheckoutします。copy-on-writeのおかげでほぼ瞬時に完了します。
rdc repo up --name app:rollback --machine <machine-name> ロールバック用のforkを起動します。作業中のforkと並行して動作します。
rdc term connect --machine <machine-name> --repository app:rollback --command 'cat version.txt' ロールバック用のforkのマーカーファイルを読み取ります。commitされたとおり、バージョン1です。
rdc term connect --machine <machine-name> --repository app:rollback --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"' ロールバック用のforkのcustomersテーブルにクエリを実行します。commitされたとおり3行あります。ロールバックはファイルだけでなく、データベースも復元しました。
ロールバックフォークは v1 を読み込み、customers テーブルが3行すべて揃って戻ります。ロールバックはファイルだけでなくデータベースを復元しました。何も上書きされていません。作業フォークにはバージョン2がそのまま残っており、動画では両方を VS Code で開いてそれを証明しています。
次: ライブマイグレーション