最近、趣味アプリ用に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名とします。
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
です。
まとめ
これで開発が楽しくなりそう!