こんにちは、ミツバです。
今回はタイトル通り、ブランチ切り変え時に新しくDBを作成して向き先を変更ようにします。
前提
- Rails4
- mysql
.git/hooks/post-checkoutを作成
こちらを利用したいプロジェクトに配置します。
#!/bin/bash
# エラーになった時点で終了
set -e
readonly PREV_HEAD=$1
readonly CURRENT_HEAD=$2
readonly CHECKOUT_TYPE=$3
# ファイルのチェックアウトの場合はここで終了
if [ ${CHECKOUT_TYPE} -eq 0 ]; then
exit 0
fi
# 同じコミットを指しているとブランチ名はどちらも同じになる
# ブランチ名に含まれるスラッシュはハイフンに置き換え
readonly PREV_BRANCH_NAME=$(git name-rev --name-only ${PREV_HEAD} | sed "s#/#_#g")
readonly CURRENT_BRANCH_NAME=$(git name-rev --name-only ${CURRENT_HEAD} | sed "s#/#_#g")
echo "prev branch: $PREV_BRANCH_NAME"
echo "current branch: $CURRENT_BRANCH_NAME"
dump() {
# create dir
if [ ! -d $HOME/dump ]; then
mkdir $HOME/dump
fi
# create dump file
if [ ! -f $HOME/dump/$1.sql ]; then
mysqldump -h 0.0.0.0 --skip-lock-tables --single-transactio --user=<user_name> --password=<password> -B $1 -r $HOME/dump/$1.sql
fi
}
setup() {
readonly NEW_DB_NAME=$(echo "$1_${CURRENT_BRANCH_NAME}" | sed "s#-#_#g")
echo "exists check: $(mysql -h 0.0.0.0 --user=<user_name> --password=<password> -e 'show databases;' | grep $NEW_DB_NAME)"
# dbの存在check
if [ -z $(mysql -h 0.0.0.0 --user=<user_name> --password=<password> -e 'show databases;' | grep $NEW_DB_NAME) ] ;then
mysql -h 0.0.0.0 --user=<user_name> --password=<password> < <(sed "s/$2/${NEW_DB_NAME}/g" $HOME/dump/$2.sql)
# direnvでは変更されなかったので、直に変更する
DB_NAME=$NEW_DB_NAME
echo "target database: $DB_NAME"
bundle ex rake db:seed
fi
}
dump ${DEVELOPMENT_DB_NAME}
setup "prefix" ${DEVELOPMENT_DB_NAME}
direnv reload
exit 0
direnv editで環境変数を設定
以下のように設定しておきます。
BRANCH_NAME=$(git branch | grep \* | cut -d ' ' -f2 | sed 's/-/_/g')
export DB_NAME=$(if [ $BRANCH_NAME = "develop" ]; then echo 'development_db' ;else echo $BRANCH_NAME ;fi)
export DEVELOPMENT_DB_NAME=development_db
あとは chmod +x <file_name>
で実行できるようにして、 checkoutするだけ。
所感
使用感としては良さげなのですが、git checkout -bとかでブランチ移動した時に挙動が変になったりしてしまいます。
そこらへんを上手いこと解決できたら最高っぽいなぁと感じます。
後、よくわかっていないのですが、database nameに -
は入れてはいけないっぽかったので全部 _
に直すようにしました。
他にも良さそうなのがあったら教えてください🙏
懸念点
database増えすぎる問題
ありすぎるので定期的にdatabase全消し祭を行なってください。
参考
post-checkoutフックを使ってブランチ切り替え時にちょっとだけ自動でDB環境をセットアップできるようにした - Septeni Engineer's Blog