Skip to content

マイグレーション

Koki Takahashi edited this page Jul 28, 2017 · 9 revisions

データベースのスキーマを変更した場合、もしくはステージのデータを変更した場合、デプロイ時にサーバーを隔離し、ステージのマイグレーションを行う必要がある。

手順

  1. メンテナンスモードをオンにする。

    Webインターフェースから変更、もしくはCLIから実行

  2. データベースのバックアップを取る。

    Webインターフェースから実行、もしくはCLIから実行

  3. masterブランチにpushする(もしくはプルリクをマージする)

  4. Travisでビルドが走り、その後Herokuの自動デプロイが完了するのを待つ。

  5. マイグレーションを行う。(以下参照)

  6. マイグレーションが成功したら、メンテナンスモードをOFFにする。

  7. mnemo.proにアクセスし、正常に動くことを確認する。

1. スキーマのマイグレーションを行う場合 (めったにない)

Heroku Toolbelt でbashを立ち上げたあと、sequelize-cliをインストールし、sequelize db:migrateを実行。

ログ

$ heroku run --app mnemo-api bash
Running bash on ⬢ mnemo-api... up, run.2927 (Free)
~ $ ls
CNAME     README.md  assets     bin    index.less  lib     node_modules  stages
Procfile  api        benchmark  image  index.pug   modals  package.json  test
~ $ npm i sequelize-cli -g
(略)
~ $ cd api
~/api $ sequelize db:migrate

Sequelize [Node: 6.9.1, CLI: 2.4.0, ORM: 3.25.0]

Loaded configuration file "config/config.json".
Using environment "production".
== 20161202090513-add-version-column: migrating =======
== 20161202090513-add-version-column: migrated (0.080s)
~/api $ exit
exit
$

2. ステージを変更・追加した場合

バージョン管理について

ステージの内容を変更した場合は、必ず事前にそのステージのバージョンを1上げ、submissionsのマイグレーションと検証を行う。

validatorやblockの内容の変更など、すべてのステージに影響のある変更を行った場合には、すべてのステージのバージョンを上げる。

参考: すべてのステージデータのバージョンを一気に上げる方法

find ./stages -type f | xargs sed -i -r 's/(.*)(version: )([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge'

マイグレーション実行

マイグレージョンを行うには、Heroku Toolbelt でbashを立ち上げ、node scripts/migrateStages.jsを実行する。

ログ

$ heroku run --app mnemo-api bash
Running bash on ⬢ mnemo-api... up, run.2927 (Free)
~ $ ls
CNAME     README.md  assets     bin    index.less  lib     node_modules  stages
Procfile  api        benchmark  image  index.pug   modals  package.json  test
~ $ cd api
~/api $ node scripts/migrateStages.js
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): START TRANSACTION;
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Getting stages...
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): SELECT "id", "name", "migratedVersion", "createdAt", "updatedAt" FROM "stages" AS "stages";
Got 40 stages
Migrating 1 stages...
Migrating "wire01" stage... (version: 1 => 2)
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): SELECT "id", "name", "board", "blocks", "clocks", "score", "stageId", "version", "createdAt", "updatedAt" FROM "submissions" AS "submissions" WHERE "submissions"."stageId" = 1 AND "submissions"."version" = 1;
Migrating 33 submissions...
Validating submission from tsg of score 10000
validation: 17.475ms
Validation Succeeded. (score: 10000 => 10000)
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): UPDATE "submissions" SET "version"=2,"updatedAt"='2016-12-03 07:52:09.213 +00:00' WHERE "id" = 4
(略)
Validating submission from sannko of score 10000
validation: 2.291ms
Validation Succeeded. (score: 10000 => 10000)
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): UPDATE "submissions" SET "version"=2,"updatedAt"='2016-12-03 07:52:09.611 +00:00' WHERE "id" = 293
Updating migratedVersion of "wire01" stage...
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): UPDATE "stages" SET "migratedVersion"=2,"updatedAt"='2016-12-03 07:52:09.616 +00:00' WHERE "id" = 1
Executing (d6b09afb-18c4-4426-88db-e3eac850b538): COMMIT;
done.
~/api $ exit
exit
$