Posted at

post-checkout + direnvでブランチ切り変え時に新しくDBを作成して、向き先を変更する

こんにちは、ミツバです。

今回はタイトル通り、ブランチ切り変え時に新しく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