移行チェックリストとロールバックスクリプトの作成
目標
カットオーバー(サービスイン)の作業に必要な計画書・チェックリスト・バックアップ/リリース/スモーク/ロールバックのスクリプトを自分で作り、実際に実行して結果報告書まで作成できるようになります。
なぜ重要なのか
カットオーバーは、SIプロジェクトで最も圧縮されたリスク区間です。明け方に、疲れた状態で、複数のチームが決められた順序どおりに動く必要があり、元に戻す時間は短いです。このとき判断を支えるのは、あらかじめ数字で決めておいたロールバック基準と、手が震えても同じ答えを出す自動化された検証スクリプトです。人が画面を押して確認するスモークテストは、人が疲れるほど不正確になります。そのため、カットオーバー準備の本質は「文書の作成」ではなく、「判断を自動化しておくこと」です。
ステップ
/root/deployディレクトリを作成して、/root/deploy/plan.mdを作成します。## 이행 일시、## 대상、## 롤백 기준、## 담당자という4つのh2見出し(韓国語の見出しは、順に「カットオーバーの日時」「対象」「ロールバック基準」「担当者」を意味します)が必要で、本文に롤백 판단 시한という文言(韓国語の語句は「ロールバック判断期限」を意味します)と時刻が含まれている必要があります。/root/deploy/checklist.csvを作成します。1行目はseq,phase,task,owner,expected,rollbackです。データは8行以上で、phaseの値に사전、이행、검증(韓国語の語は、順に「事前」「カットオーバー」「検証」を意味します)がすべて登場する必要があります。seqは1から1ずつ増える整数で、expected(期待結果)は空であってはいけません。/opt/lab/fixtures/si-process/app/config.propertiesを/root/deploy/app/config.propertiesにコピーします。そして/root/deploy/backup.shを作成します。実行すると、/root/deploy/backup/config.properties.YYYYMMDDHHMMの形式でバックアップを残します。作成後、実際に1回実行してください。/root/deploy/release.shを作成します。実行すると、/root/deploy/app/config.propertiesのapp.versionの値を2.0.0に変更し、/root/deploy/deploy.logにRELEASE 2.0.0という文字列を含む行を追記します。作成後、実際に1回実行してください。/root/deploy/smoke.shを作成します。引数を1つ(設定ファイルのパス)受け取って、app.versionの値が空でなく、app.db.urlの値がjdbc:で始まっていれば終了コード0、そうでなければ0以外の値で終了します。/root/deploy/rollback.shを作成します。引数を2つ(백업파일 대상파일、韓国語の語は、順に「バックアップファイル」「対象ファイル」を意味します)受け取って、バックアップファイルを対象ファイルに戻します。バックアップファイルがなければ、対象ファイルには触れず、0以外の終了コードで終わる必要があります。/root/deploy/rollback-criteria.csvを作成します。1行目はmetric,threshold,window,actionです。データは3行以上で、actionは롤백、관찰、유지(韓国語の語は、順に「ロールバック」「観察」「維持」を意味します)のいずれかであり、最低1行は롤백である必要があります。thresholdには数字が入る必要があり、window(観測区間)は空であってはいけません。/root/deploy/result.mdを作成します。## 수행 결과、## 이슈、## 백업 위치、## 확인 사항という4つのh2見出し(韓国語の見出しは、順に「実施結果」「課題」「バックアップの場所」「確認事項」を意味します)が必要で、ステップ3で作られた実際のバックアップファイル名と、デプロイされたバージョン2.0.0が、本文に入っている必要があります。
参考
date +%Y%m%d%H%Mで、12桁のタイムスタンプを作れます。- 設定値の読み取り:
grep '^app.version=' 파일 | cut -d= -f2(プレースホルダーはファイル名です) - よくあるミス1: ロールバックスクリプトが、バックアップファイルの存在確認なしに
cpを実行するミスです。 - よくあるミス2: スクリプトを作っても実行せず、成果物(バックアップファイル、deploy.log)がないミスです。
- よくあるミス3:
checklist.csvのexpected列を空にしておくミスです。期待結果がなければ、チェックリストではありません。
カットオーバー計画書の作成
/root/deployディレクトリを作成して、/root/deploy/plan.mdを作成します。## 이행 일시、## 대상、## 롤백 기준、## 담당자という4つのh2見出し(韓国語の見出しは、順に「カットオーバーの日時」「対象」「ロールバック基準」「担当者」を意味します)が必要で、本文に롤백 판단 시한という文言(韓国語の語句は「ロールバック判断期限」を意味します)と時刻が含まれている必要があります。
カットオーバー計画書の最低要件は、「いつ/何を/誰が/いつ戻すか」です。ロールバック基準は、感情ではなく数字で書いてこそ、明け方に判断がぶれません。
段階別チェックリスト
/root/deploy/checklist.csvを作成します。1行目はseq,phase,task,owner,expected,rollbackです。データは8行以上で、phaseの値に사전、이행、검증(韓国語の語は、順に「事前」「カットオーバー」「検証」を意味します)がすべて登場する必要があります。seqは1から1ずつ増える整数で、expected(期待結果)は空であってはいけません。
各項目に「期待結果」がなければ、成功かどうかを判定できません。事前/カットオーバー/検証の3区間がすべてある必要があり、通し番号は、実際の実施順序と同じである必要があります。
設定バックアップスクリプトの作成と実行
/opt/lab/fixtures/si-process/app/config.propertiesを/root/deploy/app/config.propertiesにコピーします。そして/root/deploy/backup.shを作成します。実行すると、/root/deploy/backup/config.properties.YYYYMMDDHHMMの形式でバックアップを残します。作成後、実際に1回実行してください。
バックアップファイル名にタイムスタンプを入れると、何度実行しても上書きされません。dateコマンドのフォーマット指定子を使ってください。バックアップしたら、原本と内容が同じかを確認する習慣も忘れずに。
リリーススクリプトの作成と実行
/root/deploy/release.shを作成します。実行すると、/root/deploy/app/config.propertiesのapp.versionの値を2.0.0に変更し、/root/deploy/deploy.logにRELEASE 2.0.0という文字列を含む行を追記します。作成後、実際に1回実行してください。
設定値を変えるときにsed -iを使うと、失敗したとき原本が消えます。前のステップで、先にバックアップを作った理由がこれです。デプロイの履歴は、appendで残してください。
スモークテストのスクリプト
/root/deploy/smoke.shを作成します。引数を1つ(設定ファイルのパス)受け取って、app.versionの値が空でなく、app.db.urlの値がjdbc:で始まっていれば終了コード0、そうでなければ0以外の値で終了します。
スモークテストは、引数で検査対象を受け取るようにすると、再利用できます。正常なときは0、異常なときは0以外の値で終了するようにすると、自動化に使えます。
ロールバックスクリプト
/root/deploy/rollback.shを作成します。引数を2つ(백업파일 대상파일、韓国語の語は、順に「バックアップファイル」「対象ファイル」を意味します)受け取って、バックアップファイルを対象ファイルに戻します。バックアップファイルがなければ、対象ファイルには触れず、0以外の終了コードで終わる必要があります。
ロールバックスクリプトは、引数を受け取って動作するほうが安全です。対象のバックアップファイルがなければ、何もせず、すぐに失敗する必要があります。明け方に空のファイルで上書きする事故が、実際に起きます。
ロールバック判断基準表
/root/deploy/rollback-criteria.csvを作成します。1行目はmetric,threshold,window,actionです。データは3行以上で、actionは롤백、관찰、유지(韓国語の語は、順に「ロールバック」「観察」「維持」を意味します)のいずれかであり、最低1行は롤백である必要があります。thresholdには数字が入る必要があり、window(観測区間)は空であってはいけません。
指標・しきい値・観測区間・対応の4つが、1セットです。「エラーが多ければ」ではなく、「エラー率5%を10分間超過したら」のように書く必要があります。
カットオーバー結果報告書
/root/deploy/result.mdを作成します。## 수행 결과、## 이슈、## 백업 위치、## 확인 사항という4つのh2見出し(韓国語の見出しは、順に「実施結果」「課題」「バックアップの場所」「確認事項」を意味します)が必要で、ステップ3で作られた実際のバックアップファイル名と、デプロイされたバージョン2.0.0が、本文に入っている必要があります。
結果報告書の価値は、安定化期間に現れます。バックアップファイルの名前と、デプロイされたバージョンを、そのまま書いておいてください。あとで「サービスインのとき何を変えましたか」に答えられる、唯一の文書です。