最近、趣味アプリ用にCloudSQLでSQLのサーバを作成しました。
そこで、SQLのマイグレーションを自動化するべくGitHubのリポジトリで操作しようと思います。
以下の記事を参考にしました。
作成したリポジトリは以下です。
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
このスクリプトの環境変数は.env
にMYSQL_USER
とMYSQL_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
です。
まとめ
これで開発が楽しくなりそう!