🏠
GitHub ActionsでPrismaマイグレーションの本番環境へのデプロイを自動化する
どんなときに何をしたいのか
Prisma
を使ったプロジェクトでデータベースの定義を変更したとき、マイグレーションを作成したあと本番環境にデプロイする操作を自動化したい。
どのようにするのか
開発/本番環境の構成は下図の通り。
- 開発環境でマイグレーションを行いSQLを作成する。それを本番環境に反映する。
-
GitHub Actions
を使って、リモートリポジトリへのpush時に自動でマイグレーションをデプロイする。 - ただし、以下に注意する。
-
main
ブランチへのpush時だけデプロイする。開発ブランチへのpush時は何もしない。 - 新規のマイグレーションファイルがあるときだけデプロイする。
- 手動でもデプロイできるようにする。
-
やってみよう
以下を実施する。
- 環境構築(構築済ならスキップ)
- Prismaプロジェクトの作成(作成済ならスキップ)
- GitHub Actions ワークフローの作成
- 動作確認
全手順を実施した結果が以下のリポジトリ。
環境構築
- 以下記事の1〜4を実施する。
-
docker-compose.yml
について、今回はnodejs
を使うので以下のように編集する。
docker-compose.yml
version: '3.7'
services:
node:
image: node:latest
working_dir: /app
tty: true
volumes:
- .:/app
postgres:
image: postgres:latest
restart: always
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: password
PGPASSWORD: password
POSTGRES_DB: app
TZ: "Asia/Tokyo"
ports:
- 5432:5432
volumes:
- postgres:/var/lib/postgresql/data
volumes:
postgres:
- コンテナを起動する。
shell
docker compose up -d
- よく使うコマンドはaliasを設定しておく。
setup.sh
alias yarn="docker compose run -v ${PWD}:${PWD} node yarn"
alias npx="docker compose run -v ${PWD}:${PWD} node npx"
Prismaプロジェクトの作成
- Prismaのチュートリアルに従ってPrismaを使えるようにする。
npm
をyarn
に読み替えているのは好み。
shell
. setup.sh
yarn init -y
yarn add -D prisma typescript ts-node @types/node
npx tsc --init
yarn prisma init
- スキーマを編集する。
User
テーブルを作成する。
prisma.schema
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// 追加
model User {
id Int @id @default(autoincrement())
name String
}
- 環境変数
DATABASE_URL
は2で定義した接続情報に対応して設定する。
.env
DATABASE_URL="postgresql://username:password@postgres:5432/app"
- マイグレーションを行う。
shell
yarn prisma migrate dev --name init
GitHub Actions ワークフローの作成
参考にした手順は以下の通り。
-
.github/workflows
ディレクトリを作成して、その配下にmigration.yml
ファイルを作成する。 - migration.ymlを以下のように編集する。
secrets.PROD_DATABASE_URL
は後で設定する。ポイントは以下の通り。
-
main
ブランチへのpush時かつ、prisma
ディレクトリ配下に変更があったときのみ起動する。 -
workflow_dispatch
を指定することで手動でもマイグレーションできるようにしている。
migration.yml
name: Prisma Migrate
on:
push:
branches:
- 'main'
paths:
- 'prisma/**'
workflow_dispatch:
jobs:
migrate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup Nodejs
uses: actions/setup-node@v2
with:
node-version: 18.x
- name: Install
run: yarn install
- run: rm -rf node_modules/.prisma
- name: Deploy Migrations
run: npx prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.PROD_DATABASE_URL }}
- GitHubにリポジトリを作成する。
動作確認
- Postgresの本番環境を作成する。[1]
- migration.ymlが参照している
secrets
をここで設定する。リポジトリのSettings->Secrets and Variables->Actions
に移動して、Repository secretsの変数PROD_DATABASE_URL
に本番環境の接続用URLを設定する。 -
prisma.schema
を編集する。bio
というカラムを新たに追加する。
prisma.schema
model User {
id Int @id @default(autoincrement())
name String
bio String // 追加
}
- 開発環境でマイグレーションを行う。
shell
yarn prisma migrate dev --name add-column
- 変更をcommitしてGitHubにpushする。
- ワークフローが実行されて、完了することを確認する。本番環境に
User
テーブル(bio
カラム追加済み)が作成されている。
終わり!
お疲れさまでした!
-
筆者はRailwayで作成 ↩︎
Discussion