🏠

GitHub ActionsでPrismaマイグレーションの本番環境へのデプロイを自動化する

2023/04/13に公開

どんなときに何をしたいのか

Prismaを使ったプロジェクトでデータベースの定義を変更したとき、マイグレーションを作成したあと本番環境にデプロイする操作を自動化したい。

どのようにするのか

開発/本番環境の構成は下図の通り。

  • 開発環境でマイグレーションを行いSQLを作成する。それを本番環境に反映する。
  • GitHub Actionsを使って、リモートリポジトリへのpush時に自動でマイグレーションをデプロイする。
  • ただし、以下に注意する。
    • mainブランチへのpush時だけデプロイする。開発ブランチへのpush時は何もしない。
    • 新規のマイグレーションファイルがあるときだけデプロイする。
    • 手動でもデプロイできるようにする。

やってみよう

以下を実施する。

  • 環境構築(構築済ならスキップ)
  • Prismaプロジェクトの作成(作成済ならスキップ)
  • GitHub Actions ワークフローの作成
  • 動作確認

全手順を実施した結果が以下のリポジトリ。

https://github.com/pb10005/prisma-migration-automated

環境構築

  1. 以下記事の1〜4を実施する。

https://zenn.dev/ninjin_umigame/articles/8b12b2997db6bf

  1. 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:
  1. コンテナを起動する。
shell
docker compose up -d
  1. よく使うコマンドはaliasを設定しておく。
setup.sh
alias yarn="docker compose run -v ${PWD}:${PWD} node yarn"
alias npx="docker compose run -v ${PWD}:${PWD} node npx"

Prismaプロジェクトの作成

  1. Prismaのチュートリアルに従ってPrismaを使えるようにする。npmyarnに読み替えているのは好み。

https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgres

shell
. setup.sh 
yarn init -y
yarn add -D prisma typescript ts-node @types/node
npx tsc --init
yarn prisma init
  1. スキーマを編集する。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
}
  1. 環境変数DATABASE_URLは2で定義した接続情報に対応して設定する。
.env
DATABASE_URL="postgresql://username:password@postgres:5432/app"
  1. マイグレーションを行う。
shell
yarn prisma migrate dev --name init

GitHub Actions ワークフローの作成

参考にした手順は以下の通り。

https://blog.henriktech.com/deploying-prisma-migrations-via-github-actions

  1. .github/workflowsディレクトリを作成して、その配下にmigration.ymlファイルを作成する。
  2. 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 }}
  1. GitHubにリポジトリを作成する。

動作確認

  1. Postgresの本番環境を作成する。[1]
  2. migration.ymlが参照しているsecretsをここで設定する。リポジトリのSettings->Secrets and Variables->Actionsに移動して、Repository secretsの変数PROD_DATABASE_URLに本番環境の接続用URLを設定する。
  3. prisma.schemaを編集する。bioというカラムを新たに追加する。
prisma.schema
model User {
  id      Int      @id @default(autoincrement())
  name    String
  bio     String // 追加
}
  1. 開発環境でマイグレーションを行う。
shell
yarn prisma migrate dev --name add-column
  1. 変更をcommitしてGitHubにpushする。
  2. ワークフローが実行されて、完了することを確認する。本番環境にUserテーブル(bioカラム追加済み)が作成されている。

終わり!

お疲れさまでした!

脚注
  1. 筆者はRailwayで作成 ↩︎

Discussion