MySQLのテーブルをGitHubリポジトリで操作する

最近、趣味アプリ用にCloudSQLでSQLのサーバを作成しました。

そこで、SQLマイグレーションを自動化するべくGitHubリポジトリで操作しようと思います。

以下の記事を参考にしました。

blog.fukkatsuso.com

作成したリポジトリは以下です。

github.com

CloudSQLに接続できるようにする

gcr.io/cloudsql-docker/gce-proxyを使用してDocker経由でCloudSQLに接続します。

公式ドキュメントにはdocker runを使用していますが、私はdocker-composeを推しているのでこちらで実行できるようにします。

version: "3"

services:
  datastore:
    image: gcr.io/cloudsql-docker/gce-proxy
    ports:
      - "127.0.0.1:3306:3306"
    volumes:
      - ./config/:/config
    command:
      [
        "/cloud_sql_proxy",
        "-instances=$CLOUDSQL_INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:3306",
        "-credential_file=/config/sa_key.json"
      ]

設定として、.config/sa_key.jsonにサービスアカウントキーを置きます。 また、リポジトリのルートに.envを作成しCLOUDSQL_INSTANCE_CONNECTION_NAMEを設定します。 この値はCloudSQLの「接続名」を入れます。

これで、docker-compose up -dを実行することでMySQLに接続ができます。

マイグレーション

今回、このMySQLは複数のアプリケーションで使用することを想定しています。そのため、データベースを複数作成したいという話題があります。そのため、ディレクトリでデータベースを分けられるような設定を追加します。

db/**ディレクトリ名 = DB名とします。

#!/bin/bash

FILES="db/*"

source ./.env

for DATABASE_PATH in $FILES; do

  DATABASE=${DATABASE_PATH##*/}
  echo "------- Migration DB: ${DATABASE} -------"

  MYSQL_DSN="mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(127.0.0.1:3306)/${DATABASE}"

  migrate -path "${DATABASE_PATH}" -database "${MYSQL_DSN}" up

done

このスクリプト環境変数.envMYSQL_USERMYSQL_PASSWORDを設定します。 これで、このスクリプトを走らせることでマイグレーションができます。

マイグレーションを実行する

テーブルを作成していない場合は直接CREATE DATABASEしましょう。

migrate create -ext sql -dir ./db/[table name] [migrate operation name]

を実行してファイルを作成し、作成された.sqlファイルにマイグレーションするクエリを追加します。 上のスクリプトを実行してマイグレーションを実行します。

Github Actionsに設定する

今回の話題はこれです。 GitHub Actionsに設定し、mainブランチにpushされかつdb/**が変更された場合に走らせます。

name: Migration

on:
  push:
    branches:
      - main
    paths:
      - './db/**'
  workflow_dispatch:

jobs:
  migrate-db:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      
      - name: Setup Env
        run: |
          echo "CLOUDSQL_INSTANCE_CONNECTION_NAME=${{ secrets.CLOUDSQL_CONNECTION_NAME }}" > .env
          echo "MYSQL_USER=${{ secrets.MYSQL_USER }}" >> .env
          echo "MYSQL_PASSWORD='${{ secrets.MYSQL_PASSWORD }}'" >> .env
          echo '${{ secrets.GCP_SA_KEY }}' > ./config/sa_key.json
      - name: Start Cloud SQL Proxy
        run: |
          docker-compose up -d
      - name: Install migrate
        run: |
          curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add -
          echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/migrate.list
          sudo apt-get update
          sudo apt-get install -y migrate
      - name: Migrate DB (up)
        run: ./scripts/migrations.sh

Githubで設定するsecretは、

  • CLOUDSQL_CONNECTION_NAME
  • MYSQL_USER
  • MYSQL_PASSWORD
  • GCP_SA_KEY

です。

まとめ

これで開発が楽しくなりそう!