Open5

Prismaの実行環境をスクリプトで分ける

マロンマロン

ローカルからスクリプトを実行することで、任意の環境に対して操作をしたい場面はあると思います。
例えば、Prismaのシーダーをローカルから各環境に対して実行することで、都度CIを走らせることなく、直ぐ適用できるようになります。
ただ、上記操作は危険をはらんでもいます。
今回の例でいうと、Prismaを操作するには環境変数を記載する.envファイルにDATABASE_URLが必要になります。(ドキュメント)
各環境に対してシーダーを実行するには、DATABASE_URLの値をそれぞれ環境のDBに変更します。
この時、変数の値を戻し忘れてしまうと、開発環境に対して操作しているつもりが実は本番環境を操作していた、ということが起きてしまいます。
怖いですね。
今回は、こういった間違いを少しでも防げることができるかもしれない方法の一つを共有します。

マロンマロン

①dotenv-cliを導入

dotenv-cliをコマンドで、Prismaを実行するプロジェクトにインストールします。
なお、READMEにはグローバルでインストールするように記載していますが、今回はグローバルでインストールする必要はありません。
例えば、npm install -D dotenv-cliを実行し、devDependenciesにインストールする形で大丈夫です。

マロンマロン

②各環境用に環境変数ファイルを作成する

それぞれの環境用に.envから始まるファイルを作成します。
先頭が.envであれば後ろは任意のもので大丈夫です。
今回は開発用、ステージング環境用、本番用に以下のファイルを作成します。

  • .env.dev
  • .env.stg
  • .env.prod

その中にそれぞれ、以下のように値を入れます。

# .env.dev
DATABASE_URL=開発環境のデータベースURL

# .env.stg
DATABASE_URL=ステージング環境のデータベースURL

#.env.prod
DATABASE_URL=本番環境のデータベースURL

なお、オプションな設定にはなりますが、これら値をGit管理する必要はないと思うので、.gitignoreに記載し、Git管理下でおかないようにします。

マロンマロン

③環境ごとに実行するスクリプトを分ける

最後にpackage.jsonのsriptsへ、以下の記載を追加します。

"prisma:push:dev": "dotenv -e .env.dev prisma db push",
"prisma:push:stg": "dotenv -e .env.stg prisma db push",
"prisma:push:prod": "dotenv -e .env.prod prisma db push",
"prisma:seed:dev": "dotenv -e .env.dev prisma db seed",
"prisma:push:stg": "dotenv -e .env.stg prisma db seed",
"prisma:push:prod": "dotenv -e .env.prod prisma db seed",

このようにして、スクリプトを分割することで参照するデータベースが明確に分かります。
100%は無理だとしても、.env内で値を変更するよりはミスは減りそうです。